Initial commit 15/1615/1 1.0 1.0_branch accepted/trunk/20120904.195459 submit/trunk/20120904.195134
authorGraydon, Tracy <tracy.graydon@intel.com>
Tue, 4 Sep 2012 19:51:25 +0000 (12:51 -0700)
committerGraydon, Tracy <tracy.graydon@intel.com>
Tue, 4 Sep 2012 19:51:25 +0000 (12:51 -0700)
264 files changed:
COPYING [new file with mode: 0644]
ChangeLog [new file with mode: 0644]
FILES [new file with mode: 0644]
Makefile.comm.in [new file with mode: 0644]
Makefile.in [new file with mode: 0644]
Makefile.lib.CC [new file with mode: 0644]
Makefile.lib.in [new file with mode: 0644]
Makefile.lib.sun [new file with mode: 0644]
Makefile.prog.in [new file with mode: 0644]
Makefile.wat [new file with mode: 0644]
NEWS [new file with mode: 0644]
README [new file with mode: 0644]
SP.dsw [new file with mode: 0644]
SP.mak [new file with mode: 0644]
VERSION [new file with mode: 0644]
all/README [new file with mode: 0644]
all/all.dsp [new file with mode: 0644]
build-win32.bat [new file with mode: 0755]
config/aclocal.m4 [new file with mode: 0644]
config/config.guess [new file with mode: 0755]
config/config.sub [new file with mode: 0755]
config/configure.in [new file with mode: 0644]
config/install-sh [new file with mode: 0755]
config/ltmain.sh [new file with mode: 0644]
config/missing [new file with mode: 0644]
config/mkinstalldirs [new file with mode: 0644]
configure [new file with mode: 0755]
contrib/README [new file with mode: 0644]
contrib/catalog [new file with mode: 0644]
contrib/rtf2doc.pl [new file with mode: 0644]
contrib/transform.dsl [new file with mode: 0644]
develdoc/jadedoc.sgml [new file with mode: 0644]
develdoc/missing [new file with mode: 0644]
doc/Makefile [new file with mode: 0644]
doc/archform.htm [new file with mode: 0644]
doc/build.htm [new file with mode: 0644]
doc/catalog [new file with mode: 0644]
doc/catalog.htm [new file with mode: 0644]
doc/charset.htm [new file with mode: 0644]
doc/features.htm [new file with mode: 0644]
doc/generic.htm [new file with mode: 0644]
doc/ideas.htm [new file with mode: 0644]
doc/index.htm [new file with mode: 0644]
doc/new.htm [new file with mode: 0644]
doc/nsgmls.htm [new file with mode: 0644]
doc/sgmldecl.htm [new file with mode: 0644]
doc/sgmlnorm.htm [new file with mode: 0644]
doc/sgmlsout.htm [new file with mode: 0644]
doc/spam.htm [new file with mode: 0644]
doc/spent.htm [new file with mode: 0644]
doc/sx.htm [new file with mode: 0644]
doc/sysdecl.htm [new file with mode: 0644]
doc/sysid.htm [new file with mode: 0644]
doc/xml.htm [new file with mode: 0644]
docsrc/.cvsignore [new file with mode: 0644]
docsrc/Makefile [new file with mode: 0644]
docsrc/jade.1 [new file with mode: 0644]
docsrc/jadetex.cfg [new file with mode: 0644]
docsrc/logo.png [new file with mode: 0644]
docsrc/nsgmls.1 [new file with mode: 0644]
docsrc/openjade.1 [new file with mode: 0644]
docsrc/openjade.xml [new file with mode: 0644]
docsrc/releasenotes.dsl [new file with mode: 0644]
docsrc/releasenotes.xml [new file with mode: 0644]
docsrc/sgmlnorm.1 [new file with mode: 0644]
docsrc/spam.1 [new file with mode: 0644]
docsrc/spent.1 [new file with mode: 0644]
docsrc/sx.1 [new file with mode: 0644]
dsssl/README.jadetex [new file with mode: 0644]
dsssl/builtins.dsl [new file with mode: 0644]
dsssl/catalog [new file with mode: 0644]
dsssl/demo.dsl [new file with mode: 0644]
dsssl/demo.sgm [new file with mode: 0644]
dsssl/dsssl.dtd [new file with mode: 0644]
dsssl/extensions.dsl [new file with mode: 0644]
dsssl/fot.dtd [new file with mode: 0644]
dsssl/style-sheet.dtd [new file with mode: 0644]
generic/EventGenerator.h [new file with mode: 0644]
generic/ParserEventGeneratorKit.h [new file with mode: 0644]
generic/SGMLApplication.h [new file with mode: 0644]
grove/LocNode.cxx [new file with mode: 0644]
grove/LocNode.h [new file with mode: 0644]
grove/Makefile.sub [new file with mode: 0644]
grove/Node.cxx [new file with mode: 0644]
grove/Node.h [new file with mode: 0644]
grove/grove.dsp [new file with mode: 0644]
groveoa/CGroveBuilder.cxx [new file with mode: 0644]
groveoa/CGroveBuilder.h [new file with mode: 0644]
groveoa/GroveBuilder.rgs [new file with mode: 0644]
groveoa/GroveNode.cxx [new file with mode: 0644]
groveoa/GroveNode.h [new file with mode: 0644]
groveoa/StdAfx.cxx [new file with mode: 0644]
groveoa/StdAfx.h [new file with mode: 0644]
groveoa/groveoa.cxx [new file with mode: 0644]
groveoa/groveoa.def [new file with mode: 0644]
groveoa/groveoa.dsp [new file with mode: 0644]
groveoa/groveoa.idl [new file with mode: 0644]
groveoa/groveoa.rc [new file with mode: 0644]
groveoa/resource.h [new file with mode: 0644]
include/config.h.in [new file with mode: 0644]
include/dsssl_ns.h [new file with mode: 0644]
instmac.pl [new file with mode: 0755]
jade-generate.mak [new file with mode: 0644]
jade.dsw [new file with mode: 0644]
jade.mak [new file with mode: 0644]
jade/HtmlFOTBuilder.cxx [new file with mode: 0644]
jade/HtmlFOTBuilder.h [new file with mode: 0644]
jade/HtmlFOTBuilder_inst.m4 [new file with mode: 0644]
jade/HtmlMessages.msg [new file with mode: 0644]
jade/JadeMessages.msg [new file with mode: 0644]
jade/Makefile.sub [new file with mode: 0644]
jade/MifFOTBuilder.cxx [new file with mode: 0644]
jade/MifFOTBuilder.h [new file with mode: 0644]
jade/MifFOTBuilder_inst.m4 [new file with mode: 0644]
jade/MifMessages.msg [new file with mode: 0644]
jade/RtfFOTBuilder.cxx [new file with mode: 0644]
jade/RtfFOTBuilder.h [new file with mode: 0644]
jade/RtfFOTBuilder_inst.m4 [new file with mode: 0644]
jade/RtfMessages.msg [new file with mode: 0644]
jade/RtfOle.cxx [new file with mode: 0644]
jade/RtfOle.h [new file with mode: 0644]
jade/SgmlFOTBuilder.cxx [new file with mode: 0644]
jade/SgmlFOTBuilder.h [new file with mode: 0644]
jade/TeXFOTBuilder.cxx [new file with mode: 0644]
jade/TeXFOTBuilder.h [new file with mode: 0644]
jade/TeXFOTBuilder_inst.m4 [new file with mode: 0644]
jade/TeXMessages.msg [new file with mode: 0644]
jade/TmpOutputByteStream.h [new file with mode: 0644]
jade/TransformFOTBuilder.cxx [new file with mode: 0644]
jade/TransformFOTBuilder.h [new file with mode: 0644]
jade/TransformFOTBuilder_inst.m4 [new file with mode: 0644]
jade/jade.cxx [new file with mode: 0644]
jade/jade.dsp [new file with mode: 0644]
jade/jade.rc [new file with mode: 0644]
jadedist/bin-files.txt [new file with mode: 0644]
jadedist/files.txt [new file with mode: 0644]
jadedist/jadedist.dsp [new file with mode: 0644]
jadedist/makedist.bat [new file with mode: 0644]
jadedoc/autoconf.htm [new file with mode: 0644]
jadedoc/contributors.htm [new file with mode: 0644]
jadedoc/copying.txt [new file with mode: 0644]
jadedoc/dsssl2.htm [new file with mode: 0644]
jadedoc/images/background.gif [new file with mode: 0644]
jadedoc/images/dsssltitle.gif [new file with mode: 0644]
jadedoc/images/space.gif [new file with mode: 0644]
jadedoc/images/top-of-page.gif [new file with mode: 0644]
jadedoc/index.htm [new file with mode: 0644]
jadedoc/mif.htm [new file with mode: 0644]
jadedoc/rtf.htm [new file with mode: 0644]
jadedoc/tex.htm [new file with mode: 0644]
jadedoc/transform.htm [new file with mode: 0644]
jadedoc/xmlfo.htm [new file with mode: 0644]
japan.sgmldecl [new file with mode: 0644]
msggen.pl [new file with mode: 0644]
openjade-1.3.2.tar.gz [new file with mode: 0644]
pubtext/HTML32.dcl [new file with mode: 0644]
pubtext/HTML32.dtd [new file with mode: 0644]
pubtext/HTML32.soc [new file with mode: 0644]
pubtext/HTML4-f.dtd [new file with mode: 0644]
pubtext/HTML4-s.dtd [new file with mode: 0644]
pubtext/HTML4.dcl [new file with mode: 0644]
pubtext/HTML4.dtd [new file with mode: 0644]
pubtext/HTML4.soc [new file with mode: 0644]
pubtext/HTMLlat1.ent [new file with mode: 0644]
pubtext/HTMLspec.ent [new file with mode: 0644]
pubtext/HTMLsym.ent [new file with mode: 0644]
pubtext/ISOlat1.ent [new file with mode: 0644]
pubtext/ISOlat1.sgm [new file with mode: 0644]
pubtext/html-1.dtd [new file with mode: 0644]
pubtext/html-1s.dtd [new file with mode: 0644]
pubtext/html-s.dtd [new file with mode: 0644]
pubtext/html.dcl [new file with mode: 0644]
pubtext/html.dtd [new file with mode: 0644]
pubtext/html.soc [new file with mode: 0644]
pubtext/xml.dcl [new file with mode: 0644]
pubtext/xml.soc [new file with mode: 0644]
releasenotes.html [new file with mode: 0644]
releasenotes.pdf [new file with mode: 0644]
releasenotes.ps [new file with mode: 0644]
sp-generate.mak [new file with mode: 0644]
spgrove/GroveApp.cxx [new file with mode: 0644]
spgrove/GroveApp.h [new file with mode: 0644]
spgrove/GroveBuilder.cxx [new file with mode: 0644]
spgrove/GroveBuilder.h [new file with mode: 0644]
spgrove/Makefile.sub [new file with mode: 0644]
spgrove/SdNode.cxx [new file with mode: 0644]
spgrove/SdNode.h [new file with mode: 0644]
spgrove/grove_inst.m4 [new file with mode: 0644]
spgrove/spgrove.dsp [new file with mode: 0644]
spgrove/threads.h [new file with mode: 0644]
style/Collector.cxx [new file with mode: 0644]
style/Collector.h [new file with mode: 0644]
style/DssslApp.cxx [new file with mode: 0644]
style/DssslApp.h [new file with mode: 0644]
style/DssslAppMessages.msg [new file with mode: 0644]
style/DssslSpecEventHandler.cxx [new file with mode: 0644]
style/DssslSpecEventHandler.h [new file with mode: 0644]
style/ELObj.cxx [new file with mode: 0644]
style/ELObj.h [new file with mode: 0644]
style/ELObjMessageArg.cxx [new file with mode: 0644]
style/ELObjMessageArg.h [new file with mode: 0644]
style/ELObjPropVal.h [new file with mode: 0644]
style/EvalContext.h [new file with mode: 0644]
style/Expression.cxx [new file with mode: 0644]
style/Expression.h [new file with mode: 0644]
style/FOTBuilder.cxx [new file with mode: 0644]
style/FOTBuilder.h [new file with mode: 0644]
style/FlowObj.cxx [new file with mode: 0644]
style/FlowObj_inst.m4 [new file with mode: 0644]
style/GroveManager.cxx [new file with mode: 0644]
style/GroveManager.h [new file with mode: 0644]
style/InheritedC.cxx [new file with mode: 0644]
style/Insn.cxx [new file with mode: 0644]
style/Insn.h [new file with mode: 0644]
style/Insn2.h [new file with mode: 0644]
style/Interpreter.cxx [new file with mode: 0644]
style/Interpreter.h [new file with mode: 0644]
style/InterpreterMessages.msg [new file with mode: 0644]
style/LangObj.cxx [new file with mode: 0644]
style/LangObj.h [new file with mode: 0644]
style/MacroFlowObj.cxx [new file with mode: 0644]
style/MacroFlowObj.h [new file with mode: 0644]
style/Makefile.sub [new file with mode: 0644]
style/MessageModule.cxx [new file with mode: 0644]
style/NumberCache.cxx [new file with mode: 0644]
style/NumberCache.h [new file with mode: 0644]
style/Pattern.cxx [new file with mode: 0644]
style/Pattern.h [new file with mode: 0644]
style/ProcessContext.cxx [new file with mode: 0644]
style/ProcessContext.h [new file with mode: 0644]
style/ProcessingMode.cxx [new file with mode: 0644]
style/ProcessingMode.h [new file with mode: 0644]
style/SchemeParser.cxx [new file with mode: 0644]
style/SchemeParser.h [new file with mode: 0644]
style/SosofoObj.h [new file with mode: 0644]
style/Style.cxx [new file with mode: 0644]
style/Style.h [new file with mode: 0644]
style/StyleEngine.cxx [new file with mode: 0644]
style/StyleEngine.h [new file with mode: 0644]
style/VM.h [new file with mode: 0644]
style/charNames.h [new file with mode: 0644]
style/charProps.h [new file with mode: 0644]
style/common_inst.m4 [new file with mode: 0644]
style/dsssl_ns.h [new file with mode: 0644]
style/jade_version.h [new file with mode: 0644]
style/primitive.cxx [new file with mode: 0644]
style/primitive.h [new file with mode: 0644]
style/primitive_inst.m4 [new file with mode: 0644]
style/sdata.h [new file with mode: 0644]
style/style.dsp [new file with mode: 0644]
style/style_inst.m4 [new file with mode: 0644]
style/style_pch.h [new file with mode: 0644]
style/stylelib.cxx [new file with mode: 0644]
style/stylelib.h [new file with mode: 0644]
sunfix.sh [new file with mode: 0644]
testsuite/Makefile [new file with mode: 0644]
testsuite/expr-lang.dsl [new file with mode: 0644]
testsuite/expr-lang.expected [new file with mode: 0644]
testsuite/null.sgml [new file with mode: 0644]
unicode/catalog [new file with mode: 0644]
unicode/demo.sgm [new file with mode: 0644]
unicode/gensyntax.pl [new file with mode: 0644]
unicode/unicode.sd [new file with mode: 0644]
unicode/unicode.syn [new file with mode: 0644]

diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..179f0c5
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,25 @@
+Copyright (c) 1994, 1995, 1996, 1997, 1998 James Clark
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+``Software''), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL JAMES CLARK BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of James Clark shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from James Clark.
diff --git a/ChangeLog b/ChangeLog
new file mode 100644 (file)
index 0000000..a52cdbd
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,1815 @@
+2002-12-01 14:55  icastle
+
+       * jade/TransformFOTBuilder.cxx: XML backend doesn't quote "&" in
+       attribute values
+       
+       Ref: Toby Speight, Debian Bug 147073
+
+2002-12-01 11:56  icastle
+
+       * Makefile.comm.in: Make find OpenSP include files more robust
+       
+       Make sure that files included from OpenSP can in turn also include
+       files from OpenSP - without the OpenSP files being in a standard
+       include directory.
+       
+       Of course this is hack that will disappear in due course.
+
+2002-12-01 11:53  icastle
+
+       * config/configure.in: Improved support for configuration on PPC64
+       architecture
+       
+       On PPC64 libosp is to be found in /usr/lib64 - so make sure we use
+       this directory.
+       
+       Ref: Karl Eichwalder, email to openjade-devel list.
+
+2002-12-01 11:43  icastle
+
+       * dsssl/builtins.dsl: SGML Property Operations - typo in definition
+       
+       Correct the implementation of ISO/IEC 10179:1996 section 10.2.5
+       SGML Property Operations (attribute string nl).
+       
+       Ref: Toby Speight, Debian Bug 145242: "attribute" builtin
+       misdefined
+
+2002-11-16 18:27  icastle
+
+       * configure, config/configure.in: Correct speling misteak
+
+2002-11-16 18:01  icastle
+
+       * configure, grove/Node.cxx, include/config.h.in,
+       spgrove/GroveBuilder.cxx: Get rid of warnings.
+       
+       Fix compilation warnings. Gcc 3.x (and RH 2.96) don't like pasting
+       tokens after "::".  Make GroveImpl's destructor public...  Make
+       config.h a bit happier about swallowing OpenSP's config.h
+
+2002-11-16 08:33  icastle
+
+       * config/configure.in: Make checking for location of libosp and
+       include file more flexible and robust
+
+2002-11-15 22:46  icastle
+
+       * jade/Makefile.sub, spgrove/Makefile.sub, style/Makefile.sub:
+       libosp is now elsewhere; and let libtool take the strain of trying
+       to find all the libraries
+
+2002-11-15 18:08  icastle
+
+       * config/configure.in, include/config.h.in: Make sure that openjade
+       config info is in sync with opensp
+
+2002-10-20 22:57  icastle
+
+       * Makefile.comm.in, instmac.pl, lib/instmac.pl: instmac.pl can't be
+       in lib - because there isn't really one now!
+
+2002-10-20 22:47  icastle
+
+       * include/config.h.in: file config.h.in was initially added on
+       branch RELEASE-1_3.
+
+2002-10-20 22:47  icastle
+
+       * include/dsssl_ns.h: file dsssl_ns.h was initially added on branch
+       RELEASE-1_3.
+
+2002-10-20 22:47  icastle
+
+       * Makefile.comm.in, Makefile.in, NEWS, README, RELEASE, VERSION,
+       configure, msggen.pl, config/configure.in, docsrc/releasenotes.xml,
+       grove/Makefile.sub, grove/Node.h, include/Allocator.h,
+       include/ArcEngine.h, include/Attribute.h, include/Attributed.h,
+       include/Big5CodingSystem.h, include/Boolean.h, include/CharMap.cxx,
+       include/CharMap.h, include/CharsetDecl.h, include/CharsetInfo.h,
+       include/CharsetRegistry.h, include/CmdLineApp.h,
+       include/CodingSystem.h, include/CodingSystemKit.h,
+       include/ConsoleOutput.h, include/ContentState.h,
+       include/ContentToken.h, include/CopyOwner.cxx, include/CopyOwner.h,
+       include/DescriptorManager.h, include/Dtd.h,
+       include/EUCJPCodingSystem.h, include/ElementType.h,
+       include/Entity.h, include/EntityApp.h, include/EntityCatalog.h,
+       include/EntityDecl.h, include/EntityManager.h,
+       include/ErrnoMessageArg.h, include/ErrorCountEventHandler.h,
+       include/Event.h, include/EventsWanted.h,
+       include/ExtendEntityManager.h, include/ExternalId.h,
+       include/Fixed2CodingSystem.h, include/GenericEventHandler.h,
+       include/Hash.h, include/HashTable.cxx, include/HashTable.h,
+       include/HashTableItemBase.cxx, include/HashTableItemBase.h,
+       include/IList.h, include/IListBase.h, include/IListIter.h,
+       include/IListIterBase.h, include/IQueue.cxx, include/IQueue.h,
+       include/ISet.cxx, include/ISet.h, include/ISetIter.h,
+       include/IdentityCodingSystem.h, include/InputSource.h,
+       include/InternalInputSource.h, include/Link.h,
+       include/LinkProcess.h, include/List.cxx, include/List.h,
+       include/ListIter.h, include/LiteralStorage.h, include/Location.h,
+       include/Lpd.h, include/Markup.h, include/Message.h,
+       include/MessageArg.h, include/MessageBuilder.h,
+       include/MessageEventHandler.h, include/MessageFormatter.h,
+       include/MessageReporter.h, include/MessageTable.h, include/Mode.h,
+       include/NCVector.h, include/NCVector.sed, include/Named.h,
+       include/NamedResource.h, include/NamedResourceTable.h,
+       include/NamedTable.h, include/Notation.h,
+       include/NotationStorage.h, include/OpenElement.h,
+       include/Options.cxx, include/Options.h, include/OutputByteStream.h,
+       include/OutputCharStream.h, include/Owner.cxx, include/Owner.h,
+       include/OwnerTable.cxx, include/OwnerTable.h, include/ParserApp.h,
+       include/ParserOptions.h, include/PointerTable.cxx,
+       include/PointerTable.h, include/PosixStorage.h, include/Ptr.cxx,
+       include/Ptr.h, include/RangeMap.cxx, include/RangeMap.h,
+       include/Resource.h, include/RewindStorageObject.h,
+       include/SJISCodingSystem.h, include/SOEntityCatalog.h,
+       include/Sd.h, include/SdText.h, include/SearchResultMessageArg.h,
+       include/SgmlParser.h, include/ShortReferenceMap.h,
+       include/StdioStorage.h, include/StorageManager.h,
+       include/StringC.h, include/StringOf.cxx, include/StringOf.h,
+       include/StringResource.h, include/SubstTable.cxx,
+       include/SubstTable.h, include/Syntax.h, include/Text.h,
+       include/TranslateCodingSystem.h, include/TypeId.h,
+       include/URLStorage.h, include/UTF8CodingSystem.h,
+       include/UnicodeCodingSystem.h, include/UnivCharsetDesc.h,
+       include/Vector.cxx, include/Vector.h, include/Win32CodingSystem.h,
+       include/WinApp.h, include/WinInetStorage.h,
+       include/XMLCodingSystem.h, include/XcharMap.cxx,
+       include/XcharMap.h, include/config.h, include/config.h.in,
+       include/constant.h, include/dsssl_ns.h, include/macros.h,
+       include/rtti.h, include/sptchar.h, include/types.h, include/xnew.h,
+       jade/Makefile.sub, jade/SgmlFOTBuilder.cxx,
+       spgrove/GroveBuilder.cxx, spgrove/Makefile.sub, style/DssslApp.cxx,
+       style/DssslAppMessages.msg, style/DssslSpecEventHandler.cxx,
+       style/DssslSpecEventHandler.h, style/Makefile.sub,
+       style/MessageModule.cxx: Allow openjade to be built against the
+       standalone, independent opensp (currently 1.5).
+       
+       Note two extract options to configure
+       
+       --spincludedir=<path to OpenSP include directory> --splibdir=<path
+       to OpenSP library directory>
+       
+       These default to /usr/include/OpenSP and /usr/lib because that is
+       where they are on my system.
+
+2002-03-20 11:01  icastle
+
+       * style/MessageModule.cxx: Tidy up jades use of the  new opensp
+       modular message functions. Add some .cvsignore entries for clarity
+
+2002-03-13 12:21  icastle
+
+       * NEWS, RELEASE, config/configure.in, jade/MifFOTBuilder.cxx,
+       style/SchemeParser.cxx, style/jade_version.h, style/primitive.cxx,
+       testsuite/Makefile, testsuite/expr-lang.dsl,
+       testsuite/expr-lang.expected: Merge with old jade_1_3_branch. A
+       couple of fixes to the MIF backend, some minor bug fixes and small
+       updates to the testsuite.
+       
+       Called this openjade 1.3.2
+
+2002-01-25 15:34  icastle
+
+       * docsrc/releasenotes.xml: Minor corrections (SuSE build
+       information + some typos)
+
+2002-01-24 18:30  icastle
+
+       * RELEASE, docsrc/Makefile, docsrc/releasenotes.xml: More final
+       changes
+
+2002-01-24 17:51  icastle
+
+       * ChangeLog: Update Changelog for release 1.3.1
+
+2002-01-24 17:48  icastle
+
+       * RELEASE: file RELEASE was initially added on branch RELEASE-1_3.
+
+2002-01-24 17:48  icastle
+
+       * docsrc/jadetex.cfg: file jadetex.cfg was initially added on
+       branch RELEASE-1_3.
+
+2002-01-24 17:48  icastle
+
+       * docsrc/logo.png: file logo.png was initially added on branch
+       RELEASE-1_3.
+
+2002-01-24 17:48  icastle
+
+       * NEWS, RELEASE, docsrc/.cvsignore, docsrc/Makefile,
+       docsrc/jadetex.cfg, docsrc/logo.png, docsrc/onsgmls.xml,
+       docsrc/openjade.xml, docsrc/osgmlnorm.xml, docsrc/ospam.xml,
+       docsrc/releasenotes.dsl, docsrc/releasenotes.xml: Final changes to
+       release notes and other documentation.
+
+2002-01-23 18:10  icastle
+
+       * docsrc/: .cvsignore, releasenotes.xml: More work on the
+       releasenotes
+
+2002-01-23 07:37  icastle
+
+       * docsrc/releasenotes.xml: More work on releasenotes
+
+2002-01-22 18:23  icastle
+
+       * ChangeLog, docsrc/onsgmls.xml, docsrc/openjade.xml,
+       docsrc/osgmlnorm.xml, docsrc/ospam.xml, docsrc/ospent.xml,
+       docsrc/osx.xml, docsrc/releasenotes.xml, style/jade_version.h: Save
+       work-in-progress. Mainly working on the release notes.  Set the
+       version to 1.3.1
+
+2002-01-22 11:57  icastle
+
+       * Makefile.lib.in, Makefile.prog.in, configure,
+       config/configure.in, include/config.h: Darwin/Mac OS X support
+       
+       Ref: Kogulé, Ryo
+       
+       Darwin / Mac OS X doesn't want "-fno-explicit-templates",
+       SP_DEFINE_TEMPLATES must be set and SP_MANUAL_INST must not.
+       
+       libtool linking requires "-no-undefined".
+
+2002-01-21 17:24  icastle
+
+       * docsrc/releasenotes.dsl: file releasenotes.dsl was initially
+       added on branch RELEASE-1_3.
+
+2002-01-21 17:24  icastle
+
+       * docsrc/: releasenotes.dsl, releasenotes.xml: Add skeleton for
+       release notes
+
+2002-01-21 17:24  icastle
+
+       * docsrc/releasenotes.xml: file releasenotes.xml was initially
+       added on branch RELEASE-1_3.
+
+2002-01-21 17:06  icastle
+
+       * Makefile.in: Add remaining man pages to the install-man target
+
+2002-01-21 16:56  icastle
+
+       * docsrc/: .cvsignore, Makefile, openjade.xml, osgmlnorm.xml,
+       ospam.xml, ospent.xml: More updates to man pages. Should be
+       finished now for 1.3.1
+
+2002-01-19 09:40  icastle
+
+       * configure: Make sure we have a valid configure in CVS.
+
+2002-01-19 09:38  icastle
+
+       * config/configure.in: AC_CONFIG_AUX_DIR was run to late for
+       AM_INIT_AUTOMAKE
+
+2002-01-19 09:16  icastle
+
+       * config/missing: file missing was initially added on branch
+       RELEASE-1_3.
+
+2002-01-19 09:16  icastle
+
+       * config/: install-sh, missing, mkinstalldirs: More
+       autoconf/automake work
+       
+       Forgot to add install-sh, missing and mkinstalldirs on last commit
+
+2002-01-19 09:16  icastle
+
+       * config/mkinstalldirs: file mkinstalldirs was initially added on
+       branch RELEASE-1_3.
+
+2002-01-18 23:17  icastle
+
+       * Makefile.comm.in, Makefile.in, Makefile.lib.in,
+       config/aclocal.m4, config/configure.in, config/install.sh: More
+       work on autoconf - introduce elements of automake
+       
+       Ref: Various bugs on source forge.
+       
+       The Makefiles/configure script was not as clever as it needed to
+       be.  Various people have reported a variety of problems (install
+       directories not being created etc).
+       
+       Incorporate some automake elements into the script... which should
+       make installation a bit more robust.
+       
+       Also added an "install-man" target to install the manpages.
+
+2002-01-18 23:14  icastle
+
+       * lib/UTF8CodingSystem.cxx: Accept Byte Order Marks as valid XML
+       
+       Ref: Source Forge #442560 (Terje Bless/Liam Quinn)
+       
+       Determination of Character Encoding of an XML file brought in line
+       with Second Edition XML 1.0 Specification (REC-xml-20001006) - Byte
+       Order Marks now accepted as valid XML.
+
+2002-01-18 23:06  icastle
+
+       * jade/TransformFOTBuilder.cxx: Fix missing white space problem in
+       processing instruction flow object
+       
+       Ref: Source Forge Bug #505113 and patch #505124 (Markus Hoenicka)
+       
+       No white space was emitted between the public-id and the system-id
+       causing a malformed xml file to be generated.
+       
+       This patch introduces a space between the elements
+
+2002-01-18 22:51  icastle
+
+       * docsrc/spent.1: file spent.1 was initially added on branch
+       RELEASE-1_3.
+
+2002-01-18 22:51  icastle
+
+       * docsrc/jade.1: file jade.1 was initially added on branch
+       RELEASE-1_3.
+
+2002-01-18 22:51  icastle
+
+       * docsrc/nsgmls.1: file nsgmls.1 was initially added on branch
+       RELEASE-1_3.
+
+2002-01-18 22:51  icastle
+
+       * docsrc/spam.1: file spam.1 was initially added on branch
+       RELEASE-1_3.
+
+2002-01-18 22:51  icastle
+
+       * docsrc/sgmlnorm.1: file sgmlnorm.1 was initially added on branch
+       RELEASE-1_3.
+
+2002-01-18 22:51  icastle
+
+       * docsrc/: .cvsignore, jade.1, nsgmls.1, openjade.xml, ospent.xml,
+       osx.xml, sgmlnorm.1, spam.1, spent.1, sx.1: More man page updates
+
+2002-01-18 22:51  icastle
+
+       * docsrc/ospent.xml: file ospent.xml was initially added on branch
+       RELEASE-1_3.
+
+2002-01-18 22:51  icastle
+
+       * docsrc/sx.1: file sx.1 was initially added on branch RELEASE-1_3.
+
+2002-01-17 18:40  icastle
+
+       * ChangeLog, configure, style/jade_version.h: Prepare for
+       openjade-1.3.1-pre4
+
+2002-01-17 18:37  icastle
+
+       * docsrc/: Makefile, openjade.xml: More man page updates
+
+2002-01-17 16:51  icastle
+
+       * config/aclocal.m4, config/configure.in, lib/parser_inst.m4:
+       Include re-worked version of RedHat's size_t patch
+       
+       Ref: redhat openjade-1.3-21
+       
+       Redhat's RPM contains a patch to provide a single #define to
+       determine if size_t is the same as unsigned int.
+       
+       This patch was only applied if the build architecture was s390 or
+       s390x.  However, I can't really see how this patch has a bearing on
+       the S/390.  And the patch didn't actually work with any GNU C++
+       compiler from 2.8 up to an including 3.0. The idea is quite good
+       though, so I've reworked the patch to make it work as it is
+       supposed to.
+       
+       Anyway, this may or may not have a bearing on S/390 support.
+
+2002-01-17 16:41  icastle
+
+       * docsrc/onsgmls.xml: file onsgmls.xml was initially added on
+       branch RELEASE-1_3.
+
+2002-01-17 16:41  icastle
+
+       * docsrc/Makefile: file Makefile was initially added on branch
+       RELEASE-1_3.
+
+2002-01-17 16:41  icastle
+
+       * docsrc/.cvsignore: file .cvsignore was initially added on branch
+       RELEASE-1_3.
+
+2002-01-17 16:41  icastle
+
+       * docsrc/osx.xml: file osx.xml was initially added on branch
+       RELEASE-1_3.
+
+2002-01-17 16:41  icastle
+
+       * docsrc/ospam.xml: file ospam.xml was initially added on branch
+       RELEASE-1_3.
+
+2002-01-17 16:41  icastle
+
+       * docsrc/openjade.xml: file openjade.xml was initially added on
+       branch RELEASE-1_3.
+
+2002-01-17 16:41  icastle
+
+       * docsrc/osgmlnorm.xml: file osgmlnorm.xml was initially added on
+       branch RELEASE-1_3.
+
+2002-01-17 16:41  icastle
+
+       * doc/onsgmls.xml, doc/osgmlnorm.xml, doc/ospam.xml,
+       docsrc/.cvsignore, docsrc/Makefile, docsrc/onsgmls.xml,
+       docsrc/openjade.xml, docsrc/osgmlnorm.xml, docsrc/ospam.xml,
+       docsrc/osx.xml, jadedoc/openjade.xml: Move source of documentation
+       to docsrc.
+       
+       Will place the published versions in doc, jadedoc, man or whatever
+       at release/build time
+
+2002-01-17 14:35  icastle
+
+       * include/config.h, spgrove/threads.h: MacOS X patches (fink)
+
+2002-01-17 13:52  icastle
+
+       * Makefile, Makefile.comm, Makefile.lib, Makefile.prog: Remove
+       files generated by ./configure
+
+2002-01-17 13:45  icastle
+
+       * Makefile, Makefile.comm, Makefile.comm.in, Makefile.in,
+       Makefile.lib, Makefile.lib.in, Makefile.prog, Makefile.prog.in,
+       configure, config/aclocal.m4, config/config.guess,
+       config/config.sub, config/configure.in, config/ltconfig,
+       config/ltmain.sh: Upgrade autoconf/libtool
+       
+       Ref:
+       
+       Update the autocof/libtool infrastructure.
+       
+       Use the latest config.sub/config/guess
+       
+       Use autoconf 2.52 and libtool 1.4.x
+       
+       Move the hack from configure to be a proper test for towupper in
+       configure.in.  Correct some complaints about smr_SWITCH being
+       passed the wrong number of arguments (which is what DUMMY is all
+       about).
+       
+       Create new aclocal.m4 and adjust various *.in files to use new
+       style libtool (the one without ltconfig).
+
+2002-01-17 13:36  icastle
+
+       * doc/osgmlnorm.xml: file osgmlnorm.xml was initially added on
+       branch RELEASE-1_3.
+
+2002-01-17 13:36  icastle
+
+       * doc/osgmlnorm.xml: Another man page
+
+2002-01-17 12:12  icastle
+
+       * testsuite/expr-lang.dsl: Make the stylesheet a valid one
+
+2002-01-17 12:11  icastle
+
+       * jadedoc/openjade.xml: Manual page for openjade(1)
+
+2002-01-17 12:11  icastle
+
+       * jadedoc/openjade.xml: file openjade.xml was initially added on
+       branch RELEASE-1_3.
+
+2002-01-17 12:09  icastle
+
+       * dsssl/README.jadetex: file README.jadetex was initially added on
+       branch RELEASE-1_3.
+
+2002-01-17 12:09  icastle
+
+       * dsssl/: ChangeLog, Makefile.jadetex, README.jadetex, demo.dsl,
+       demo.sgm, jadetex.dtx, jadetex.ini, jadetex.ins, pdfjadetex.ini,
+       unicode.sty: Make the demo actually work without errors
+       
+       Remove jadetex as it is now distributed seperately from openjade at
+       http://jadetex.sourceforge.net
+
+2002-01-16 17:39  icastle
+
+       * doc/ospam.xml: file ospam.xml was initially added on branch
+       RELEASE-1_3.
+
+2002-01-16 17:39  icastle
+
+       * doc/: onsgmls.xml, ospam.xml: More man pages
+
+2002-01-16 13:26  icastle
+
+       * doc/onsgmls.xml: file onsgmls.xml was initially added on branch
+       RELEASE-1_3.
+
+2002-01-16 13:26  icastle
+
+       * doc/: nsgmls.xml, onsgmls.xml: Really, the command should be
+       onsgmls because this is openjade. Renamed accordingly
+
+2002-01-16 08:28  icastle
+
+       * doc/nsgmls.xml: file nsgmls.xml was initially added on branch
+       RELEASE-1_3.
+
+2002-01-16 08:28  icastle
+
+       * doc/: nsgmls.xml, openjade.1: Far better to mark up the man pages
+       as XML/SGML.
+       
+       However, the best stylesheet for processing docbook refentries is
+       an XLST one... It would be nice to have DSSSL version, of course.
+
+2002-01-15 18:48  icastle
+
+       * style/jade_version.h: Prepare for openjade-1.3.1-pre3
+
+2002-01-15 18:36  icastle
+
+       * configure, lib/CmdLineApp.cxx, lib/lib.dsp, style/DssslApp.cxx,
+       style/Interpreter.cxx, style/LangObj.cxx, style/LangObj.h,
+       style/primitive.cxx, style/style.dsp: Support for BSD (freeBSD 4.4)
+       and MacOS X
+       
+       Ref: FreeBSD 4.4 patches + Fink patches
+       
+       This provides equivalent functionality to the freebsd 4.4 patch-aa
+       and patch-ab patches.
+       
+       However, the standard BSD patches simply clobber the build
+       environment - so if you use these, builds on other platforms break.
+       
+       The problem is that support for the POSIX locale in openjade
+       requires two things: setlocale, and reasonable wchar support.
+       FreeBSD 4.4 has setlocale support but is missing some wchar
+       functions that are required. (towupper for example).
+       
+       The best solution would be to rework the POSIX locale support so
+       that it will work with FreeBSD.
+       
+       However, I've made a simple hack:
+       
+       - Left the configure setlocale check in place - Added a new "wchar"
+       check (which tests for towupper).
+       
+       This defines an additional build parameters SP_HAVE_WCHAR. This is
+       simply applied with the same scope as SP_HAVE_SETLOCALE.
+       
+       This means that to get the locale support you must have an
+       environment where both these are set.
+       
+       The result is that all environments that worked before will still
+       work...
+       
+       I've directly edited configure rather than configure.in, but as it
+       is already impossible to generate configure from configure.in I
+       don't think this is too much of a problem.
+
+2002-01-15 18:29  icastle
+
+       * spgrove/GroveBuilder.cxx: Support for GCC version supplied with
+       MacOS X
+       
+       Ref: fink project
+       
+       Tidy up C++ a bit for MacOS X builds
+
+2002-01-15 18:28  icastle
+
+       * spgrove/Makefile.sub, style/Makefile.sub: Support for old
+       versions of libtool (1.3.x)
+       
+       Ref:
+       
+       FreeBSD 4.4 only has libtool 1.3 installed. Make sure this works as
+       well as libtool 1.4
+
+2002-01-15 15:31  icastle
+
+       * doc/openjade.1: file openjade.1 was initially added on branch
+       RELEASE-1_3.
+
+2002-01-15 15:31  icastle
+
+       * doc/openjade.1: First go at a manual page for openjade
+       
+       Info taken from the HTML
+
+2002-01-15 13:26  icastle
+
+       * ChangeLog: file ChangeLog was initially added on branch
+       RELEASE-1_3.
+
+2002-01-15 13:26  icastle
+
+       * ChangeLog: Add a ChangeLog. People like ChangeLogs
+
+2002-01-15 13:14  icastle
+
+       * style/jade_version.h: Prepare for 1.3.1-pre2
+
+2002-01-15 10:35  icastle
+
+       * jade/TeXFOTBuilder.cxx: Red Hat bugzilla # 31525
+       
+       Ref: https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=31525
+       
+       Work around to a problem with "special" characters in table of
+       contents
+       
+       This is not a real fix for the problem - but has been in use for a
+       while.  People have document collections which depend on this fix,
+       so while it is not perfect, it is probably expedient to include it.
+
+2002-01-14 16:30  icastle
+
+       * doc/build.htm, jade/TeXFOTBuilder.cxx, lib/lib.dsp: Fixes for
+       Win32 and Visual C++ 6.0
+       
+       Ref: Clive George, LOOK Systems
+       
+       VC++ 6.0 and below does not support static const int x = value
+       inside a class. Work around by using enum.
+       
+       Can't use precompiled header when header file is not included...
+       
+       Update the build instructions
+
+2002-01-14 08:55  icastle
+
+       * README: Update README
+       
+       Ref:
+       
+       James Clark probably doesn't want to know about bug reports
+       anymore.
+
+2002-01-14 08:54  icastle
+
+       * Makefile.in: Allow "libdir" to be specified by configure
+       
+       Ref: SuSe Linux 7.3
+
+2002-01-14 08:15  icastle
+
+       * Makefile.in, Makefile.lib.in, Makefile.prog.in: Add DESTDIR to
+       enable easier packaging
+       
+       Ref: SuSe Linux 7.3
+       
+       Add DESTDIR (defaults to nothing so that existing build/packaging
+       scripts are not affected) to Makefile.
+
+2002-01-14 07:29  icastle
+
+       * nsgmls/RastEventHandler.h, spgrove/GroveBuilder.cxx: GCC 3.1
+       support
+       
+       Ref: SuSe Linux 7.3 (Andreas Schwab)
+       
+       Suppress compiler complaints about inaccessible class "Messenger"
+
+2002-01-13 11:36  icastle
+
+       * config/configure.in: Support autoconf 2.52
+       
+       Ref: SuSe Linux 7.3 RPM (Andreas Schwab)
+       
+       Allow newer versions of autoconf to work with configure.in
+
+2002-01-12 09:13  icastle
+
+       * configure: Clean up "configure" to remove spurious "command not
+       found" error
+
+2002-01-12 09:11  icastle
+
+       * include/config.h: Support for GCC C++ 3.1 (new std namespace)
+
+2002-01-11 16:41  icastle
+
+       * style/jade_version.h: Make a 1.3.1-pre1 release for some wider
+       testing
+
+2002-01-11 15:55  icastle
+
+       * dsssl/extensions.dsl, jade/TeXFOTBuilder.cxx: Add support for
+       jadetex \TwoSideStartOnRight parameter
+       
+       Ref: sf.net/projects/openjade patch #439755
+
+2002-01-11 15:51  icastle
+
+       * jade/TeXFOTBuilder.cxx: Prevent tex output generating ligatures
+       when it shouldn't
+       
+       Ref: Redhat bugs #11497, #11779 openjade-1.3-ligature.patch
+
+2002-01-11 15:48  icastle
+
+       * dsssl/extensions.dsl, jade/TeXFOTBuilder.cxx,
+       jade/TeXFOTBuilder_inst.m4, style/ELObj.cxx, style/ELObj.h,
+       style/InterpreterMessages.msg, style/ProcessContext.cxx,
+       style/SosofoObj.h, style/primitive.cxx: Francis J. Lacoste's
+       feature and bug fixes
+       
+       Ref: http://iNdev.iNsu.COM/openjade/openjade-1.3.patch
+       
+       - Better (time<=?) support
+       
+         This fixes bugs in the time string support of OpenJade. It makes
+         it possible to compare time, date and datetime (not only
+       datetime).
+         Also partial format (like YY-MM-DD, YYYY-MM or HH:MM) are now
+       supported.
+       
+       - Optimization of sosofo-append
+       
+         This fix optimizes sosofo-append to reduce its memory and stack
+       usage when
+         using it to build long list of sosofo :
+            (let loop ( (res (empty-sosofo))
+                        (nl  (node-list-rest (children (current-node)))))
+               (loop (sosofo-append res (process-node-list
+       (node-list-first nl)))
+                     (node-list-rest nl)))
+       
+       - twoside optional characteristic
+       
+         JadeTeX turns on the twoside LaTeX feature by default.
+       
+         Those patches make it optional by using an extension
+       characteristics.
+       
+       - Better table support
+       
+         These makes the support for tables in the TeX backend a lot
+       better.
+       
+            o  Support for nested tables.
+            o  cell-after-column-margin: and cell-before-column-margin:
+       wasn't
+               really working.
+            o  Row spanning was broken. This patch only supports
+               'start row alignment though.
+            o  Paragraphs in cell spanning multiple column are now
+       working.
+            o  Support for the row-alignment: characteristic.
+            o  Support for cell-background? and background-color
+       properties
+       
+       - Support for 'asis and 'asis-wrap
+       
+         This adds support for the 'asis and 'asis-wrap values for the
+         paragraph's lines: characteristic.
+
+2002-01-11 15:37  icastle
+
+       * jade/MifFOTBuilder.cxx: Support for newer compiler versions
+       
+       ref: redhat openjade-foo.patch
+
+2002-01-11 15:35  icastle
+
+       * spgrove/Makefile.sub, style/Makefile.sub: Fix problems with newer
+       libtool
+       
+       Ref: Redhat Bug #46212, openjade-1.3-lt.patch
+
+2002-01-11 15:21  icastle
+
+       * style/LangObj.cxx: Support for newer GCC libstdc++
+       
+       ref: Redhat openjade-1.3-strdup.patch      Connectiva
+       openjade-1.3-ia64.patch
+       
+       Newer libstdc++ has strdup
+
+2002-01-11 15:16  icastle
+
+       * nsgmls/nsgmls.cxx, spgrove/GroveBuilder.cxx: Support for newer
+       compilers.
+       
+       ref: redhat openjade-1.3-decl.patch
+
+2002-01-11 14:28  icastle
+
+       * style/jade_version.h: Make sure that CVS really does contain the
+       source for openjade-1.3
+       
+       It should now be possible to do
+       
+       cvs co -r RELEASE-1_3_0 and get the exact same source that is in
+       the old openjade-1.3.tar.gz tarball
+
+1999-11-11 21:48  clasen
+
+       * config/install-sh: Remove generated and unneeded files.
+
+1999-11-11 18:36  clasen
+
+       * instmac.pl: Need the perl scripts here too.
+
+1999-10-15 22:19  clasen
+
+       * include/CharMap.cxx, lib/Attribute.cxx, lib/SOEntityCatalog.cxx,
+       lib/WinApp.cxx, lib/XMLCodingSystem.cxx: Include the relevant
+       patches from sp-1.3.4 (ignoring fixes to template instantiation
+       with gcc-2.95 and an sx patch which we already had).
+
+1999-10-15 22:01  clasen
+
+       * NEWS, jade/TransformFOTBuilder.cxx, jade/TransformFOTBuilder.h,
+       jade/jade.cxx, jadedoc/index.htm: Add the sgml-raw, xml-raw
+       backends (patch by Brandon Ibach).
+
+1999-10-15 21:44  clasen
+
+       * spgrove/GroveBuilder.cxx: Fix a crash with empty CDATA
+       attributes.
+
+1999-10-07 08:19  clasen
+
+       * grove/grove.dsp, lib/lib.dsp, spgrove/spgrove.dsp,
+       style/style.dsp: Correct dll names. Untested. Windows hackers, test
+       this!!!
+
+1999-10-07 08:12  clasen
+
+       * style/primitive.cxx: Apply the fix for duplicate property rcsname
+       `tokens' already in main branch.
+
+1999-10-06 09:59  pn
+
+       * style/primitive.cxx: StringToList: Protect the list while it is
+       built with a ELObjDynamicRoot.  (important bug fix).
+
+1999-09-29 08:34  clasen
+
+       * style/style_inst.m4: Make manual inst work with gcc-2.95.
+
+1999-09-10 12:58  clasen
+
+       * jadedoc/index.htm: Document internal definitions as missing.
+
+1999-09-09 16:28  clasen
+
+       * jadedoc/: autoconf.htm, dsssl2.htm, index.htm, mif.htm, rtf.htm,
+       tex.htm, transform.htm, xmlfo.htm: More doc improvements.
+
+1999-09-08 07:13  pn
+
+       * jadedoc/: contributors.htm, dsssl2.htm, index.htm, mif.htm,
+       rtf.htm, tex.htm, transform.htm, xmlfo.htm: Merged fixes from main
+       branch.
+
+1999-09-07 22:51  clasen
+
+       * jadedoc/index.htm: Lift some sections from the old docs.
+
+1999-09-07 10:51  clasen
+
+       * jadedoc/: contributors.htm, dsssl2.htm, index.htm, mif.htm,
+       rtf.htm, tex.htm, transform.htm, xmlfo.htm, images/background.gif,
+       images/dsssltitle.gif, images/space.gif, images/top-of-page.gif:
+       More documentation fixes, images added.
+
+1999-09-07 00:55  clasen
+
+       * jadedoc/: contributors.htm, copying.txt, dsssl2.htm, index.htm,
+       mif.htm, rtf.htm, tex.htm, transform.htm, xmlfo.htm: The new
+       documentation, images still missing.
+
+1999-09-01 20:38  clasen
+
+       * style/sdata.h: fix sdata entity map for
+       cyrillic-capital-letter-de.
+
+1999-09-01 08:25  clasen
+
+       * Makefile.lib.in, configure, config/configure.in,
+       grove/Makefile.sub, lib/Makefile.sub, spgrove/Makefile.sub,
+       style/Makefile.sub: Set library versions explicitly. All renamed
+       libraries start out as 0:0:0.
+
+1999-08-30 11:25  Avi
+
+       * grove/Makefile.sub, jade/Makefile.sub, lib/Makefile.sub,
+       nsgmls/Makefile.sub, sgmlnorm/Makefile.sub, spam/Makefile.sub,
+       spent/Makefile.sub, spgrove/Makefile.sub, style/Makefile.sub,
+       sx/Makefile.sub, grove/grove.dsp, groveoa/groveoa.dsp,
+       jade/jade.dsp, lib/lib.dsp, nsgmls/nsgmls.dsp,
+       sgmlnorm/sgmlnorm.dsp, spam/spam.dsp, spent/spent.dsp,
+       spgrove/spgrove.dsp, style/style.dsp, sx/sx.dsp: Binaries renamed
+       to avoid conflict with Jade package.
+
+1999-08-29 22:15  clasen
+
+       * config/install-sh: Apply a cleanup patch by Adam, rename
+       install.sh to install-sh since the autoconf manual recommends it.
+
+1999-08-24 16:59  pn
+
+       * style/InterpreterMessages.msg: varCharPropertyExprUnsupported:
+       New message.
+
+1999-08-24 16:58  pn
+
+       * style/Interpreter.cxx: (Interpreter::addCharProperty,
+       Interpreter::setCharProperty): Avoid crashing when expression is
+       non-constant.
+
+1999-08-24 11:18  clasen
+
+       * Makefile.prog.in, configure, config/configure.in: Support
+       --program-prefix and friends in configure.
+
+1999-08-23 10:14  Avi
+
+       * jadedist/bin-files.txt: Added dsssl/extensions.dsl to the binary
+       distribution.
+
+1999-08-22 15:37  Avi
+
+       * Makefile.comm, Makefile.comm.in: .msg implicit rule fix; old rule
+       remains for non-gnu make.
+
+1999-08-22 15:13  Avi
+
+       * Makefile, Makefile.in: Inter-directory dependency fixes.
+
+1999-08-21 19:25  Avi
+
+       * contrib/: catalog, transform.dsl: SGML transformation procedures.
+
+1999-08-21 16:52  Avi
+
+       * style/jade_version.h: Version number: 1.3pre1
+
+1999-08-21 13:22  Avi
+
+       * Makefile, Makefile.in: Directory dependency fix.
+
+1999-08-21 13:19  Avi
+
+       * Makefile.comm: Removed dependency on m4.
+
+1999-08-21 12:39  Avi
+
+       * testsuite/expr-lang.dsl: Tests defined a little less painfully.
+
+1999-08-21 12:27  Avi
+
+       * testsuite/expr-lang.dsl: Line-terminator fix.
+
+1999-08-21 12:26  Avi
+
+       * testsuite/expr-lang.expected: Language-dependent char tests.
+
+1999-08-21 12:09  Avi
+
+       * testsuite/expr-lang.dsl: Language-dependent char tests.
+
+1999-08-21 12:08  Avi
+
+       * testsuite/Makefile: 'make clean' target
+
+1999-08-20 21:36  Avi
+
+       * testsuite/expr-lang.expected: Expression language expected test
+       results.
+
+1999-08-20 21:33  Avi
+
+       * testsuite/: expr-lang.dsl, null.sgml: Copyright information.
+
+1999-08-20 21:31  Avi
+
+       * testsuite/Makefile: Testsuite driver.
+
+1999-08-20 21:18  Avi
+
+       * testsuite/expr-lang.dsl: Expression language tests. Currently
+       tests only the char=? procedure, but ready for much more.
+
+1999-08-20 21:17  Avi
+
+       * testsuite/null.sgml: Null SGML instance.
+
+1999-08-20 20:41  clasen
+
+       * dsssl/builtins.dsl: Fix some bugs introduced by blindly typing in
+       the definitions from the standard.
+
+1999-08-20 20:10  clasen
+
+       * style/: StyleEngine.h, Interpreter.h, StyleEngine.cxx:    Parse
+       cmdline definitions properly and allow
+          -Vvariable1 -Vvariable2=value2 -V\(define\ variable3\ value3\)
+          as equivalent to
+          (define variable1 #t)
+          (define variable2 "value2")
+          (define variable3 value3)
+
+1999-08-20 20:05  Avi
+
+       * dsssl/builtins.dsl: Implemented char and string primitives.
+
+1999-08-20 19:44  Avi
+
+       * dsssl/builtins.dsl: (ancestors) infinite loop fixed.
+
+1999-08-20 19:42  Avi
+
+       * lib/entmgr_inst.m4: Corrected usage of config macros.
+
+1999-08-20 11:49  Avi
+
+       * contrib/rtf2doc.pl: Handle Word errors gracefully
+
+1999-08-20 08:05  clasen
+
+       * lib/: entmgr_inst.m4, parser_inst.m4: Replace gcc-2.95 specific
+       fixes by more generic ones.
+
+1999-08-19 23:54  Avi
+
+       * contrib/: README, rtf2doc.pl: Script to convert .rtf files to
+       .doc, embedding graphics in the process.
+
+1999-08-19 22:55  Avi
+
+       * contrib/README: A short description of what this directory is and
+       what's in it.
+
+1999-08-19 13:59  Avi
+
+       * style/FlowObj.cxx: Fix for MSVC++.
+
+1999-08-19 13:51  Avi
+
+       * groveoa/GroveNode.cxx: Fix typo in ElementTypeNode
+       implementation.
+
+1999-08-18 21:48  pn
+
+       * style/charProps.h: Interpreter::installCharProperties(): Add
+       values for break-before-priority and break-after-priority character
+       properties.
+
+1999-08-17 19:53  clasen
+
+       * lib/entmgr_inst.m4: OK, I'll stop committing now until I'm sure
+       there are no more dupes.
+
+1999-08-17 19:51  clasen
+
+       * lib/entmgr_inst.m4: One more duplicate removed.
+
+1999-08-17 19:41  clasen
+
+       * jade/MifFOTBuilder_inst.m4, lib/entmgr_inst.m4: Remove duplicate
+       instantiations.
+
+1999-08-17 18:45  clasen
+
+       * develdoc/missing: Doc updates.
+
+1999-08-17 11:44  clasen
+
+       * grove/Node.cxx, grove/Node.h, groveoa/CGroveBuilder.cxx,
+       groveoa/CGroveBuilder.h, groveoa/GroveNode.cxx,
+       groveoa/groveoa.idl, style/ELObjPropVal.h: Apply prlabs1 patch
+       contained in JadeMIF-1.0h by Kathleen Marszalek.
+
+1999-08-16 22:48  clasen
+
+       * style/Expression.cxx: Implement force!.
+
+1999-08-16 19:38  clasen
+
+       * jade/MifFOTBuilder_inst.m4, lib/entmgr_inst.m4,
+       lib/parser_inst.m4: Temp fixes for template initialization to allow
+       compilation with gcc-2.95.
+
+1999-08-16 19:16  clasen
+
+       * style/FlowObj.cxx: Remove forgotten printf.
+
+1999-08-16 01:00  clasen
+
+       * style/InheritedC.cxx: Change PublicIdInheritedC to return a
+       string, not a symbol.
+
+1999-08-15 23:45  clasen
+
+       * style/: FlowObj.cxx, Interpreter.h, SchemeParser.cxx,
+       SchemeParser.h, primitive.h: Implement
+       declare-char-characteristic+property. We do not actually support
+       any nonstandard character NICs, they are just ignored (and are
+       available as char properties).
+       
+       Move the nonstandard functionality of sgml-parse and expt to
+       external procedures of the same name.
+       
+       Apply a patch by Peter Nilsson to fix several bugs in the
+       SchemeParser part of the character properties implementation.
+
+1999-08-15 22:31  clasen
+
+       * dsssl/extensions.dsl: All extensions known to jade.
+
+1999-08-14 12:43  clasen
+
+       * style/primitive.h: Forgot to remove map and c..r from the header.
+
+1999-08-13 21:38  clasen
+
+       * dsssl/builtins.dsl: Replace the cxx map and c..r primitives by
+       scheme equivalents.
+
+1999-08-13 21:28  clasen
+
+       * jade/TeXFOTBuilder.cxx: Emit all character NICs, emit script as
+       string without prefix.  Mainly for testing purposes.  Since the
+       character NICs are not used at all by the jadetex macros and blow
+       up the size of the tex files, this should probably be changed
+       before 1.3.
+
+1999-08-13 21:26  clasen
+
+       * style/: ProcessContext.cxx, FOTBuilder.h, FlowObj.cxx, Insn.cxx,
+       SosofoObj.h, charProps.h, ELObjPropVal.h, Expression.cxx,
+       FOTBuilder.cxx, Insn2.h: 
+       {Interpreter,SchemeParser}.{h,cxx},InterpreterMessages.msg,primitiv
+       e.cxx, style_inst.m4:  EL side of character properties. 
+       ProcessContext.cxx:  process-children-trim uses input-whitespace?. 
+       charProps.h:  New file, some standard character properties
+       extracted from Unicode.  SosofoObj.h,ProcessContext.cxx,Insn.cxx: 
+       Save current node in SetNonInheritedCsSosofoObj. 
+       FOTBuilder.{h,cxx},FlowObj.cxx,Insn2.h,Insn.cxx,Expression.cxx: 
+       Special inheritance for character NICs, using a new
+       SetImplicitCharInsn.  ELObjPropVal.h:  New file, extracted from
+       primitive.cxx.
+
+1999-08-13 21:09  clasen
+
+       * style/: Interpreter.h, SchemeParser.cxx, SchemeParser.h: The
+       expression language part of character properties.
+
+1999-08-12 14:54  clasen
+
+       * style/SchemeParser.cxx: Check that a unit-name is not an
+       exponent-marker.
+
+1999-08-05 23:30  clasen
+
+       * develdoc/missing: Doc updates.
+
+1999-08-05 23:29  clasen
+
+       * style/: Interpreter.h, SchemeParser.cxx, SchemeParser.h:
+       Implement special-query-expressions. Note: the keywords are treated
+       as syntactic keywords (the standard isn't explicit about this).
+
+1999-08-04 21:01  clasen
+
+       * style/StyleEngine.cxx: Fix parsing of declarations in multiple
+       parts.
+
+1999-08-04 20:57  clasen
+
+       * style/: Style.h, Style.cxx: Correct subobject handling of color
+       spaces.
+
+1999-08-04 20:55  clasen
+
+       * style/: Interpreter.h, SchemeParser.cxx: 
+       Fixes for default-language-declaration (Peter Nilsson
+       <pnidv96@student.vxu.se>).  Check for valid character-names and
+       numbers when parsing standard-chars (test case:
+       <standard-chars>xyz$!% #d-5</standard-chars>).  Check for valid
+       unit-name when parsing unit-declaration (test case: (define-unit
+       xyz$!% 2m) ).  Fix parsing of numbers with #d prefix and decimal
+       dot (test case: #d6.0e+2m2).
+
+1999-08-04 20:51  clasen
+
+       * style/: ELObj.cxx, ELObj.h: Print methods for UnspecifiedObj and
+       ErrorObj by Peter Nilsson <pnidv96@student.vxu.se>.
+
+1999-08-02 19:34  clasen
+
+       * style/SchemeParser.cxx: Fix keyword and identifier parsing.
+       Previously, some valid keywords were not accepted, eg ::, a: and
+       :a:.
+
+1999-08-02 19:33  clasen
+
+       * dsssl/builtins.dsl: replace all occurrences of siblings by
+       rsiblings.
+
+1999-07-31 19:53  clasen
+
+       * style/DssslApp.cxx: Applied patch to allow -Dvar=val for string
+       values.
+
+1999-07-23 22:00  Avi
+
+       * style/jade_version.h: Version number indicates 1.3 development.
+
+1999-07-23 21:57  Avi
+
+       * include/Entity.h: Classes declared SP_API in order to survive
+       MSVC (caused by builtins.dsl entity dereference)
+
+1999-07-23 21:28  Avi
+
+       * style/common_inst.m4: More uninstantiated templates
+
+1999-07-23 20:49  Avi
+
+       * style/common_inst.m4: Add uninstantiated templates
+
+1999-07-23 19:56  Avi
+
+       * build-win32.bat: Script to build Jade for Win32
+
+1999-07-23 19:56  Avi
+
+       * jade-generate.mak, sp-generate.mak: Removed dependencies on unix
+       tools (m4, chmod, rm)
+
+1999-07-23 19:10  Avi
+
+       * jade/MifFOTBuilder.cxx, jade/RtfFOTBuilder.cxx,
+       jade/SgmlFOTBuilder.cxx, jade/TeXFOTBuilder.cxx,
+       style/FOTBuilder.cxx, style/FOTBuilder.h, style/FlowObj.cxx,
+       style/ProcessContext.cxx, style/ProcessContext.h:
+       simple-page-sequence headers and footers unserialized
+
+1999-07-23 19:00  Avi
+
+       * Makefile: Mif and HTML enabled by default
+
+1999-07-23 18:55  Avi
+
+       * dsssl/catalog: System id resolved for builtins.dsl
+
+1999-07-23 18:36  clasen
+
+       * Makefile, Makefile.comm, Makefile.lib, Makefile.prog: Restore
+       original Makefiles.
+
+1999-07-23 18:19  Avi
+
+       * msggen.pl: Fix Perl -w warning
+
+1999-07-23 18:15  clasen
+
+       * Makefile, Makefile.comm, Makefile.lib, Makefile.prog,
+       jade/TeXFOTBuilder.cxx: Cleanup to make it compile. Added enough
+       dependencies for ./configure; make to work without intermediate
+       make gen.
+
+1999-07-23 16:50  clasen
+
+       * VERSION, config/aclocal.m4, config/ltconfig, config/ltmain.sh,
+       include/config.h, jade/TeXFOTBuilder.cxx,
+       lib/CmdLineAppMessages.msg, spgrove/threads.h,
+       style/DssslAppMessages.msg, style/jade_version.h: Just merged
+       jade_1_2_2 to the main branch.
+
+1999-07-22 23:00  clasen
+
+       * develdoc/missing: List of missing pieces from DSSSL.
+
+1999-07-22 22:58  clasen
+
+       * style/: Interpreter.h, Style.cxx, Style.h: support for all
+       standard color-spaces via conversion to device rgb.
+
+1999-07-22 22:56  clasen
+
+       * develdoc/jadedoc.sgml: Documentation of jade internals.
+
+1999-07-19 22:45  clasen
+
+       * Makefile.comm.in: Change rule for m4.cxx to use perl and remove
+       check for m4 from configure.
+
+1999-07-13 12:50  Avi
+
+       * lib/instmac.pl: Replacement for instmac.m4
+
+1999-07-13 12:47  Avi
+
+       * lib/instmac.pl: file instmac.pl was initially added on branch
+       jade_1_2_1_branch.
+
+1999-07-11 20:11  clasen
+
+       * style/FOTBuilder.cxx, style/FOTBuilder.h, jade/TeXFOTBuilder.cxx,
+       style/InheritedC.cxx: inline-space-space is no longer ignored by
+       FOTBuilder and TeXFOTBuilder.  I haven't yet added support to
+       jadetex.
+
+1999-07-09 00:48  clasen
+
+       * sx/XmlOutputEventHandler.cxx: merge the fix applied in the stable
+       branch.
+
+1999-07-08 21:52  clasen
+
+       * style/SchemeParser.cxx: SchemeParser::parseMake(): ignore
+       duplicate keywords in make expressions.
+
+1999-07-08 01:00  clasen
+
+       * dsssl/style-sheet.dtd: allow declarations before the first part.
+
+1999-07-08 00:57  clasen
+
+       * dsssl/jadetex.dtx: jadetex 2.7 again. The previous commit had
+       this file truncated.
+
+1999-07-08 00:45  clasen
+
+       * include/config.h: add a default value for
+       DEFAULT_SCHEME_BUILTINS.
+
+1999-07-08 00:43  clasen
+
+       * Makefile.comm.in: generate dependency information for libtool
+       objects (.lo) as well.
+
+1999-07-08 00:40  clasen
+
+       * style/: Interpreter.h, SchemeParser.cxx, SchemeParser.h,
+       StyleEngine.cxx: cleanup the declaration element stuff. The parsing
+       is done by the SchemeParser, the Interpreter simply holds the
+       resulting values.
+
+1999-07-01 23:49  clasen
+
+       * style/: Interpreter.h, LangObj.cxx, LangObj.h, ELObj.cxx,
+       ELObj.h, EvalContext.h, SchemeParser.cxx, SchemeParser.h,
+       primitive.h: language-dependent expression language procedures and
+       external procedure "UNREGISTERED::OpenJade//Procedure::language" to
+       create language objects by reference to a POSIX locale.
+
+1999-07-01 23:44  clasen
+
+       * dsssl/: catalog, style-sheet.dtd: add supported decl archforms to
+       dtd, change pubid to "-//OpenJade//DTD DSSSL Style Sheet//EN", add
+       catalog entry for new pubid, but leave old entry.
+
+1999-06-30 01:34  clasen
+
+       * dsssl/Makefile.jadetex, dsssl/jadetex.dtx,
+       jade/TeXFOTBuilder.cxx, jade/TeXFOTBuilder_inst.m4: merge the TeX
+       backend additions from the stable branch.
+
+1999-06-30 01:20  clasen
+
+       * dsssl/ChangeLog: forgotten file.
+
+1999-06-30 01:19  clasen
+
+       * dsssl/unicode.sty: PDF bookmarks support for TeX backend/jadetex
+       from Sebastian, who gives credit for the patches to J.-M. Kubek
+       (kubek@insa-tlse.fr).
+
+1999-06-30 00:54  clasen
+
+       * style/: DssslApp.cxx, DssslApp.h, Interpreter.h,
+       SchemeParser.cxx, SchemeParser.h, StyleEngine.cxx, StyleEngine.h:
+       char-repertoire, add-name-chars and add-separator-chars declaration
+       element type forms, -s cmdline switch to make jade forget its
+       builtin character repertoire.
+
+1999-06-30 00:51  clasen
+
+       * Makefile.comm.in, dsssl/builtins.dsl: fix default location for
+       builtins.dsl (you can change that at runtime via a SYSTEM catalog
+       entry); remove duplicate procedures from builtins.dsl.
+
+1999-06-29 22:20  clasen
+
+       * msggen.pl: prepare msggen.pl to create .po files for gettext.
+
+1999-06-29 22:04  clasen
+
+       * Makefile.in, dsssl/builtins.dsl, style/DssslApp.cxx,
+       style/DssslApp.h, style/GroveManager.h, style/Interpreter.h:
+       support for "scheme builtins" and a little fix for gettext
+       detection.  The following things are still to do for the "scheme
+       builtins": the windows build process has to install builtins.dsl
+       somewhere and define DEFAULT_SCHEME_BUILTINS accordingly; we have
+       to decide which of the added expression language procedures should
+       stay in cxx and which should be defined in scheme.
+
+1999-06-26 21:47  clasen
+
+       * style/charNames.h: "line-feed" and "carriage-return" predefined
+       character names.
+
+1999-06-26 21:44  clasen
+
+       * style/: DssslSpecEventHandler.cxx, DssslSpecEventHandler.h,
+       Interpreter.h, StyleEngine.cxx: standard-chars and map-sdata-entity
+       declaration element type forms, "line-feed" and "carriage-return"
+       predefined character names.
+
+1999-06-23 00:17  clasen
+
+       * style/primitive.h: Add a lot of expression language primitives,
+       and map-constructor.
+
+1999-05-02 16:46  Avi
+
+       * FILES, jade.dsw, jade.mak, README, SP.dsw, SP.mak, all/all.dsp,
+       doc/index.htm, grove/LocNode.cxx, grove/LocNode.h,
+       include/CharMap.h, include/Event.h, include/InternalInputSource.h,
+       include/Mode.h, include/OpenElement.h, include/OwnerTable.cxx,
+       include/RangeMap.h, include/Text.h, jade/HtmlFOTBuilder.cxx,
+       jade/TmpOutputByteStream.h, jadedist/files.txt,
+       jadedist/jadedist.dsp, lib/ArcEngine.cxx, lib/CharsetRegistry.cxx,
+       lib/Entity.cxx, lib/Location.cxx, lib/MessageTable.cxx,
+       lib/parseDecl.cxx, lib/ParserState.cxx, lib/ParserState.h,
+       lib/Recognizer.h, lib/Text.cxx, lib/Undo.h, lib/xentmgr_inst.m4,
+       spgrove/SdNode.cxx, spgrove/SdNode.h, style/Collector.cxx,
+       style/Collector.h, style/dsssl_ns.h, style/FlowObj_inst.m4,
+       style/primitive_inst.m4, style/ProcessingMode.h: Jade 1.2.1
+
+1999-05-02 16:44  Avi
+
+       * Makefile.comm.in, Makefile.in, config/aclocal.m4,
+       config/ltconfig, config/ltmain.sh, dsssl/Makefile.jadetex,
+       dsssl/jadetex.dtx, jade/MifFOTBuilder.cxx,
+       jade/MifFOTBuilder_inst.m4, jade/TeXFOTBuilder_inst.m4: Initial
+       revision
+
+1999-05-02 16:44  Avi
+
+       * jade.mak, SP.mak, config/config.guess, config/config.sub,
+       config/install.sh, dsssl/fot.dtd, dsssl/jadetex.ini,
+       dsssl/jadetex.ins, dsssl/pdfjadetex.ini, include/InputSource.h,
+       include/MessageTable.h, jade/MifFOTBuilder.h, jade/jade.rc,
+       jade/MifMessages.msg, jade/TmpOutputByteStream.h,
+       jadedist/files.txt, lib/ArcEngine.cxx, lib/MessageTable.cxx,
+       lib/Mutex.h, lib/parseInstance.cxx, spam/CopyEventHandler.cxx: Jade
+       1.2
+
+1999-05-02 16:40  Avi
+
+       * COPYING, FILES, SP.mak, doc/catalog.htm, lib/CmdLineApp.cxx,
+       lib/parseParam.cxx, lib/ParserMessages.msg, lib/Priority.h,
+       pubtext/html.dtd, pubtext/html.soc, pubtext/HTML4.soc,
+       style/ProcessingMode.cxx, style/ProcessingMode.h: Jade 1.1.1
+
+1999-05-02 16:37  Avi
+
+       * style/charNames.h, style/SchemeParser.cxx, style/SchemeParser.h,
+       sx/XmlOutputEventHandler.cxx: Initial revision
+
+1999-05-02 16:36  Avi
+
+       * FILES, jade.mak, SP.mak, doc/archform.htm, doc/catalog.htm,
+       doc/charset.htm, doc/generic.htm, doc/index.htm, doc/new.htm,
+       doc/nsgmls.htm, doc/sx.htm, doc/xml.htm, dsssl/fot.dtd,
+       include/Attribute.h, include/CharsetInfo.h, include/CmdLineApp.h,
+       include/ContentState.h, include/Dtd.h, include/EntityDecl.h,
+       include/ExternalId.h, include/Mode.h, include/OpenElement.h,
+       include/ParserOptions.h, include/SOEntityCatalog.h, include/Sd.h,
+       include/Syntax.h, include/XMLCodingSystem.h,
+       jade/HtmlFOTBuilder.cxx, jadedist/files.txt, lib/ArcEngine.cxx,
+       lib/ArcProcessor.h, lib/CharsetInfo.cxx, lib/CmdLineApp.cxx,
+       lib/CodingSystemKit.cxx, lib/ContentState.cxx, lib/Dtd.cxx,
+       lib/Entity.cxx, lib/EntityApp.cxx, lib/ExtendEntityManager.cxx,
+       lib/ExternalId.cxx, lib/GenericEventHandler.cxx,
+       lib/InputSource.cxx, lib/ModeInfo.cxx, lib/parseAttribute.cxx,
+       lib/parseCommon.cxx, lib/parseDecl.cxx, lib/parseInstance.cxx,
+       lib/parseMode.cxx, lib/parseParam.cxx, lib/Parser.cxx,
+       lib/Parser.h, lib/ParserApp.cxx, lib/ParserMessages.msg,
+       lib/ParserOptions.cxx, lib/ParserState.cxx, lib/ParserState.h,
+       lib/parseSd.cxx, lib/Priority.h, lib/Sd.cxx, lib/Syntax.cxx,
+       lib/token.h, lib/UTF8CodingSystem.cxx, pubtext/HTML4-f.dtd,
+       pubtext/HTML4-s.dtd, pubtext/HTML4.dcl, pubtext/HTML4.dtd,
+       pubtext/HTMLlat1.ent, pubtext/HTMLspec.ent, pubtext/HTMLsym.ent,
+       pubtext/xml.dcl, spam/CopyEventHandler.cxx,
+       spam/CopyEventHandler.h, style/Collector.cxx, style/Collector.h,
+       style/Expression.h, style/Insn.h, style/MacroFlowObj.cxx,
+       style/MacroFlowObj.h, style/NumberCache.cxx, style/Pattern.cxx,
+       style/Pattern.h, style/ProcessingMode.cxx, style/ProcessingMode.h,
+       style/primitive_inst.m4, style/VM.h, style/style_pch.h,
+       sx/SxMessages.msg, sx/XmlOutputEventHandler.h,
+       sx/XmlOutputMessages.msg, sx/sx.cxx, sx/sx.rc, sx/sx_inst.m4: Jade
+       1.1
+
+1999-05-02 14:09  Avi
+
+       * doc/archform.htm, doc/new.htm, lib/CatalogMessages.msg,
+       lib/ParserMessages.msg, lib/parseSd.cxx,
+       lib/UnicodeCodingSystem.cxx, lib/UnivCharsetDesc.cxx,
+       pubtext/xml.dcl, spam/CopyEventHandler.cxx: Jade 1.0.1
+
+1999-05-02 14:06  Avi
+
+       * FILES, jade.mak, Makefile.wat, SP.mak, include/EntityCatalog.h,
+       include/NotationStorage.h, include/Syntax.h, include/WinApp.h,
+       jadedist/files.txt, lib/EntityApp.cxx, lib/EntityCatalog.cxx,
+       lib/ExtendEntityManager.cxx, lib/NotationStorage.cxx, lib/Parser.h,
+       lib/ParserMessages.msg, lib/ParserState.cxx, lib/parseSd.cxx,
+       lib/splibpch.h, lib/Syntax.cxx, lib/URLStorage.cxx,
+       style/style_pch.h: Jade 1.0
+
+1999-05-02 14:03  Avi
+
+       * jade.mak, Makefile.wat, SP.mak, doc/build.htm,
+       include/Attribute.h, include/Boolean.h, include/OutputByteStream.h,
+       include/SubstTable.cxx, jade/RtfOle.cxx, jade/TeXFOTBuilder.h,
+       lib/CmdLineApp.cxx, lib/GenericEventHandler.cxx, lib/parseSd.cxx:
+       Jade 0.9
+
+1999-05-02 13:57  Avi
+
+       * groveoa/CGroveBuilder.cxx, groveoa/CGroveBuilder.h,
+       groveoa/GroveNode.cxx, groveoa/groveoa.idl, style/DssslApp.cxx,
+       style/DssslApp.h, style/DssslAppMessages.msg, style/GroveManager.h,
+       style/jade_version.h: Initial revision
+
+1999-05-02 13:57  Avi
+
+       * jade.mak, dsssl/fot.dtd, groveoa/GroveBuilder.rgs,
+       groveoa/GroveNode.h, groveoa/StdAfx.cxx, groveoa/StdAfx.h,
+       groveoa/groveoa.cxx, groveoa/groveoa.def, groveoa/groveoa.rc,
+       groveoa/resource.h, jade/HtmlFOTBuilder.cxx,
+       jade/HtmlFOTBuilder_inst.m4, jade/JadeMessages.msg,
+       jade/RtfFOTBuilder_inst.m4, jade/RtfMessages.msg, jade/RtfOle.cxx,
+       jade/RtfOle.h, jadedist/files.txt, lib/ParserMessages.msg,
+       spgrove/GroveApp.cxx, spgrove/GroveApp.h, spgrove/GroveBuilder.h,
+       spgrove/SdNode.cxx, spgrove/SdNode.h, spgrove/grove_inst.m4,
+       style/Expression.h, style/GroveManager.cxx, style/Insn.h,
+       style/NumberCache.cxx, style/ProcessingMode.cxx,
+       style/ProcessingMode.h, style/VM.h, style/style_pch.h: Jade 0.8
+
+1999-05-02 13:52  Avi
+
+       * jade.mak, SP.mak: Jade 0.7
+
+1999-05-02 13:51  Avi
+
+       * FILES, jade.mak, Makefile.wat, SP.mak, doc/new.htm,
+       doc/nsgmls.htm, doc/sgmlsout.htm, doc/spam.htm, dsssl/fot.dtd,
+       grove/LocNode.cxx, grove/LocNode.h, include/Attribute.h,
+       include/CmdLineApp.h, include/CodingSystem.h,
+       include/ContentState.h, include/Dtd.h, include/ElementType.h,
+       include/EntityCatalog.h, include/Event.h,
+       include/ExtendEntityManager.h, include/Location.h,
+       include/MessageFormatter.h, include/MessageReporter.h,
+       include/OutputByteStream.h, include/OutputCharStream.h,
+       include/ParserOptions.h, include/PointerTable.h,
+       include/StringOf.cxx, include/Text.h, include/Vector.cxx,
+       include/Vector.h, include/xnew.h, jade/HtmlFOTBuilder.cxx,
+       jade/HtmlFOTBuilder.h, jade/HtmlFOTBuilder_inst.m4, jade/jade.rc,
+       jade/RtfFOTBuilder.h, jade/RtfFOTBuilder_inst.m4,
+       jade/TeXFOTBuilder.h, jade/TeXMessages.msg,
+       jade/TransformFOTBuilder_inst.m4, jadedist/files.txt,
+       lib/ArcEngine.cxx, lib/ArcProcessor.h, lib/Big5CodingSystem.cxx,
+       lib/CmdLineApp.cxx, lib/CodingSystem.cxx, lib/CodingSystemKit.cxx,
+       lib/ConsoleOutput.cxx, lib/ContentState.cxx, lib/Entity.cxx,
+       lib/EntityCatalog.cxx, lib/EUCJPCodingSystem.cxx, lib/Event.cxx,
+       lib/ExtendEntityManager.cxx, lib/Fixed2CodingSystem.cxx,
+       lib/GenericEventHandler.cxx, lib/IdentityCodingSystem.cxx,
+       lib/lib.rc, lib/Location.cxx, lib/MessageFormatter.cxx,
+       lib/MessageFormatterMessages.msg, lib/MessageReporter.cxx,
+       lib/MessageReporterMessages.msg, lib/Mutex.h,
+       lib/OffsetOrderedList.cxx, lib/OffsetOrderedList.h,
+       lib/OutputByteStream.cxx, lib/OutputCharStream.cxx,
+       lib/parseAttribute.cxx, lib/parseCommon.cxx, lib/parseDecl.cxx,
+       lib/parseInstance.cxx, lib/parseParam.cxx, lib/Parser.cxx,
+       lib/Parser.h, lib/ParserApp.cxx, lib/ParserEventGeneratorKit.cxx,
+       lib/ParserMessages.msg, lib/ParserOptions.cxx, lib/ParserState.cxx,
+       lib/ParserState.h, lib/SJISCodingSystem.cxx, lib/parseSd.cxx,
+       lib/StorageObjectPosition.h, lib/Text.cxx,
+       lib/TranslateCodingSystem.cxx, lib/splibpch.h,
+       lib/UTF8CodingSystem.cxx, lib/UnicodeCodingSystem.cxx,
+       lib/Win32CodingSystem.cxx, nsgmls/NsgmlsMessages.msg,
+       nsgmls/RastEventHandler.cxx, nsgmls/SgmlsEventHandler.cxx,
+       nsgmls/SgmlsEventHandler.h, nsgmls/nsgmls.cxx, pubtext/xml.dcl,
+       pubtext/xml.soc, spam/CopyEventHandler.cxx, spam/spam.cxx,
+       spent/spent.cxx, spgrove/GroveApp.cxx, spgrove/GroveBuilder.h,
+       spgrove/grove_inst.m4, style/FlowObj_inst.m4, style/Insn.h,
+       style/ProcessingMode.h, style/primitive_inst.m4, style/VM.h: Jade
+       0.6
+
+1999-05-02 13:50  Avi
+
+       * Makefile, Makefile.comm, Makefile.lib, Makefile.prog, VERSION,
+       msggen.pl, sp-generate.mak, include/Entity.h, include/config.h,
+       lib/CmdLineAppMessages.msg, lib/entmgr_inst.m4, lib/parser_inst.m4:
+       Initial revision
+
+1999-05-02 13:50  Avi
+
+       * COPYING, FILES, jade.mak, Makefile.lib.CC, Makefile.lib.sun,
+       Makefile.wat, README, SP.mak, japan.sgmldecl, sunfix.sh,
+       all/README, doc/Makefile, doc/archform.htm, doc/build.htm,
+       doc/catalog, doc/catalog.htm, doc/charset.htm, doc/features.htm,
+       doc/generic.htm, doc/ideas.htm, doc/index.htm, doc/new.htm,
+       doc/nsgmls.htm, doc/sgmldecl.htm, doc/sgmlnorm.htm,
+       doc/sgmlsout.htm, doc/spam.htm, doc/spent.htm, doc/sysdecl.htm,
+       doc/sysid.htm, dsssl/dsssl.dtd, dsssl/fot.dtd,
+       generic/EventGenerator.h, generic/ParserEventGeneratorKit.h,
+       generic/SGMLApplication.h, include/Allocator.h,
+       include/ArcEngine.h, include/Attribute.h, include/Attributed.h,
+       include/Big5CodingSystem.h, include/Boolean.h, include/CharMap.h,
+       include/CharsetDecl.h, include/CharsetInfo.h,
+       include/CharsetRegistry.h, include/CmdLineApp.h,
+       include/CodingSystem.h, include/CodingSystemKit.h,
+       include/ConsoleOutput.h, include/ContentState.h,
+       include/ContentToken.h, include/CopyOwner.cxx, include/CopyOwner.h,
+       include/DescriptorManager.h, include/Dtd.h,
+       include/EUCJPCodingSystem.h, include/ElementType.h,
+       include/EntityApp.h, include/EntityCatalog.h, include/EntityDecl.h,
+       include/EntityManager.h, include/ErrnoMessageArg.h,
+       include/ErrorCountEventHandler.h, include/Event.h,
+       include/EventsWanted.h, include/ExtendEntityManager.h,
+       include/ExternalId.h, include/Fixed2CodingSystem.h,
+       include/GenericEventHandler.h, include/Hash.h,
+       include/HashTable.cxx, include/HashTable.h,
+       include/HashTableItemBase.cxx, include/HashTableItemBase.h,
+       include/IList.h, include/IListBase.h, include/IListIter.h,
+       include/IListIterBase.h, include/IQueue.cxx, include/IQueue.h,
+       include/ISet.cxx, include/ISet.h, include/ISetIter.h,
+       include/IdentityCodingSystem.h, include/InputSource.h,
+       include/InternalInputSource.h, include/Link.h,
+       include/LinkProcess.h, include/constant.h, include/List.cxx,
+       include/List.h, include/ListIter.h, include/LiteralStorage.h,
+       include/Location.h, include/Lpd.h, include/Markup.h,
+       include/Message.h, include/MessageArg.h, include/MessageBuilder.h,
+       include/MessageEventHandler.h, include/MessageReporter.h,
+       include/MessageTable.h, include/Mode.h, include/NCVector.h,
+       include/NCVector.sed, include/Named.h, include/NamedResource.h,
+       include/NamedResourceTable.h, include/NamedTable.h,
+       include/Notation.h, include/OpenElement.h, include/Options.cxx,
+       include/Options.h, include/OutputCharStream.h, include/Owner.cxx,
+       include/Owner.h, include/OwnerTable.cxx, include/OwnerTable.h,
+       include/ParserApp.h, include/ParserOptions.h,
+       include/PointerTable.cxx, include/PointerTable.h,
+       include/PosixStorage.h, include/Ptr.cxx, include/Ptr.h,
+       include/RangeMap.cxx, include/RangeMap.h, include/Resource.h,
+       include/RewindStorageObject.h, include/SJISCodingSystem.h,
+       include/SOEntityCatalog.h, include/Sd.h, include/SdText.h,
+       include/SearchResultMessageArg.h, include/SgmlParser.h,
+       include/ShortReferenceMap.h, include/StdioStorage.h,
+       include/StorageManager.h, include/StringC.h, include/StringOf.cxx,
+       include/StringOf.h, include/StringResource.h,
+       include/SubstTable.cxx, include/SubstTable.h, include/Syntax.h,
+       include/Text.h, include/TranslateCodingSystem.h, include/TypeId.h,
+       include/URLStorage.h, include/UTF8CodingSystem.h,
+       include/UnicodeCodingSystem.h, include/UnivCharsetDesc.h,
+       include/Vector.cxx, include/Vector.h, include/Win32CodingSystem.h,
+       include/WinInetStorage.h, include/XcharMap.cxx, include/macros.h,
+       include/rtti.h, include/sptchar.h, include/types.h,
+       include/XcharMap.h, include/xnew.h, jade/HtmlFOTBuilder.cxx,
+       jade/HtmlFOTBuilder.h, jade/jade.rc, jade/RtfFOTBuilder.h,
+       jade/RtfMessages.msg, jadedist/files.txt, jadedist/makedist.bat,
+       lib/Allocator.cxx, lib/ArcEngine.cxx, lib/ArcEngineMessages.msg,
+       lib/ArcProcessor.h, lib/Big5CodingSystem.cxx, lib/CatalogEntry.h,
+       lib/CatalogMessages.msg, lib/CharsetDecl.cxx, lib/CharsetInfo.cxx,
+       lib/CharsetRegistry.cxx, lib/CmdLineApp.cxx, lib/CodingSystem.cxx,
+       lib/CodingSystemKit.cxx, lib/ConsoleOutput.cxx,
+       lib/ContentState.cxx, lib/ContentToken.cxx,
+       lib/DescriptorManager.cxx, lib/Dtd.cxx, lib/EUCJPCodingSystem.cxx,
+       lib/ElementType.cxx, lib/Entity.cxx, lib/EntityApp.cxx,
+       lib/EntityCatalog.cxx, lib/EntityDecl.cxx, lib/EntityManager.cxx,
+       lib/EntityManagerMessages.msg, lib/EquivClass.h,
+       lib/ErrnoMessageArg.cxx, lib/ErrorCountEventHandler.cxx,
+       lib/Event.cxx, lib/EventGenerator.cxx, lib/EventQueue.h,
+       lib/ExtendEntityManager.cxx, lib/ExternalId.cxx,
+       lib/Fixed2CodingSystem.cxx, lib/GenericEventHandler.cxx,
+       lib/Group.cxx, lib/Group.h, lib/app_inst.m4, lib/arc_inst.m4,
+       lib/assert.cxx, lib/big5.h, lib/events.h, lib/gb2312.h,
+       lib/Hash.cxx, lib/IListBase.cxx, lib/Id.cxx, lib/Id.h,
+       lib/IdentityCodingSystem.cxx, lib/InputSource.cxx,
+       lib/InternalInputSource.cxx, lib/Link.cxx, lib/LinkProcess.cxx,
+       lib/LiteralStorage.cxx, lib/Location.cxx, lib/Lpd.cxx,
+       lib/LpdEntityRef.h, lib/Markup.cxx, lib/MarkupScan.h,
+       lib/Message.cxx, lib/MessageArg.cxx, lib/MessageEventHandler.cxx,
+       lib/MessageReporter.cxx, lib/MessageReporterMessages.msg,
+       lib/MessageTable.cxx, lib/ModeInfo.cxx, lib/ModeInfo.h,
+       lib/NameToken.h, lib/Notation.cxx, lib/NumericCharRefOrigin.cxx,
+       lib/NumericCharRefOrigin.h, lib/OffsetOrderedList.cxx,
+       lib/OffsetOrderedList.h, lib/OpenElement.cxx,
+       lib/OutputCharStream.cxx, lib/OutputState.cxx, lib/OutputState.h,
+       lib/Param.cxx, lib/Param.h, lib/Parser.cxx, lib/Parser.h,
+       lib/ParserApp.cxx, lib/ParserAppMessages.msg,
+       lib/ParserEventGeneratorKit.cxx, lib/ParserMessages.msg,
+       lib/ParserOptions.cxx, lib/ParserState.cxx, lib/ParserState.h,
+       lib/iso646-jis.h, lib/iso8859-2.h, lib/iso8859-3.h,
+       lib/iso8859-4.h, lib/iso8859-5.h, lib/iso8859-6.h, lib/iso8859-7.h,
+       lib/iso8859-8.h, lib/iso8859-9.h, lib/jis0201.h, lib/jis0208.h,
+       lib/jis0212.h, lib/ksc5601.h, lib/lib.rc, lib/memmove.c,
+       lib/mkversion.pl, lib/parseAttribute.cxx, lib/parseCommon.cxx,
+       lib/parseDecl.cxx, lib/parseInstance.cxx, lib/parseMode.cxx,
+       lib/parseParam.cxx, lib/Partition.cxx, lib/Partition.h,
+       lib/PosixStorage.cxx, lib/PosixStorageMessages.msg, lib/Priority.h,
+       lib/Recognizer.cxx, lib/Recognizer.h, lib/RewindStorageObject.cxx,
+       lib/SGMLApplication.cxx, lib/SJISCodingSystem.cxx, lib/Sd.cxx,
+       lib/SdFormalError.h, lib/SdText.cxx,
+       lib/SearchResultMessageArg.cxx, lib/SgmlParser.cxx,
+       lib/ShortReferenceMap.cxx, lib/SrInfo.h, lib/StdioStorage.cxx,
+       lib/StdioStorageMessages.msg, lib/StorageManager.cxx,
+       lib/StorageObjectPosition.h, lib/StringVectorMessageArg.cxx,
+       lib/StringVectorMessageArg.h, lib/Syntax.cxx, lib/Text.cxx,
+       lib/TokenMessageArg.cxx, lib/TokenMessageArg.h,
+       lib/TranslateCodingSystem.cxx, lib/Trie.h, lib/TrieBuilder.cxx,
+       lib/TrieBuilder.h, lib/TypeId.cxx, lib/Undo.cxx, lib/Undo.h,
+       lib/parseSd.cxx, lib/splib.cxx, lib/splib.h, lib/splibpch.h,
+       lib/strerror.c, lib/token.h, lib/URLStorage.cxx,
+       lib/URLStorageMessages.msg, lib/UTF8CodingSystem.cxx,
+       lib/UnicodeCodingSystem.cxx, lib/UnivCharsetDesc.cxx,
+       lib/Win32CodingSystem.cxx, lib/WinInetStorage.cxx,
+       lib/WinInetStorageMessages.msg, lib/xentmgr_inst.m4,
+       nsgmls/NsgmlsMessages.msg, nsgmls/RastEventHandler.cxx,
+       nsgmls/RastEventHandler.h, nsgmls/RastEventHandlerMessages.msg,
+       nsgmls/SgmlsEventHandler.cxx, nsgmls/SgmlsEventHandler.h,
+       nsgmls/StringSet.cxx, nsgmls/StringSet.h, nsgmls/nsgmls.cxx,
+       nsgmls/nsgmls.rc, nsgmls/nsgmls_inst.m4, pubtext/HTML32.dcl,
+       pubtext/HTML32.dtd, pubtext/HTML32.soc, pubtext/ISOlat1.ent,
+       pubtext/ISOlat1.sgm, pubtext/html-1.dtd, pubtext/html-1s.dtd,
+       pubtext/html-s.dtd, pubtext/html.dcl, pubtext/html.dtd,
+       pubtext/html.soc, sgmlnorm/SGMLGenerator.cxx,
+       sgmlnorm/SGMLGenerator.h, sgmlnorm/sgmlnorm.cxx,
+       spam/CopyEventHandler.cxx, spam/CopyEventHandler.h,
+       spam/MarkupEventHandler.cxx, spam/MarkupEventHandler.h,
+       spam/SpamMessages.msg, spam/spam.cxx, spam/spam.rc,
+       spam/spam_inst.m4, spent/spent.cxx, spgrove/GroveApp.cxx,
+       spgrove/GroveApp.h, style/Collector.cxx, style/FlowObj_inst.m4,
+       unicode/catalog, unicode/demo.sgm, unicode/gensyntax.pl,
+       unicode/unicode.sd, unicode/unicode.syn: Jade 0.5
+
+1999-05-02 13:49  Avi
+
+       * jade.mak, style/Collector.h: Jade 0.4
+
+1999-05-02 13:48  Avi
+
+       * jade.mak: Jade 0.3
+
+1999-05-02 13:40  Avi
+
+       * jade.mak: Jade 0.2
+
+1999-05-02 13:39  Avi
+
+       * jade-generate.mak, dsssl/catalog, dsssl/style-sheet.dtd,
+       grove/Node.cxx, grove/Node.h, jade/RtfFOTBuilder.cxx,
+       jade/SgmlFOTBuilder.cxx, jade/TeXFOTBuilder.cxx, spgrove/threads.h,
+       style/DssslSpecEventHandler.cxx, style/DssslSpecEventHandler.h,
+       style/ELObj.cxx, style/ELObj.h, style/common_inst.m4,
+       style/EvalContext.h, style/Expression.cxx, style/FOTBuilder.cxx,
+       style/FOTBuilder.h, style/FlowObj.cxx, style/InheritedC.cxx,
+       style/Insn.cxx, style/Insn2.h, style/Interpreter.h,
+       style/ProcessContext.cxx, style/ProcessContext.h,
+       style/SosofoObj.h, style/Style.cxx, style/Style.h,
+       style/StyleEngine.cxx, style/StyleEngine.h, style/primitive.h:
+       Initial revision
+
+1999-05-02 13:39  Avi
+
+       * jade.mak, dsssl/demo.dsl, dsssl/demo.sgm, dsssl/dsssl.dtd,
+       jade/HtmlFOTBuilder.cxx, jade/HtmlFOTBuilder.h,
+       jade/HtmlFOTBuilder_inst.m4, jade/HtmlMessages.msg,
+       jade/JadeMessages.msg, jade/RtfFOTBuilder.h,
+       jade/RtfFOTBuilder_inst.m4, jade/SgmlFOTBuilder.h,
+       jade/TeXFOTBuilder.h, jade/jade.rc, jadedist/files.txt,
+       spgrove/GroveApp.cxx, spgrove/GroveApp.h, spgrove/GroveBuilder.h,
+       spgrove/grove_inst.m4, style/Collector.cxx, style/Collector.h,
+       style/dsssl_ns.h, style/ELObjMessageArg.cxx,
+       style/ELObjMessageArg.h, style/Expression.h, style/FlowObj_inst.m4,
+       style/Insn.h, style/NumberCache.cxx, style/NumberCache.h,
+       style/ProcessingMode.cxx, style/ProcessingMode.h, style/VM.h,
+       style/style_pch.h, style/stylelib.cxx, style/stylelib.h: Jade 0.1
+
diff --git a/FILES b/FILES
new file mode 100644 (file)
index 0000000..ff24263
--- /dev/null
+++ b/FILES
@@ -0,0 +1,462 @@
+COPYING
+FILES
+Makefile
+Makefile.comm
+Makefile.lib
+Makefile.lib.CC
+Makefile.lib.sun
+Makefile.prog
+Makefile.wat
+README
+SP.dsw
+SP.mak
+VERSION
+all/README
+doc/Makefile
+doc/archform.htm
+doc/build.htm
+doc/catalog
+doc/catalog.htm
+doc/charset.htm
+doc/features.htm
+doc/generic.htm
+doc/ideas.htm
+doc/index.htm
+doc/new.htm
+doc/nsgmls.htm
+doc/sgmldecl.htm
+doc/sgmlnorm.htm
+doc/sgmlsout.htm
+doc/spam.htm
+doc/spent.htm
+doc/sx.htm
+doc/sysdecl.htm
+doc/sysid.htm
+doc/xml.htm
+generic/EventGenerator.h
+generic/ParserEventGeneratorKit.h
+generic/SGMLApplication.h
+pubtext/ISOlat1.ent
+pubtext/ISOlat1.sgm
+pubtext/html.soc
+pubtext/html-1.dtd
+pubtext/html-1s.dtd
+pubtext/html-s.dtd
+pubtext/html.dcl
+pubtext/html.dtd
+pubtext/HTML32.dcl
+pubtext/HTML32.dtd
+pubtext/HTML32.soc
+pubtext/HTML4.dcl
+pubtext/HTML4-s.dtd
+pubtext/HTML4.dtd
+pubtext/HTML4.soc
+pubtext/HTML4-f.dtd
+pubtext/HTMLlat1.ent
+pubtext/HTMLspec.ent
+pubtext/HTMLsym.ent
+pubtext/xml.dcl
+pubtext/xml.soc
+include/Allocator.h
+include/ArcEngine.h
+include/Attribute.h
+include/Attributed.h
+include/Big5CodingSystem.h
+include/Boolean.h
+include/CharMap.cxx
+include/CharMap.h
+include/CharsetDecl.h
+include/CharsetInfo.h
+include/CharsetRegistry.h
+include/CmdLineApp.h
+include/CodingSystem.h
+include/CodingSystemKit.h
+include/ConsoleOutput.h
+include/ContentState.h
+include/ContentToken.h
+include/CopyOwner.cxx
+include/CopyOwner.h
+include/DescriptorManager.h
+include/Dtd.h
+include/EUCJPCodingSystem.h
+include/ElementType.h
+include/Entity.h
+include/EntityApp.h
+include/EntityCatalog.h
+include/EntityDecl.h
+include/EntityManager.h
+include/ErrnoMessageArg.h
+include/ErrorCountEventHandler.h
+include/Event.h
+include/EventsWanted.h
+include/ExtendEntityManager.h
+include/ExternalId.h
+include/Fixed2CodingSystem.h
+include/GenericEventHandler.h
+include/Hash.h
+include/HashTable.cxx
+include/HashTable.h
+include/HashTableItemBase.cxx
+include/HashTableItemBase.h
+include/IList.h
+include/IListBase.h
+include/IListIter.h
+include/IListIterBase.h
+include/IQueue.cxx
+include/IQueue.h
+include/ISet.cxx
+include/ISet.h
+include/ISetIter.h
+include/IdentityCodingSystem.h
+include/InputSource.h
+include/InternalInputSource.h
+include/Link.h
+include/LinkProcess.h
+include/List.cxx
+include/List.h
+include/ListIter.h
+include/LiteralStorage.h
+include/Location.h
+include/Lpd.h
+include/Markup.h
+include/Message.h
+include/MessageArg.h
+include/MessageBuilder.h
+include/MessageEventHandler.h
+include/MessageFormatter.h
+include/MessageReporter.h
+include/MessageTable.h
+include/Mode.h
+include/NCVector.h
+include/NCVector.sed
+include/Named.h
+include/NamedResource.h
+include/NamedResourceTable.h
+include/NamedTable.h
+include/Notation.h
+include/NotationStorage.h
+include/OpenElement.h
+include/Options.cxx
+include/Options.h
+include/OutputByteStream.h
+include/OutputCharStream.h
+include/Owner.cxx
+include/Owner.h
+include/OwnerTable.cxx
+include/OwnerTable.h
+include/ParserApp.h
+include/ParserOptions.h
+include/PointerTable.cxx
+include/PointerTable.h
+include/PosixStorage.h
+include/Ptr.cxx
+include/Ptr.h
+include/RangeMap.cxx
+include/RangeMap.h
+include/Resource.h
+include/RewindStorageObject.h
+include/SJISCodingSystem.h
+include/SOEntityCatalog.h
+include/Sd.h
+include/SdText.h
+include/SearchResultMessageArg.h
+include/SgmlParser.h
+include/ShortReferenceMap.h
+include/StdioStorage.h
+include/StorageManager.h
+include/StringC.h
+include/StringOf.cxx
+include/StringOf.h
+include/StringResource.h
+include/SubstTable.cxx
+include/SubstTable.h
+include/Syntax.h
+include/Text.h
+include/TranslateCodingSystem.h
+include/TypeId.h
+include/URLStorage.h
+include/UTF8CodingSystem.h
+include/UnicodeCodingSystem.h
+include/UnivCharsetDesc.h
+include/Vector.cxx
+include/Vector.h
+include/Win32CodingSystem.h
+include/WinApp.h
+include/WinInetStorage.h
+include/XMLCodingSystem.h
+include/XcharMap.cxx
+include/XcharMap.h
+include/config.h
+include/constant.h
+include/macros.h
+include/rtti.h
+include/sptchar.h
+include/types.h
+include/xnew.h
+japan.sgmldecl
+lib/Allocator.cxx
+lib/ArcEngine.cxx
+lib/ArcEngineMessages.h
+lib/ArcEngineMessages.msg
+lib/ArcEngineMessages.rc
+lib/ArcProcessor.h
+lib/Attribute.cxx
+lib/Big5CodingSystem.cxx
+lib/CatalogEntry.h
+lib/CatalogMessages.msg
+lib/CatalogMessages.rc
+lib/CatalogMessages.h
+lib/CharsetDecl.cxx
+lib/CharsetInfo.cxx
+lib/CharsetRegistry.cxx
+lib/CmdLineApp.cxx
+lib/CmdLineAppMessages.h
+lib/CmdLineAppMessages.msg
+lib/CmdLineAppMessages.rc
+lib/CodingSystem.cxx
+lib/CodingSystemKit.cxx
+lib/ConsoleOutput.cxx
+lib/ContentState.cxx
+lib/ContentToken.cxx
+lib/DescriptorManager.cxx
+lib/Dtd.cxx
+lib/EUCJPCodingSystem.cxx
+lib/ElementType.cxx
+lib/Entity.cxx
+lib/EntityApp.cxx
+lib/EntityCatalog.cxx
+lib/EntityDecl.cxx
+lib/EntityManager.cxx
+lib/EntityManagerMessages.msg
+lib/EntityManagerMessages.rc
+lib/EntityManagerMessages.h
+lib/EquivClass.h
+lib/ErrnoMessageArg.cxx
+lib/ErrorCountEventHandler.cxx
+lib/Event.cxx
+lib/EventGenerator.cxx
+lib/EventQueue.h
+lib/ExtendEntityManager.cxx
+lib/ExternalId.cxx
+lib/Fixed2CodingSystem.cxx
+lib/GenericEventHandler.cxx
+lib/Group.cxx
+lib/Group.h
+lib/Hash.cxx
+lib/IListBase.cxx
+lib/Id.cxx
+lib/Id.h
+lib/IdentityCodingSystem.cxx
+lib/InputSource.cxx
+lib/InternalInputSource.cxx
+lib/Link.cxx
+lib/LinkProcess.cxx
+lib/LiteralStorage.cxx
+lib/Location.cxx
+lib/Lpd.cxx
+lib/LpdEntityRef.h
+lib/Makefile.sub
+lib/Markup.cxx
+lib/MarkupScan.h
+lib/Message.cxx
+lib/MessageArg.cxx
+lib/MessageEventHandler.cxx
+lib/MessageFormatter.cxx
+lib/MessageFormatterMessages.h
+lib/MessageFormatterMessages.msg
+lib/MessageFormatterMessages.rc
+lib/MessageReporter.cxx
+lib/MessageReporterMessages.h
+lib/MessageReporterMessages.msg
+lib/MessageReporterMessages.rc
+lib/MessageTable.cxx
+lib/ModeInfo.cxx
+lib/ModeInfo.h
+lib/Mutex.h
+lib/NameToken.h
+lib/Notation.cxx
+lib/NotationStorage.cxx
+lib/NumericCharRefOrigin.cxx
+lib/NumericCharRefOrigin.h
+lib/OffsetOrderedList.cxx
+lib/OffsetOrderedList.h
+lib/OpenElement.cxx
+lib/OutputByteStream.cxx
+lib/OutputCharStream.cxx
+lib/OutputState.cxx
+lib/OutputState.h
+lib/Param.cxx
+lib/Param.h
+lib/Parser.cxx
+lib/Parser.h
+lib/ParserApp.cxx
+lib/ParserAppMessages.h
+lib/ParserAppMessages.msg
+lib/ParserAppMessages.rc
+lib/ParserEventGeneratorKit.cxx
+lib/ParserMessages.cxx
+lib/ParserMessages.msg
+lib/ParserMessages.rc
+lib/ParserMessages.h
+lib/ParserOptions.cxx
+lib/ParserState.cxx
+lib/ParserState.h
+lib/Partition.cxx
+lib/Partition.h
+lib/PosixStorage.cxx
+lib/PosixStorageMessages.msg
+lib/PosixStorageMessages.rc
+lib/PosixStorageMessages.h
+lib/Priority.h
+lib/Recognizer.cxx
+lib/Recognizer.h
+lib/RewindStorageObject.cxx
+lib/SJISCodingSystem.cxx
+lib/SOEntityCatalog.cxx
+lib/Sd.cxx
+lib/SdFormalError.h
+lib/SdText.cxx
+lib/SearchResultMessageArg.cxx
+lib/SgmlParser.cxx
+lib/SGMLApplication.cxx
+lib/ShortReferenceMap.cxx
+lib/SrInfo.h
+lib/StdioStorage.cxx
+lib/StdioStorageMessages.msg
+lib/StdioStorageMessages.rc
+lib/StdioStorageMessages.h
+lib/StorageManager.cxx
+lib/StorageObjectPosition.h
+lib/StringVectorMessageArg.cxx
+lib/StringVectorMessageArg.h
+lib/Syntax.cxx
+lib/Text.cxx
+lib/TokenMessageArg.cxx
+lib/TokenMessageArg.h
+lib/TranslateCodingSystem.cxx
+lib/Trie.h
+lib/TrieBuilder.cxx
+lib/TrieBuilder.h
+lib/TypeId.cxx
+lib/URLStorage.cxx
+lib/URLStorageMessages.msg
+lib/URLStorageMessages.rc
+lib/URLStorageMessages.h
+lib/UTF8CodingSystem.cxx
+lib/Undo.cxx
+lib/Undo.h
+lib/UnicodeCodingSystem.cxx
+lib/UnivCharsetDesc.cxx
+lib/Win32CodingSystem.cxx
+lib/WinApp.cxx
+lib/WinInetStorage.cxx
+lib/WinInetStorageMessages.msg
+lib/WinInetStorageMessages.rc
+lib/WinInetStorageMessages.h
+lib/XMLCodingSystem.cxx
+lib/app_inst.cxx
+lib/app_inst.m4
+lib/arc_inst.cxx
+lib/arc_inst.m4
+lib/assert.cxx
+lib/big5.h
+lib/entmgr_inst.cxx
+lib/entmgr_inst.m4
+lib/events.h
+lib/instmac.m4
+lib/gb2312.h
+lib/iso646-jis.h
+lib/iso8859-2.h
+lib/iso8859-3.h
+lib/iso8859-4.h
+lib/iso8859-5.h
+lib/iso8859-6.h
+lib/iso8859-7.h
+lib/iso8859-8.h
+lib/iso8859-9.h
+lib/jis0201.h
+lib/jis0208.h
+lib/jis0212.h
+lib/ksc5601.h
+lib/lib.dsp
+lib/lib.rc
+lib/memmove.c
+lib/mkversion.pl
+lib/parseAttribute.cxx
+lib/parseCommon.cxx
+lib/parseDecl.cxx
+lib/parseInstance.cxx
+lib/parseMode.cxx
+lib/parseParam.cxx
+lib/parseSd.cxx
+lib/parser_inst.cxx
+lib/parser_inst.m4
+lib/splib.cxx
+lib/splib.h
+lib/splibpch.h
+lib/strerror.c
+lib/token.h
+lib/version.h
+lib/xentmgr_inst.cxx
+lib/xentmgr_inst.m4
+msggen.pl
+nsgmls/Makefile.sub
+nsgmls/NsgmlsMessages.h
+nsgmls/NsgmlsMessages.msg
+nsgmls/NsgmlsMessages.rc
+nsgmls/RastEventHandler.cxx
+nsgmls/RastEventHandler.h
+nsgmls/RastEventHandlerMessages.h
+nsgmls/RastEventHandlerMessages.msg
+nsgmls/RastEventHandlerMessages.rc
+nsgmls/SgmlsEventHandler.cxx
+nsgmls/SgmlsEventHandler.h
+nsgmls/StringSet.cxx
+nsgmls/StringSet.h
+nsgmls/nsgmls.cxx
+nsgmls/nsgmls.dsp
+nsgmls/nsgmls.rc
+nsgmls/nsgmls_inst.cxx
+nsgmls/nsgmls_inst.m4
+sgmlnorm/Makefile.sub
+sgmlnorm/SGMLGenerator.cxx
+sgmlnorm/SGMLGenerator.h
+sgmlnorm/sgmlnorm.cxx
+sgmlnorm/sgmlnorm.dsp
+spam/CopyEventHandler.cxx
+spam/CopyEventHandler.h
+spam/MarkupEventHandler.cxx
+spam/MarkupEventHandler.h
+spam/SpamMessages.h
+spam/SpamMessages.msg
+spam/SpamMessages.rc
+spam/Makefile.sub
+spam/spam.cxx
+spam/spam.dsp
+spam/spam.rc
+spam/spam_inst.cxx
+spam/spam_inst.m4
+spent/Makefile.sub
+spent/spent.cxx
+spent/spent.dsp
+sp-generate.mak
+sunfix.sh
+sx/Makefile.sub
+sx/SxMessages.h
+sx/SxMessages.msg
+sx/SxMessages.rc
+sx/XmlOutputEventHandler.cxx
+sx/XmlOutputEventHandler.h
+sx/XmlOutputMessages.h
+sx/XmlOutputMessages.msg
+sx/XmlOutputMessages.rc
+sx/sx.cxx
+sx/sx.dsp
+sx/sx.rc
+sx/sx_inst.cxx
+sx/sx_inst.m4
+unicode/catalog
+unicode/demo.sgm
+unicode/gensyntax.pl
+unicode/unicode.sd
+unicode/unicode.syn
diff --git a/Makefile.comm.in b/Makefile.comm.in
new file mode 100644 (file)
index 0000000..24d17a4
--- /dev/null
@@ -0,0 +1,80 @@
+#
+#  Makefile.sub.in - Common rules and definitions
+#
+#  $Id: Makefile.comm.in,v 1.5.10.5 2002/12/01 11:56:47 icastle Exp $
+#
+#  Copyright (C) 1998 Cees de Groot <cg@sgmltools.org>
+#
+
+top_builddir=@TOP@
+TOP=@TOP@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+srcdir=@srcdir@
+bindir=@bindir@
+libdir=@libdir@
+datadir=@datadir@
+mandir=@mandir@
+spincludedir=@SPINCLUDEDIR@
+splibdir=@SPLIBDIR@
+
+CXX=@CXX@
+CC=@CC@
+PERL=@PERL@
+LIBTOOL=@LIBTOOL@
+INSTALL=@INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+
+LIBS=@LIBS@
+DEFS=@DEFS@ -DDEFAULT_SCHEME_BUILTINS=\"${datadir}/builtins.dsl\"
+INCS=-I$(srcdir) -I$(srcdir)/../include -I$(spincludedir) -I$(spincludedir)/.. $(INCLUDE)
+CXXFLAGS=@CXXFLAGS@ $(INCS) $(DEBUG) $(DEFS)
+CFLAGS=@CFLAGS@ $(DEBUG) $(DEFS)
+LDFLAGS=@LDFLAGS@
+MSGGENFLAGS= -l jstyleModule
+CXXDEPGENFLAGS=-MM
+
+.SUFFIXES: .cxx .c .o .m4 .msg .lo
+
+.cxx.o:
+       $(CXX) $(CXXFLAGS) -c $<
+
+.cxx.lo:
+       @$(LIBTOOL) --mode=compile $(CXX) $(CXXFLAGS) -c $<
+
+.c.o:
+       $(CC) $(CFLAGS) -c $<
+
+.c.lo:
+       @$(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c $<
+
+.m4.cxx:
+       rm -f $@
+       $(PERL) $(srcdir)/../instmac.pl $< >$@
+       chmod -w $@
+
+%.h %.cxx %.rc: %.msg
+       $(PERL) -w $(srcdir)/../msggen.pl $(MSGGENFLAGS) $<
+
+.msg.h:
+       $(PERL) -w $(srcdir)/../msggen.pl $(MSGGENFLAGS) $<
+
+depend_src: depend.temp
+       mv depend.temp Makefile.dep
+
+depend.temp: FORCE
+       $(CXX) -MM $(CXXFLAGS) $(CXXDEPGENFLAGS) $(OBJS:.o=.cxx) \
+         | sed -e 's; \([^/ ][^/ ]*\)/; $$(srcdir)/\1/;g' >depend.temp1
+       cat depend.temp1 > depend.temp
+       cat depend.temp1 | sed -e 's/\.o:/.lo:/g' >> depend.temp
+       rm depend.temp1
+
+clean: FORCE
+       -rm -f $(CLEANFILES)
+
+FORCE:
+
+%: RCS/%,v
+       test -w $@ || co -u $@
diff --git a/Makefile.in b/Makefile.in
new file mode 100644 (file)
index 0000000..7b9d5f4
--- /dev/null
@@ -0,0 +1,162 @@
+#
+#  Makefile.in - Makefile template for Jade
+# 
+#  $Id: Makefile.in,v 1.4.4.7 2002/12/01 15:57:32 icastle Exp $
+#
+#  Copyright (C) 1998 Cees A. de Groot
+#
+
+# Original SP Makefile.in Copyright (C) 1996 Henry S. Thompson
+# Original SP Makefile Copyright (c) 1994, 1995, 1996 James Clark
+
+SHELL=@SHELL@
+top_builddir=@TOP@
+TOP=@TOP@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+srcdir=@srcdir@
+bindir=@bindir@
+datadir=@datadir@
+libdir=@libdir@
+mandir=@mandir@
+includedir=@includedir@
+oldincludedir=/usr/include
+spincludedir=@SPINCLUDEDIR@
+splibdir=@SPLIBDIR@
+
+DESTDIR=
+
+LIBTOOL=@LIBTOOL@
+LIBTOOL_DEPS=@LIBTOOL_DEPS@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+mkinstalldirs = $(SHELL) $(TOP)/config/mkinstalldirs
+man1dir=$(mandir)/man1
+
+man_MANS = openjade.1
+
+MANS = $(man_MANS)
+
+SP_LIBDIRS=$(splibdir) $(XLIBDIRS)
+LIBDIRS=grove spgrove style
+PROGDIRS=jade
+dodirs=$(LIBDIRS) $(PROGDIRS)
+
+# Automatic template instantiation can cause compilers to generate
+# various extra files; the clean target won't delete these.
+TARGETS=all install depend gen clean pure 
+do=all
+
+$(TARGETS): FORCE
+       @$(MAKE) -f Makefile do=$@ $(dodirs)
+       @if test $@ = 'install'; then \
+         $(LIBTOOL) --finish $(DESTDIR)$(libdir); \
+         mkdir -p $(DESTDIR)$(datadir); \
+         cp -f dsssl/builtins.dsl $(DESTDIR)$(datadir); \
+       fi;
+
+$(LIBDIRS): FORCE
+       @if test $(srcdir) = .; \
+       then srcdir=.; \
+       else srcdir=`cd $(srcdir); pwd`/$@; \
+       fi; \
+       test -d $@ || mkdir $@; \
+       cd $@; \
+       test -f $$srcdir/Makefile.dep || touch $$srcdir/Makefile.dep; \
+       test -f $$srcdir/Makefile.lt || \
+           $(MAKE) srcdir=$$srcdir VPATH=$$srcdir \
+               -f $$srcdir/../Makefile.comm -f $$srcdir/Makefile.sub \
+               -f $$srcdir/../Makefile.lib -f $$srcdir/Makefile.dep \
+               Makefile.lt; \
+       $(MAKE) srcdir=$$srcdir VPATH=$$srcdir \
+               -f $$srcdir/../Makefile.comm -f $$srcdir/Makefile.sub \
+               -f $$srcdir/Makefile.lt -f $$srcdir/../Makefile.lib \
+               -f $$srcdir/Makefile.dep $(do)
+
+$(PROGDIRS): FORCE
+       @if test $(srcdir) = .; \
+       then srcdir=.; \
+       else srcdir=`cd $(srcdir); pwd`/$@; \
+       fi; \
+       test -d $@ || mkdir $@; \
+       cd $@; \
+       test -f $$srcdir/Makefile.dep || touch $$srcdir/Makefile.dep; \
+       test -f $$srcdir/Makefile.lt || \
+           $(MAKE) srcdir=$$srcdir VPATH=$$srcdir \
+               -f $$srcdir/../Makefile.comm -f $$srcdir/Makefile.sub \
+               -f $$srcdir/../Makefile.prog -f $$srcdir/Makefile.dep \
+               Makefile.lt; \
+       $(MAKE) srcdir=$$srcdir VPATH=$$srcdir \
+               -f $$srcdir/../Makefile.comm -f $$srcdir/Makefile.sub \
+               -f $$srcdir/Makefile.lt -f $$srcdir/../Makefile.prog \
+               -f $$srcdir/Makefile.dep $(do)
+
+$(PROGDIRS): $(SP_LIBDIRS)
+
+jade: grove spgrove style
+
+spgrove: grove
+
+style: grove spgrove
+
+# GNU tar
+TAR=tar
+
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+
+dist: FORCE
+       cd test; ./CLEAN
+       version=`cat VERSION`; \
+       rm -fr sp-$$version; \
+       mkdir sp-$$version; \
+       cd sp-$$version; \
+       ln -s ../* .; \
+       rm sp-$$version; \
+       rm SP.mak ; \
+       sed -e '/^   CD /s/[A-Z]:\\.*\\//' -e "s/$$/`echo @ | tr @ \\\\015`/" \
+         ../SP.mak >SP.mak; \
+       cd ..; \
+       ln -s `pwd` sp-$$version; \
+       $(TAR) -c -f sp-$$version.tar.gz -h -z \
+         --exclude sp-$$version/test/cap \
+         --exclude sp-$$version/test/out \
+         --exclude sp-$$version/test/err \
+         `sed -e "s|.*|sp-$$version/&|" FILES`; \
+       rm -fr sp-$$version
+
+mrproper:
+       -rm -f Makefile Makefile.comm Makefile.lib Makefile.prog \
+               config.cache config.log config.status
+       -test -f Makefile.dist && mv Makefile.dist Makefile
+       -test -f Makefile.comm.dist && mv Makefile.comm.dist Makefile.comm
+       -test -f Makefile.prog.dist && mv Makefile.prog.dist Makefile.prog
+       -test -f Makefile.lib.dist && mv Makefile.lib.dist Makefile.lib
+
+FORCE:
+
+libtool: $(LIBTOOL_DEPS)
+       $(SHELL) ./config.status --recheck
+
+install-man:
+       $(mkinstalldirs) $(DESTDIR)$(man1dir)
+       @list='$(man1_MANS)'; \
+       l2='$(man_MANS)'; for i in $$l2; do \
+         case "$$i" in \
+           *.1*) list="$$list $$i" ;; \
+         esac; \
+       done; \
+       for i in $$list; do \
+         if test -f $(TOP)/docsrc/$$i; then file=$(TOP)/docsrc/$$i; \
+         else file=$$i; fi; \
+         ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+         inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+         inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+          echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \
+         $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \
+       done
diff --git a/Makefile.lib.CC b/Makefile.lib.CC
new file mode 100644 (file)
index 0000000..eb22233
--- /dev/null
@@ -0,0 +1,24 @@
+all pure: lib$(LIB).a
+
+# FIXME needs also to depend on template files
+
+REPOSITORY=ptrepository
+lib$(LIB).a: $(OBJS) $(COBJS) $(DEPLIBS)
+       - $(CXX) $(ALL_CXXFLAGS) $(OBJS) $(COBJS) $(DEPLIBS)
+       -rm -f a.out
+       if test -d $(REPOSITORY); then \
+         i=1; \
+         tmpdir=/tmp/ar.$$$$; \
+         rm -fr $$tmpdir; \
+         mkdir $$tmpdir; \
+         for o in $(REPOSITORY)/*.o; do \
+           cp $$o $$tmpdir/$$i.o; \
+           i=`expr $$i + 1`; \
+         done ; \
+         $(AR) r $@ $$tmpdir/*.o ; \
+       fi
+       $(AR) r $@ $?
+
+depend: depend_src
+depend.temp: $(GENSRCS)
+gen: $(GENSRCS)
diff --git a/Makefile.lib.in b/Makefile.lib.in
new file mode 100644 (file)
index 0000000..c0cefd9
--- /dev/null
@@ -0,0 +1,35 @@
+#
+#  Makefile.lib.in - Makerules for building libraries
+#
+#  $Id: Makefile.lib.in,v 1.2.4.1.2.4 2002/01/22 11:57:53 icastle Exp $
+#
+#  Copyright (C) 1998 Cees A. de Groot
+#
+
+CLEANFILES=-r lib$(LIB).la $(OBJS) $(COBJS) $(LT_OBJS) core .libs Makefile.lt
+
+top_builddir=@TOP@
+LIB_THREADS=@LIB_THREADS@
+mkinstalldirs = $(SHELL) $(TOP)/config/mkinstalldirs
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+transform = @program_transform_name@
+LINKFLAGS = @LINKFLAGS@
+
+all: lib$(LIB).la
+pure: all
+
+Makefile.lt:
+       echo 'LT_OBJS='`echo $(OBJS)|sed 's/\.o/.lo/g'` >Makefile.lt
+
+lib$(LIB).la: $(LT_OBJS)
+       $(LIBTOOL) --mode=link $(CC) $(LINKFLAGS) -o lib$(LIB).la $(LT_OBJS) \
+           -rpath $(libdir) -version-info $(LTVERSION) $(DEPLIBS)
+
+install:
+       $(mkinstalldirs) $(DESTDIR)$(libdir)
+       $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) lib$(LIB).la $(DESTDIR)$(libdir)
+
+depend: depend_src
+depend.temp: $(GENSRCS)
+gen: $(GENSRCS)
diff --git a/Makefile.lib.sun b/Makefile.lib.sun
new file mode 100644 (file)
index 0000000..264b756
--- /dev/null
@@ -0,0 +1,12 @@
+CLEANFILES=lib$(LIB).a $(OBJS) $(COBJS) core
+
+all: lib$(LIB).a
+
+lib$(LIB).a: $(OBJS) $(COBJS) $(DEPLIBS)
+       $(CXX) $(ALL_CXXFLAGS) -xar -o $@ $(OBJS) $(COBJS) $(DEPLIBS)
+
+install:
+install-man:
+depend: depend_src
+depend.temp: $(GENSRCS)
+gen: $(GENSRCS)
diff --git a/Makefile.prog.in b/Makefile.prog.in
new file mode 100644 (file)
index 0000000..76310c9
--- /dev/null
@@ -0,0 +1,32 @@
+#
+#  Makefile.prog.in - Makerules for bilding programs
+#
+#  $Id: Makefile.prog.in,v 1.1.1.2.6.1.2.3 2002/01/22 11:57:53 icastle Exp $
+#
+#  Copyright (C) 1998 Cees A. de Groot
+#
+CLEANFILES=-r $(PROG) $(OBJS) core .libs Makefile.lt
+
+top_builddir=@TOP@
+LINKFLAGS = @LINKFLAGS@
+
+ALL_LIBS = $(XLIBS) $(LIBS)
+Makefile.lt:
+       echo 'LT_LIBS='`echo $(ALL_LIBS)|sed 's/\.a/.la/g'` >Makefile.lt
+
+PROG:=$(shell echo "$(PROG)" | sed '@program_transform_name@')
+
+all: $(PROG)
+
+$(PROG): $(OBJS) $(COBJS) $(LT_LIBS)
+       $(LIBTOOL) --mode=link $(CXX) $(LINKFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(COBJS) $(LT_LIBS)
+
+install: $(PROG)
+       -test -d $(DESTDIR)$(bindir) || \
+         (mkdir $(DESTDIR)$(bindir); chmod 755 $(DESTDIR)$(bindir))
+       -rm -f $(DESTDIR)$(bindir)/$(PROG)
+       $(LIBTOOL) --mode=install $(INSTALL) $(PROG) $(DESTDIR)$(bindir)
+
+depend: depend_src
+depend.temp: $(GENSRCS)
+gen: $(GENSRCS)
diff --git a/Makefile.wat b/Makefile.wat
new file mode 100644 (file)
index 0000000..5671e9b
--- /dev/null
@@ -0,0 +1,149 @@
+# Copyright (c) 1994, 1995 James Clark
+# See the file COPYING for copying permission.
+
+# Makefile for Watcom C/C++ 10.5a
+CXX=wcl386
+srcdir=..
+TARGET=dos
+LINK_SYSTEM=dos4g
+STACK_SIZE=128k
+OPTIMIZE=/otx /zp4 /4
+SEARCHPATH=$(srcdir)\include;$(srcdir)\lib;$(srcdir)\generic;$(srcdir)\nsgmls;$(srcdir)\spam;$(srcdir)\sgmlnorm;$(srcdir)\spent
+CXXFLAGS=/bt=$(TARGET) /zq $(OPTIMIZE) /i=$(SEARCHPATH)
+LIBFLAGS=-p=32
+LDFLAGS=/l=$(LINK_SYSTEM) /k$(STACK_SIZE)
+
+NSGMLS_OBJS=nsgmls.obj SgmlsEventHandler.obj RastEventHandler.obj &
+  StringSet.obj nsgmls_inst.obj
+SPAM_OBJS=spam.obj CopyEventHandler.obj MarkupEventHandler.obj spam_inst.obj
+SGMLNORM_OBJS=sgmlnorm.obj SGMLGenerator.obj
+SPENT_OBJS=spent.obj
+LIB_OBJS=Allocator.obj &
+  ArcEngine.obj &
+  Attribute.obj &
+  Big5CodingSystem.obj &
+  CharsetDecl.obj &
+  CharsetInfo.obj &
+  CharsetRegistry.obj &
+  CmdLineApp.obj &
+  CodingSystem.obj &
+  CodingSystemKit.obj &
+  ConsoleOutput.obj &
+  ContentState.obj &
+  ContentToken.obj &
+  DescriptorManager.obj &
+  Dtd.obj &
+  EUCJPCodingSystem.obj &
+  ElementType.obj &
+  Entity.obj &
+  EntityApp.obj &
+  EntityCatalog.obj &
+  EntityDecl.obj &
+  EntityManager.obj &
+  ErrnoMessageArg.obj &
+  ErrorCountEventHandler.obj &
+  Event.obj &
+  EventGenerator.obj &
+  ExtendEntityManager.obj &
+  ExternalId.obj &
+  Fixed2CodingSystem.obj &
+  GenericEventHandler.obj &
+  Group.obj &
+  Hash.obj &
+  IListBase.obj &
+  Id.obj &
+  IdentityCodingSystem.obj &
+  InputSource.obj &
+  InternalInputSource.obj &
+  Link.obj &
+  LinkProcess.obj &
+  LiteralStorage.obj &
+  Location.obj &
+  Lpd.obj &
+  Markup.obj &
+  Message.obj &
+  MessageArg.obj &
+  MessageEventHandler.obj &
+  MessageFormatter.obj &
+  MessageReporter.obj &
+  MessageTable.obj &
+  ModeInfo.obj &
+  Notation.obj &
+  NotationStorage.obj &
+  NumericCharRefOrigin.obj &
+  OffsetOrderedList.obj &
+  OpenElement.obj &
+  OutputByteStream.obj &
+  OutputCharStream.obj &
+  OutputState.obj &
+  Param.obj &
+  Parser.obj &
+  ParserApp.obj &
+  ParserEventGeneratorKit.obj &
+  ParserMessages.obj &
+  ParserOptions.obj &
+  ParserState.obj &
+  Partition.obj &
+  PosixStorage.obj &
+  Recognizer.obj &
+  RewindStorageObject.obj &
+  SJISCodingSystem.obj &
+  SOEntityCatalog.obj &
+  Sd.obj &
+  SdText.obj &
+  SearchResultMessageArg.obj &
+  SgmlParser.obj &
+  SGMLApplication.obj &
+  ShortReferenceMap.obj &
+  StdioStorage.obj &
+  StorageManager.obj &
+  StringVectorMessageArg.obj &
+  Syntax.obj &
+  Text.obj &
+  TokenMessageArg.obj &
+  TranslateCodingSystem.obj &
+  TrieBuilder.obj &
+  TypeId.obj &
+  URLStorage.obj &
+  UTF8CodingSystem.obj &
+  Undo.obj &
+  UnicodeCodingSystem.obj &
+  UnivCharsetDesc.obj &
+  Win32CodingSystem.obj &
+  app_inst.obj &
+  arc_inst.obj &
+  assert.obj &
+  entmgr_inst.obj &
+  parseAttribute.obj &
+  parseCommon.obj &
+  parseDecl.obj &
+  parseInstance.obj &
+  parseMode.obj &
+  parseParam.obj &
+  parseSd.obj &
+  parser_inst.obj &
+  xentmgr_inst.obj &
+
+LIB=libsp.lib
+
+all: nsgmls.exe spam.exe sgmlnorm.exe spent.exe
+
+nsgmls.exe: $(NSGMLS_OBJS) $(LIB)
+       $(CXX) $(NSGMLS_OBJS) $(LIB) /fe=$@ $(CXXFLAGS) $(LDFLAGS)
+
+spam.exe: $(SPAM_OBJS) $(LIB)
+       $(CXX) $(SPAM_OBJS) $(LIB) /fe=$@ $(CXXFLAGS) $(LDFLAGS)
+
+sgmlnorm.exe: $(SGMLNORM_OBJS) $(LIB)
+       $(CXX) $(SGMLNORM_OBJS) $(LIB) /fe=$@ $(CXXFLAGS) $(LDFLAGS)
+
+spent.exe: $(SPENT_OBJS) $(LIB)
+       $(CXX) $(SPENT_OBJS) $(LIB) /fe=$@ $(CXXFLAGS) $(LDFLAGS)
+
+$(LIB): $(LIB_OBJS)
+       wlib $(LIBFLAGS) $(LIB) $?
+
+.cxx.obj: .AUTODEPEND
+       $(CXX) $[@ /c $(CXXFLAGS)
+
+.cxx: $(SEARCHPATH)
diff --git a/NEWS b/NEWS
new file mode 100644 (file)
index 0000000..ebb7f0a
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,127 @@
+Changes in OpenJade 1.3.2 (December 2002)
+
+* Build against OpenSP 1.5
+
+* Minor fixes to MIF backend
+
+* Correct typo in definition of "attribute" in builtin.dsl (Toby Speight)
+
+* Fix quoted of ampersand in XML/SGML transformations (Toby Speight)
+
+Changes in OpenJade 1.3.1 (January 2002)
+
+* Support for newer GNU source configuration tools (autoconf, libtool, automake)
+
+* Support for newer GNU and Microsoft compilers
+
+* Support for more/up to date platforms (Mac OS X, Darwin, BSD, Cygwin etc.)
+
+* Numerous bug fixes to TeX backend for improved table support and two
+  sided output. Two new external procedures two control double sided
+  output (required by jadetex 3.4 or greater).
+
+  "UNREGISTERED::OpenJade//Characteristic::page-two-side?"
+  "UNREGISTERED::OpenJade//Characteristic::two-side-start-on-right?"
+
+* Support for XML Byte Order Marks
+
+Changes in OpenJade 1.3
+
+* The SGML backend will no emit linebreaks when used as -t sgml-raw.
+
+* Jade can bind variables to arbitrary values on the command line. 
+
+* The prlabs1 module of the SGML property set is supported.
+
+* Style sheet extensions.dsl lists all known
+  external procedures ready for easy inclusion
+  as an external-specification.
+
+* External procedure with public identifier
+  "UNREGISTERED::OpenJade//Procedure::expt"
+  allows to form integral powers of quantities.
+  
+* External procedure with public identifier
+  "UNREGISTERED::OpenJade//Procedure::sgml-parse"
+  allows to parse wrt. an architecture.
+
+* Jade supports force! for inherited characteristics.
+
+* Jade supports character properties.
+* Jade supports special-query-expressions.
+
+* Jade can bind variables to string values on the command line.
+
+* All standard color spaces supported. 
+
+* Jade ignores duplicate keywords in make expressions, as 
+  mandated by DSSSL.
+
+* External procedure with public identifier
+  "UNREGISTERED::OpenJade//Procedure::language"
+  to create a language object by reference to a POSIX locale.
+* Language-dependent procedures of the expression language:
+  language?, current-language, declare-default-language, 
+  with-language, define-language, char<?, char>?, char<=?,
+  char>=?, char-ci=?, char-ci<?, char-ci>?, char-ci<=?,
+  char-ci>=?, char-upcase, char-downcase, string-ci=?,
+  string-equiv?, string<?, string>?, string<=?, string>=?,
+  string-ci<?, string-ci>?, string-ci<=?, string-ci>=?.
+
+* The style-sheet.dtd derived from the dsssl architecture
+  has been extended (in a backwards compatible way) to
+  include the delaration element type forms supported by
+  Jade. The public identifier for the dtd is 
+
+  "-//OpenJade//DTD DSSSL Style Sheet//EN" 
+  
+* char-repertoire, add-name-chars and add-separator-chars
+  declaration element type forms are supported. When given
+  the -s cmdline flag, Jade doesn't use its builtin 
+  character repertoire.
+  
+* Most of the derived procedures in the query language:
+  current-root, node-list-reduce, node-list-contains?,
+  node-list-remove-duplicates, node-list-union, 
+  node-list-intersection, node-list-difference, 
+  node-list-symmetric-difference, node-list-union-map,
+  node-list-some?, node-list-every?, node-list-filter,
+  node-list->list, node-list-tail, node-list-head,
+  node-list-sublist, node-list-count, node-list-last,
+  node-list-property, origin, origin-to-subnode-rel,
+  tree-root, grove-root, source, subtree, subgrove,
+  ancestors, grove-root-path, rsiblings, ipreced,
+  ifollow, grove-before?, sort-in-tree-order, tree-before?,
+  tree-before, property-lookup, select-by-property, 
+  select-by-null-property, select-by-missing-property,
+  attribute, referent, q-element, q-class, q-sdata.
+  
+Changes in OpenJade 1.2.2 
+
+* The HTML and MIF backends are now enabled by default.
+
+* The TeX backend has support for PDF bookmarks. This is
+  supported by the new version of jadetex which is included.
+
+* Predefined character names line-feed and carriage-return 
+  for the character numbers 10 and 13.
+
+* standard-chars and map-sdata-entity declaration element
+  type forms are supported.
+
+* Style language additions: map-constructor.
+* + and - return a length-spec if any of there arguments
+  is a length-spec.
+
+* Most of the non-core expression language:
+  c...r, assoc, keyword->string, string->keyword, exact?, inexact?,
+  zero?, positive?, negative?, odd?, even?, exp, log, sin, cos,
+  tan, asin, acos, atan, expt, exact->inexact, inexact->exact,
+  quantity->number, string->list, list->string, map, time<?,
+  time>?, time<=?, time>=?.
+
+
+1.2.1  The begin.
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..8e799ed
--- /dev/null
+++ b/README
@@ -0,0 +1,19 @@
+Copyright (c) 1994, 1995, 1996 James Clark
+Copyright (c) 1999, 2002 OpenJade Project
+
+This package contains
+   - a DSSSL processor called OpenJade.
+
+If you got this file as part of an OpenJade distribution, then you can find
+information about OpenJade in HTML format in jadedoc/jade.htm.
+
+See the file COPYING for copying permission.
+
+This is a production release.  The version number of SP is given in
+the file VERSION.
+
+All documentation is in HTML format in the doc directory.  Start with
+doc/index.htm.
+
+Please report any bugs you find to http://sourceforge.net/projects/openjade.
+
diff --git a/SP.dsw b/SP.dsw
new file mode 100644 (file)
index 0000000..2ffdf4c
--- /dev/null
+++ b/SP.dsw
@@ -0,0 +1,116 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "lib"=".\lib\lib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "nsgmls"=".\nsgmls\nsgmls.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name lib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "sgmlnorm"=".\sgmlnorm\sgmlnorm.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name lib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "spam"=".\spam\spam.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+    begin source code control
+    c:\home\work\jade-vc6\spam\spam.pj
+    .\spam
+    end source code control
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name lib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "spent"=".\spent\spent.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+    begin source code control
+    c:\home\work\jade-vc6\spent\spent.pj
+    .\spent
+    end source code control
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name lib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "sx"=".\sx\sx.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+    begin source code control
+    c:\home\work\jade-vc6\sx\sx.pj
+    .\sx
+    end source code control
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name lib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/SP.mak b/SP.mak
new file mode 100644 (file)
index 0000000..d482d3b
--- /dev/null
+++ b/SP.mak
@@ -0,0 +1,22618 @@
+# Microsoft Developer Studio Generated NMAKE File, Format Version 4.20
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+# TARGTYPE "Win32 (x86) External Target" 0x0106
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+!IF "$(CFG)" == ""
+CFG=sx - Win32 Debug
+!MESSAGE No configuration specified.  Defaulting to sx - Win32 Debug.
+!ENDIF 
+
+!IF "$(CFG)" != "lib - Win32 Release" && "$(CFG)" != "lib - Win32 Debug" &&\
+ "$(CFG)" != "nsgmls - Win32 Release" && "$(CFG)" != "nsgmls - Win32 Debug" &&\
+ "$(CFG)" != "spam - Win32 Release" && "$(CFG)" != "spam - Win32 Debug" &&\
+ "$(CFG)" != "spent - Win32 Release" && "$(CFG)" != "spent - Win32 Debug" &&\
+ "$(CFG)" != "sgmlnorm - Win32 Release" && "$(CFG)" != "sgmlnorm - Win32 Debug"\
+ && "$(CFG)" != "all - Win32 Release" && "$(CFG)" != "all - Win32 Debug" &&\
+ "$(CFG)" != "sx - Win32 Release" && "$(CFG)" != "sx - Win32 Debug"
+!MESSAGE Invalid configuration "$(CFG)" specified.
+!MESSAGE You can specify a configuration when running NMAKE on this makefile
+!MESSAGE by defining the macro CFG on the command line.  For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "SP.mak" CFG="sx - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "lib - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "lib - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "nsgmls - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "nsgmls - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE "spam - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "spam - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE "spent - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "spent - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE "sgmlnorm - Win32 Release" (based on\
+ "Win32 (x86) Console Application")
+!MESSAGE "sgmlnorm - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE "all - Win32 Release" (based on "Win32 (x86) External Target")
+!MESSAGE "all - Win32 Debug" (based on "Win32 (x86) External Target")
+!MESSAGE "sx - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "sx - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+!ERROR An invalid configuration is specified.
+!ENDIF 
+
+!IF "$(OS)" == "Windows_NT"
+NULL=
+!ELSE 
+NULL=nul
+!ENDIF 
+################################################################################
+# Begin Project
+# PROP Target_Last_Scanned "lib - Win32 Debug"
+
+!IF  "$(CFG)" == "lib - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "lib\Release"
+# PROP BASE Intermediate_Dir "lib\Release"
+# PROP BASE Target_Dir "lib"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "lib\Release"
+# PROP Intermediate_Dir "lib\Release"
+# PROP Target_Dir "lib"
+OUTDIR=.\lib\Release
+INTDIR=.\lib\Release
+
+ALL : ".\bin\sp133.dll"
+
+CLEAN : 
+       -@erase "$(INTDIR)\Allocator.obj"
+       -@erase "$(INTDIR)\app_inst.obj"
+       -@erase "$(INTDIR)\arc_inst.obj"
+       -@erase "$(INTDIR)\ArcEngine.obj"
+       -@erase "$(INTDIR)\assert.obj"
+       -@erase "$(INTDIR)\Attribute.obj"
+       -@erase "$(INTDIR)\Big5CodingSystem.obj"
+       -@erase "$(INTDIR)\CharsetDecl.obj"
+       -@erase "$(INTDIR)\CharsetInfo.obj"
+       -@erase "$(INTDIR)\CharsetRegistry.obj"
+       -@erase "$(INTDIR)\CmdLineApp.obj"
+       -@erase "$(INTDIR)\CodingSystem.obj"
+       -@erase "$(INTDIR)\CodingSystemKit.obj"
+       -@erase "$(INTDIR)\ConsoleOutput.obj"
+       -@erase "$(INTDIR)\ContentState.obj"
+       -@erase "$(INTDIR)\ContentToken.obj"
+       -@erase "$(INTDIR)\DescriptorManager.obj"
+       -@erase "$(INTDIR)\Dtd.obj"
+       -@erase "$(INTDIR)\ElementType.obj"
+       -@erase "$(INTDIR)\Entity.obj"
+       -@erase "$(INTDIR)\EntityApp.obj"
+       -@erase "$(INTDIR)\EntityCatalog.obj"
+       -@erase "$(INTDIR)\EntityDecl.obj"
+       -@erase "$(INTDIR)\EntityManager.obj"
+       -@erase "$(INTDIR)\entmgr_inst.obj"
+       -@erase "$(INTDIR)\ErrnoMessageArg.obj"
+       -@erase "$(INTDIR)\ErrorCountEventHandler.obj"
+       -@erase "$(INTDIR)\EUCJPCodingSystem.obj"
+       -@erase "$(INTDIR)\Event.obj"
+       -@erase "$(INTDIR)\EventGenerator.obj"
+       -@erase "$(INTDIR)\ExtendEntityManager.obj"
+       -@erase "$(INTDIR)\ExternalId.obj"
+       -@erase "$(INTDIR)\Fixed2CodingSystem.obj"
+       -@erase "$(INTDIR)\GenericEventHandler.obj"
+       -@erase "$(INTDIR)\Group.obj"
+       -@erase "$(INTDIR)\Hash.obj"
+       -@erase "$(INTDIR)\Id.obj"
+       -@erase "$(INTDIR)\IdentityCodingSystem.obj"
+       -@erase "$(INTDIR)\IListBase.obj"
+       -@erase "$(INTDIR)\InputSource.obj"
+       -@erase "$(INTDIR)\InternalInputSource.obj"
+       -@erase "$(INTDIR)\lib.pch"
+       -@erase "$(INTDIR)\lib.res"
+       -@erase "$(INTDIR)\Link.obj"
+       -@erase "$(INTDIR)\LinkProcess.obj"
+       -@erase "$(INTDIR)\LiteralStorage.obj"
+       -@erase "$(INTDIR)\Location.obj"
+       -@erase "$(INTDIR)\Lpd.obj"
+       -@erase "$(INTDIR)\Markup.obj"
+       -@erase "$(INTDIR)\Message.obj"
+       -@erase "$(INTDIR)\MessageArg.obj"
+       -@erase "$(INTDIR)\MessageEventHandler.obj"
+       -@erase "$(INTDIR)\MessageFormatter.obj"
+       -@erase "$(INTDIR)\MessageReporter.obj"
+       -@erase "$(INTDIR)\MessageTable.obj"
+       -@erase "$(INTDIR)\ModeInfo.obj"
+       -@erase "$(INTDIR)\Notation.obj"
+       -@erase "$(INTDIR)\NotationStorage.obj"
+       -@erase "$(INTDIR)\NumericCharRefOrigin.obj"
+       -@erase "$(INTDIR)\OffsetOrderedList.obj"
+       -@erase "$(INTDIR)\OpenElement.obj"
+       -@erase "$(INTDIR)\OutputByteStream.obj"
+       -@erase "$(INTDIR)\OutputCharStream.obj"
+       -@erase "$(INTDIR)\OutputState.obj"
+       -@erase "$(INTDIR)\Param.obj"
+       -@erase "$(INTDIR)\parseAttribute.obj"
+       -@erase "$(INTDIR)\parseCommon.obj"
+       -@erase "$(INTDIR)\parseDecl.obj"
+       -@erase "$(INTDIR)\parseInstance.obj"
+       -@erase "$(INTDIR)\parseMode.obj"
+       -@erase "$(INTDIR)\parseParam.obj"
+       -@erase "$(INTDIR)\Parser.obj"
+       -@erase "$(INTDIR)\parser_inst.obj"
+       -@erase "$(INTDIR)\ParserApp.obj"
+       -@erase "$(INTDIR)\ParserEventGeneratorKit.obj"
+       -@erase "$(INTDIR)\ParserMessages.obj"
+       -@erase "$(INTDIR)\ParserOptions.obj"
+       -@erase "$(INTDIR)\ParserState.obj"
+       -@erase "$(INTDIR)\parseSd.obj"
+       -@erase "$(INTDIR)\Partition.obj"
+       -@erase "$(INTDIR)\PosixStorage.obj"
+       -@erase "$(INTDIR)\Recognizer.obj"
+       -@erase "$(INTDIR)\RewindStorageObject.obj"
+       -@erase "$(INTDIR)\Sd.obj"
+       -@erase "$(INTDIR)\SdText.obj"
+       -@erase "$(INTDIR)\SearchResultMessageArg.obj"
+       -@erase "$(INTDIR)\SGMLApplication.obj"
+       -@erase "$(INTDIR)\SgmlParser.obj"
+       -@erase "$(INTDIR)\ShortReferenceMap.obj"
+       -@erase "$(INTDIR)\SJISCodingSystem.obj"
+       -@erase "$(INTDIR)\SOEntityCatalog.obj"
+       -@erase "$(INTDIR)\splib.obj"
+       -@erase "$(INTDIR)\StdioStorage.obj"
+       -@erase "$(INTDIR)\StorageManager.obj"
+       -@erase "$(INTDIR)\StringVectorMessageArg.obj"
+       -@erase "$(INTDIR)\Syntax.obj"
+       -@erase "$(INTDIR)\Text.obj"
+       -@erase "$(INTDIR)\TokenMessageArg.obj"
+       -@erase "$(INTDIR)\TranslateCodingSystem.obj"
+       -@erase "$(INTDIR)\TrieBuilder.obj"
+       -@erase "$(INTDIR)\TypeId.obj"
+       -@erase "$(INTDIR)\Undo.obj"
+       -@erase "$(INTDIR)\UnicodeCodingSystem.obj"
+       -@erase "$(INTDIR)\UnivCharsetDesc.obj"
+       -@erase "$(INTDIR)\URLStorage.obj"
+       -@erase "$(INTDIR)\UTF8CodingSystem.obj"
+       -@erase "$(INTDIR)\Win32CodingSystem.obj"
+       -@erase "$(INTDIR)\WinApp.obj"
+       -@erase "$(INTDIR)\WinInetStorage.obj"
+       -@erase "$(INTDIR)\xentmgr_inst.obj"
+       -@erase "$(INTDIR)\XMLCodingSystem.obj"
+       -@erase "$(OUTDIR)\sp133.exp"
+       -@erase "$(OUTDIR)\sp133.lib"
+       -@erase ".\bin\sp133.dll"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "include" /I "generic" /D "NDEBUG" /D "_WINDOWS" /D "WINSOCK" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE" /Yu"splib.h" /c
+CPP_PROJ=/nologo /MD /W3 /GX /O2 /I "include" /I "generic" /D "NDEBUG" /D\
+ "_WINDOWS" /D "WINSOCK" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/lib.pch" /Yu"splib.h" /Fo"$(INTDIR)/" /c 
+CPP_OBJS=.\lib\Release/
+CPP_SBRS=.\.
+
+.c{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.c{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+MTL=mktyplib.exe
+# ADD BASE MTL /nologo /D "NDEBUG" /win32
+# ADD MTL /nologo /D "NDEBUG" /win32
+MTL_PROJ=/nologo /D "NDEBUG" /win32 
+RSC=rc.exe
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+RSC_PROJ=/l 0x809 /fo"$(INTDIR)/lib.res" /d "NDEBUG" 
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/lib.bsc" 
+BSC32_SBRS= \
+       
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /dll /machine:I386
+# ADD LINK32 wininet.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /dll /machine:I386 /out:"bin/sp133.dll"
+# SUBTRACT LINK32 /profile
+LINK32_FLAGS=wininet.lib wsock32.lib kernel32.lib user32.lib gdi32.lib\
+ winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib\
+ uuid.lib /nologo /subsystem:windows /dll /incremental:no\
+ /pdb:"$(OUTDIR)/sp133.pdb" /machine:I386 /out:"bin/sp133.dll"\
+ /implib:"$(OUTDIR)/sp133.lib" 
+LINK32_OBJS= \
+       "$(INTDIR)\Allocator.obj" \
+       "$(INTDIR)\app_inst.obj" \
+       "$(INTDIR)\arc_inst.obj" \
+       "$(INTDIR)\ArcEngine.obj" \
+       "$(INTDIR)\assert.obj" \
+       "$(INTDIR)\Attribute.obj" \
+       "$(INTDIR)\Big5CodingSystem.obj" \
+       "$(INTDIR)\CharsetDecl.obj" \
+       "$(INTDIR)\CharsetInfo.obj" \
+       "$(INTDIR)\CharsetRegistry.obj" \
+       "$(INTDIR)\CmdLineApp.obj" \
+       "$(INTDIR)\CodingSystem.obj" \
+       "$(INTDIR)\CodingSystemKit.obj" \
+       "$(INTDIR)\ConsoleOutput.obj" \
+       "$(INTDIR)\ContentState.obj" \
+       "$(INTDIR)\ContentToken.obj" \
+       "$(INTDIR)\DescriptorManager.obj" \
+       "$(INTDIR)\Dtd.obj" \
+       "$(INTDIR)\ElementType.obj" \
+       "$(INTDIR)\Entity.obj" \
+       "$(INTDIR)\EntityApp.obj" \
+       "$(INTDIR)\EntityCatalog.obj" \
+       "$(INTDIR)\EntityDecl.obj" \
+       "$(INTDIR)\EntityManager.obj" \
+       "$(INTDIR)\entmgr_inst.obj" \
+       "$(INTDIR)\ErrnoMessageArg.obj" \
+       "$(INTDIR)\ErrorCountEventHandler.obj" \
+       "$(INTDIR)\EUCJPCodingSystem.obj" \
+       "$(INTDIR)\Event.obj" \
+       "$(INTDIR)\EventGenerator.obj" \
+       "$(INTDIR)\ExtendEntityManager.obj" \
+       "$(INTDIR)\ExternalId.obj" \
+       "$(INTDIR)\Fixed2CodingSystem.obj" \
+       "$(INTDIR)\GenericEventHandler.obj" \
+       "$(INTDIR)\Group.obj" \
+       "$(INTDIR)\Hash.obj" \
+       "$(INTDIR)\Id.obj" \
+       "$(INTDIR)\IdentityCodingSystem.obj" \
+       "$(INTDIR)\IListBase.obj" \
+       "$(INTDIR)\InputSource.obj" \
+       "$(INTDIR)\InternalInputSource.obj" \
+       "$(INTDIR)\lib.res" \
+       "$(INTDIR)\Link.obj" \
+       "$(INTDIR)\LinkProcess.obj" \
+       "$(INTDIR)\LiteralStorage.obj" \
+       "$(INTDIR)\Location.obj" \
+       "$(INTDIR)\Lpd.obj" \
+       "$(INTDIR)\Markup.obj" \
+       "$(INTDIR)\Message.obj" \
+       "$(INTDIR)\MessageArg.obj" \
+       "$(INTDIR)\MessageEventHandler.obj" \
+       "$(INTDIR)\MessageFormatter.obj" \
+       "$(INTDIR)\MessageReporter.obj" \
+       "$(INTDIR)\MessageTable.obj" \
+       "$(INTDIR)\ModeInfo.obj" \
+       "$(INTDIR)\Notation.obj" \
+       "$(INTDIR)\NotationStorage.obj" \
+       "$(INTDIR)\NumericCharRefOrigin.obj" \
+       "$(INTDIR)\OffsetOrderedList.obj" \
+       "$(INTDIR)\OpenElement.obj" \
+       "$(INTDIR)\OutputByteStream.obj" \
+       "$(INTDIR)\OutputCharStream.obj" \
+       "$(INTDIR)\OutputState.obj" \
+       "$(INTDIR)\Param.obj" \
+       "$(INTDIR)\parseAttribute.obj" \
+       "$(INTDIR)\parseCommon.obj" \
+       "$(INTDIR)\parseDecl.obj" \
+       "$(INTDIR)\parseInstance.obj" \
+       "$(INTDIR)\parseMode.obj" \
+       "$(INTDIR)\parseParam.obj" \
+       "$(INTDIR)\Parser.obj" \
+       "$(INTDIR)\parser_inst.obj" \
+       "$(INTDIR)\ParserApp.obj" \
+       "$(INTDIR)\ParserEventGeneratorKit.obj" \
+       "$(INTDIR)\ParserMessages.obj" \
+       "$(INTDIR)\ParserOptions.obj" \
+       "$(INTDIR)\ParserState.obj" \
+       "$(INTDIR)\parseSd.obj" \
+       "$(INTDIR)\Partition.obj" \
+       "$(INTDIR)\PosixStorage.obj" \
+       "$(INTDIR)\Recognizer.obj" \
+       "$(INTDIR)\RewindStorageObject.obj" \
+       "$(INTDIR)\Sd.obj" \
+       "$(INTDIR)\SdText.obj" \
+       "$(INTDIR)\SearchResultMessageArg.obj" \
+       "$(INTDIR)\SGMLApplication.obj" \
+       "$(INTDIR)\SgmlParser.obj" \
+       "$(INTDIR)\ShortReferenceMap.obj" \
+       "$(INTDIR)\SJISCodingSystem.obj" \
+       "$(INTDIR)\SOEntityCatalog.obj" \
+       "$(INTDIR)\splib.obj" \
+       "$(INTDIR)\StdioStorage.obj" \
+       "$(INTDIR)\StorageManager.obj" \
+       "$(INTDIR)\StringVectorMessageArg.obj" \
+       "$(INTDIR)\Syntax.obj" \
+       "$(INTDIR)\Text.obj" \
+       "$(INTDIR)\TokenMessageArg.obj" \
+       "$(INTDIR)\TranslateCodingSystem.obj" \
+       "$(INTDIR)\TrieBuilder.obj" \
+       "$(INTDIR)\TypeId.obj" \
+       "$(INTDIR)\Undo.obj" \
+       "$(INTDIR)\UnicodeCodingSystem.obj" \
+       "$(INTDIR)\UnivCharsetDesc.obj" \
+       "$(INTDIR)\URLStorage.obj" \
+       "$(INTDIR)\UTF8CodingSystem.obj" \
+       "$(INTDIR)\Win32CodingSystem.obj" \
+       "$(INTDIR)\WinApp.obj" \
+       "$(INTDIR)\WinInetStorage.obj" \
+       "$(INTDIR)\xentmgr_inst.obj" \
+       "$(INTDIR)\XMLCodingSystem.obj"
+
+".\bin\sp133.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+    $(LINK32) @<<
+  $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF  "$(CFG)" == "lib - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "lib\Debug"
+# PROP BASE Intermediate_Dir "lib\Debug"
+# PROP BASE Target_Dir "lib"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "lib\Debug"
+# PROP Intermediate_Dir "lib\Debug"
+# PROP Target_Dir "lib"
+OUTDIR=.\lib\Debug
+INTDIR=.\lib\Debug
+
+ALL : ".\dbgbin\sp133d.dll"
+
+CLEAN : 
+       -@erase "$(INTDIR)\Allocator.obj"
+       -@erase "$(INTDIR)\app_inst.obj"
+       -@erase "$(INTDIR)\arc_inst.obj"
+       -@erase "$(INTDIR)\ArcEngine.obj"
+       -@erase "$(INTDIR)\assert.obj"
+       -@erase "$(INTDIR)\Attribute.obj"
+       -@erase "$(INTDIR)\Big5CodingSystem.obj"
+       -@erase "$(INTDIR)\CharsetDecl.obj"
+       -@erase "$(INTDIR)\CharsetInfo.obj"
+       -@erase "$(INTDIR)\CharsetRegistry.obj"
+       -@erase "$(INTDIR)\CmdLineApp.obj"
+       -@erase "$(INTDIR)\CodingSystem.obj"
+       -@erase "$(INTDIR)\CodingSystemKit.obj"
+       -@erase "$(INTDIR)\ConsoleOutput.obj"
+       -@erase "$(INTDIR)\ContentState.obj"
+       -@erase "$(INTDIR)\ContentToken.obj"
+       -@erase "$(INTDIR)\DescriptorManager.obj"
+       -@erase "$(INTDIR)\Dtd.obj"
+       -@erase "$(INTDIR)\ElementType.obj"
+       -@erase "$(INTDIR)\Entity.obj"
+       -@erase "$(INTDIR)\EntityApp.obj"
+       -@erase "$(INTDIR)\EntityCatalog.obj"
+       -@erase "$(INTDIR)\EntityDecl.obj"
+       -@erase "$(INTDIR)\EntityManager.obj"
+       -@erase "$(INTDIR)\entmgr_inst.obj"
+       -@erase "$(INTDIR)\ErrnoMessageArg.obj"
+       -@erase "$(INTDIR)\ErrorCountEventHandler.obj"
+       -@erase "$(INTDIR)\EUCJPCodingSystem.obj"
+       -@erase "$(INTDIR)\Event.obj"
+       -@erase "$(INTDIR)\EventGenerator.obj"
+       -@erase "$(INTDIR)\ExtendEntityManager.obj"
+       -@erase "$(INTDIR)\ExternalId.obj"
+       -@erase "$(INTDIR)\Fixed2CodingSystem.obj"
+       -@erase "$(INTDIR)\GenericEventHandler.obj"
+       -@erase "$(INTDIR)\Group.obj"
+       -@erase "$(INTDIR)\Hash.obj"
+       -@erase "$(INTDIR)\Id.obj"
+       -@erase "$(INTDIR)\IdentityCodingSystem.obj"
+       -@erase "$(INTDIR)\IListBase.obj"
+       -@erase "$(INTDIR)\InputSource.obj"
+       -@erase "$(INTDIR)\InternalInputSource.obj"
+       -@erase "$(INTDIR)\lib.pch"
+       -@erase "$(INTDIR)\lib.res"
+       -@erase "$(INTDIR)\Link.obj"
+       -@erase "$(INTDIR)\LinkProcess.obj"
+       -@erase "$(INTDIR)\LiteralStorage.obj"
+       -@erase "$(INTDIR)\Location.obj"
+       -@erase "$(INTDIR)\Lpd.obj"
+       -@erase "$(INTDIR)\Markup.obj"
+       -@erase "$(INTDIR)\Message.obj"
+       -@erase "$(INTDIR)\MessageArg.obj"
+       -@erase "$(INTDIR)\MessageEventHandler.obj"
+       -@erase "$(INTDIR)\MessageFormatter.obj"
+       -@erase "$(INTDIR)\MessageReporter.obj"
+       -@erase "$(INTDIR)\MessageTable.obj"
+       -@erase "$(INTDIR)\ModeInfo.obj"
+       -@erase "$(INTDIR)\Notation.obj"
+       -@erase "$(INTDIR)\NotationStorage.obj"
+       -@erase "$(INTDIR)\NumericCharRefOrigin.obj"
+       -@erase "$(INTDIR)\OffsetOrderedList.obj"
+       -@erase "$(INTDIR)\OpenElement.obj"
+       -@erase "$(INTDIR)\OutputByteStream.obj"
+       -@erase "$(INTDIR)\OutputCharStream.obj"
+       -@erase "$(INTDIR)\OutputState.obj"
+       -@erase "$(INTDIR)\Param.obj"
+       -@erase "$(INTDIR)\parseAttribute.obj"
+       -@erase "$(INTDIR)\parseCommon.obj"
+       -@erase "$(INTDIR)\parseDecl.obj"
+       -@erase "$(INTDIR)\parseInstance.obj"
+       -@erase "$(INTDIR)\parseMode.obj"
+       -@erase "$(INTDIR)\parseParam.obj"
+       -@erase "$(INTDIR)\Parser.obj"
+       -@erase "$(INTDIR)\parser_inst.obj"
+       -@erase "$(INTDIR)\ParserApp.obj"
+       -@erase "$(INTDIR)\ParserEventGeneratorKit.obj"
+       -@erase "$(INTDIR)\ParserMessages.obj"
+       -@erase "$(INTDIR)\ParserOptions.obj"
+       -@erase "$(INTDIR)\ParserState.obj"
+       -@erase "$(INTDIR)\parseSd.obj"
+       -@erase "$(INTDIR)\Partition.obj"
+       -@erase "$(INTDIR)\PosixStorage.obj"
+       -@erase "$(INTDIR)\Recognizer.obj"
+       -@erase "$(INTDIR)\RewindStorageObject.obj"
+       -@erase "$(INTDIR)\Sd.obj"
+       -@erase "$(INTDIR)\SdText.obj"
+       -@erase "$(INTDIR)\SearchResultMessageArg.obj"
+       -@erase "$(INTDIR)\SGMLApplication.obj"
+       -@erase "$(INTDIR)\SgmlParser.obj"
+       -@erase "$(INTDIR)\ShortReferenceMap.obj"
+       -@erase "$(INTDIR)\SJISCodingSystem.obj"
+       -@erase "$(INTDIR)\SOEntityCatalog.obj"
+       -@erase "$(INTDIR)\splib.obj"
+       -@erase "$(INTDIR)\StdioStorage.obj"
+       -@erase "$(INTDIR)\StorageManager.obj"
+       -@erase "$(INTDIR)\StringVectorMessageArg.obj"
+       -@erase "$(INTDIR)\Syntax.obj"
+       -@erase "$(INTDIR)\Text.obj"
+       -@erase "$(INTDIR)\TokenMessageArg.obj"
+       -@erase "$(INTDIR)\TranslateCodingSystem.obj"
+       -@erase "$(INTDIR)\TrieBuilder.obj"
+       -@erase "$(INTDIR)\TypeId.obj"
+       -@erase "$(INTDIR)\Undo.obj"
+       -@erase "$(INTDIR)\UnicodeCodingSystem.obj"
+       -@erase "$(INTDIR)\UnivCharsetDesc.obj"
+       -@erase "$(INTDIR)\URLStorage.obj"
+       -@erase "$(INTDIR)\UTF8CodingSystem.obj"
+       -@erase "$(INTDIR)\vc40.pdb"
+       -@erase "$(INTDIR)\Win32CodingSystem.obj"
+       -@erase "$(INTDIR)\WinApp.obj"
+       -@erase "$(INTDIR)\WinInetStorage.obj"
+       -@erase "$(INTDIR)\xentmgr_inst.obj"
+       -@erase "$(INTDIR)\XMLCodingSystem.obj"
+       -@erase "$(OUTDIR)\sp133d.exp"
+       -@erase "$(OUTDIR)\sp133d.lib"
+       -@erase "$(OUTDIR)\sp133d.pdb"
+       -@erase ".\dbgbin\sp133d.dll"
+       -@erase ".\dbgbin\sp133d.ilk"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /MDd /W3 /GX /Zi /Od /I "include" /I "generic" /D "_DEBUG" /D "_WINDOWS" /D "WINSOCK" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE" /Yu"splib.h" /c
+CPP_PROJ=/nologo /MDd /W3 /GX /Zi /Od /I "include" /I "generic" /D "_DEBUG" /D\
+ "_WINDOWS" /D "WINSOCK" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/lib.pch" /Yu"splib.h" /Fo"$(INTDIR)/"\
+ /Fd"$(INTDIR)/" /c 
+CPP_OBJS=.\lib\Debug/
+CPP_SBRS=.\.
+
+.c{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.c{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+MTL=mktyplib.exe
+# ADD BASE MTL /nologo /D "_DEBUG" /win32
+# ADD MTL /nologo /D "_DEBUG" /win32
+MTL_PROJ=/nologo /D "_DEBUG" /win32 
+RSC=rc.exe
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+RSC_PROJ=/l 0x809 /fo"$(INTDIR)/lib.res" /d "_DEBUG" 
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/lib.bsc" 
+BSC32_SBRS= \
+       
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /dll /debug /machine:I386
+# ADD LINK32 wininet.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"dbgbin/sp133d.dll"
+LINK32_FLAGS=wininet.lib wsock32.lib kernel32.lib user32.lib gdi32.lib\
+ winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib\
+ uuid.lib /nologo /subsystem:windows /dll /incremental:yes\
+ /pdb:"$(OUTDIR)/sp133d.pdb" /debug /machine:I386 /out:"dbgbin/sp133d.dll"\
+ /implib:"$(OUTDIR)/sp133d.lib" 
+LINK32_OBJS= \
+       "$(INTDIR)\Allocator.obj" \
+       "$(INTDIR)\app_inst.obj" \
+       "$(INTDIR)\arc_inst.obj" \
+       "$(INTDIR)\ArcEngine.obj" \
+       "$(INTDIR)\assert.obj" \
+       "$(INTDIR)\Attribute.obj" \
+       "$(INTDIR)\Big5CodingSystem.obj" \
+       "$(INTDIR)\CharsetDecl.obj" \
+       "$(INTDIR)\CharsetInfo.obj" \
+       "$(INTDIR)\CharsetRegistry.obj" \
+       "$(INTDIR)\CmdLineApp.obj" \
+       "$(INTDIR)\CodingSystem.obj" \
+       "$(INTDIR)\CodingSystemKit.obj" \
+       "$(INTDIR)\ConsoleOutput.obj" \
+       "$(INTDIR)\ContentState.obj" \
+       "$(INTDIR)\ContentToken.obj" \
+       "$(INTDIR)\DescriptorManager.obj" \
+       "$(INTDIR)\Dtd.obj" \
+       "$(INTDIR)\ElementType.obj" \
+       "$(INTDIR)\Entity.obj" \
+       "$(INTDIR)\EntityApp.obj" \
+       "$(INTDIR)\EntityCatalog.obj" \
+       "$(INTDIR)\EntityDecl.obj" \
+       "$(INTDIR)\EntityManager.obj" \
+       "$(INTDIR)\entmgr_inst.obj" \
+       "$(INTDIR)\ErrnoMessageArg.obj" \
+       "$(INTDIR)\ErrorCountEventHandler.obj" \
+       "$(INTDIR)\EUCJPCodingSystem.obj" \
+       "$(INTDIR)\Event.obj" \
+       "$(INTDIR)\EventGenerator.obj" \
+       "$(INTDIR)\ExtendEntityManager.obj" \
+       "$(INTDIR)\ExternalId.obj" \
+       "$(INTDIR)\Fixed2CodingSystem.obj" \
+       "$(INTDIR)\GenericEventHandler.obj" \
+       "$(INTDIR)\Group.obj" \
+       "$(INTDIR)\Hash.obj" \
+       "$(INTDIR)\Id.obj" \
+       "$(INTDIR)\IdentityCodingSystem.obj" \
+       "$(INTDIR)\IListBase.obj" \
+       "$(INTDIR)\InputSource.obj" \
+       "$(INTDIR)\InternalInputSource.obj" \
+       "$(INTDIR)\lib.res" \
+       "$(INTDIR)\Link.obj" \
+       "$(INTDIR)\LinkProcess.obj" \
+       "$(INTDIR)\LiteralStorage.obj" \
+       "$(INTDIR)\Location.obj" \
+       "$(INTDIR)\Lpd.obj" \
+       "$(INTDIR)\Markup.obj" \
+       "$(INTDIR)\Message.obj" \
+       "$(INTDIR)\MessageArg.obj" \
+       "$(INTDIR)\MessageEventHandler.obj" \
+       "$(INTDIR)\MessageFormatter.obj" \
+       "$(INTDIR)\MessageReporter.obj" \
+       "$(INTDIR)\MessageTable.obj" \
+       "$(INTDIR)\ModeInfo.obj" \
+       "$(INTDIR)\Notation.obj" \
+       "$(INTDIR)\NotationStorage.obj" \
+       "$(INTDIR)\NumericCharRefOrigin.obj" \
+       "$(INTDIR)\OffsetOrderedList.obj" \
+       "$(INTDIR)\OpenElement.obj" \
+       "$(INTDIR)\OutputByteStream.obj" \
+       "$(INTDIR)\OutputCharStream.obj" \
+       "$(INTDIR)\OutputState.obj" \
+       "$(INTDIR)\Param.obj" \
+       "$(INTDIR)\parseAttribute.obj" \
+       "$(INTDIR)\parseCommon.obj" \
+       "$(INTDIR)\parseDecl.obj" \
+       "$(INTDIR)\parseInstance.obj" \
+       "$(INTDIR)\parseMode.obj" \
+       "$(INTDIR)\parseParam.obj" \
+       "$(INTDIR)\Parser.obj" \
+       "$(INTDIR)\parser_inst.obj" \
+       "$(INTDIR)\ParserApp.obj" \
+       "$(INTDIR)\ParserEventGeneratorKit.obj" \
+       "$(INTDIR)\ParserMessages.obj" \
+       "$(INTDIR)\ParserOptions.obj" \
+       "$(INTDIR)\ParserState.obj" \
+       "$(INTDIR)\parseSd.obj" \
+       "$(INTDIR)\Partition.obj" \
+       "$(INTDIR)\PosixStorage.obj" \
+       "$(INTDIR)\Recognizer.obj" \
+       "$(INTDIR)\RewindStorageObject.obj" \
+       "$(INTDIR)\Sd.obj" \
+       "$(INTDIR)\SdText.obj" \
+       "$(INTDIR)\SearchResultMessageArg.obj" \
+       "$(INTDIR)\SGMLApplication.obj" \
+       "$(INTDIR)\SgmlParser.obj" \
+       "$(INTDIR)\ShortReferenceMap.obj" \
+       "$(INTDIR)\SJISCodingSystem.obj" \
+       "$(INTDIR)\SOEntityCatalog.obj" \
+       "$(INTDIR)\splib.obj" \
+       "$(INTDIR)\StdioStorage.obj" \
+       "$(INTDIR)\StorageManager.obj" \
+       "$(INTDIR)\StringVectorMessageArg.obj" \
+       "$(INTDIR)\Syntax.obj" \
+       "$(INTDIR)\Text.obj" \
+       "$(INTDIR)\TokenMessageArg.obj" \
+       "$(INTDIR)\TranslateCodingSystem.obj" \
+       "$(INTDIR)\TrieBuilder.obj" \
+       "$(INTDIR)\TypeId.obj" \
+       "$(INTDIR)\Undo.obj" \
+       "$(INTDIR)\UnicodeCodingSystem.obj" \
+       "$(INTDIR)\UnivCharsetDesc.obj" \
+       "$(INTDIR)\URLStorage.obj" \
+       "$(INTDIR)\UTF8CodingSystem.obj" \
+       "$(INTDIR)\Win32CodingSystem.obj" \
+       "$(INTDIR)\WinApp.obj" \
+       "$(INTDIR)\WinInetStorage.obj" \
+       "$(INTDIR)\xentmgr_inst.obj" \
+       "$(INTDIR)\XMLCodingSystem.obj"
+
+".\dbgbin\sp133d.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+    $(LINK32) @<<
+  $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF  "$(CFG)" == "nsgmls - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "nsgmls\Release"
+# PROP BASE Intermediate_Dir "nsgmls\Release"
+# PROP BASE Target_Dir "nsgmls"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "nsgmls\Release"
+# PROP Intermediate_Dir "nsgmls\Release"
+# PROP Target_Dir "nsgmls"
+OUTDIR=.\nsgmls\Release
+INTDIR=.\nsgmls\Release
+
+ALL : "lib - Win32 Release" ".\bin\nsgmls.exe"
+
+CLEAN : 
+       -@erase "$(INTDIR)\nsgmls.obj"
+       -@erase "$(INTDIR)\nsgmls.res"
+       -@erase "$(INTDIR)\nsgmls_inst.obj"
+       -@erase "$(INTDIR)\RastEventHandler.obj"
+       -@erase "$(INTDIR)\SgmlsEventHandler.obj"
+       -@erase "$(INTDIR)\StringSet.obj"
+       -@erase ".\bin\nsgmls.exe"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "include" /D "NDEBUG" /D "_CONSOLE" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE" /YX /c
+CPP_PROJ=/nologo /MD /W3 /GX /O2 /I "include" /D "NDEBUG" /D "_CONSOLE" /D\
+ "WIN32" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE"\
+ /Fp"$(INTDIR)/nsgmls.pch" /YX /Fo"$(INTDIR)/" /c 
+CPP_OBJS=.\nsgmls\Release/
+CPP_SBRS=.\.
+
+.c{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.c{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+RSC=rc.exe
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+RSC_PROJ=/l 0x809 /fo"$(INTDIR)/nsgmls.res" /d "NDEBUG" 
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/nsgmls.bsc" 
+BSC32_SBRS= \
+       
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /machine:I386 /out:"bin/nsgmls.exe"
+# SUBTRACT LINK32 /profile
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
+ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo\
+ /subsystem:console /incremental:no /pdb:"$(OUTDIR)/nsgmls.pdb" /machine:I386\
+ /out:"bin/nsgmls.exe" 
+LINK32_OBJS= \
+       "$(INTDIR)\nsgmls.obj" \
+       "$(INTDIR)\nsgmls.res" \
+       "$(INTDIR)\nsgmls_inst.obj" \
+       "$(INTDIR)\RastEventHandler.obj" \
+       "$(INTDIR)\SgmlsEventHandler.obj" \
+       "$(INTDIR)\StringSet.obj" \
+       ".\lib\Release\sp133.lib"
+
+".\bin\nsgmls.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+    $(LINK32) @<<
+  $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF  "$(CFG)" == "nsgmls - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "nsgmls\Debug"
+# PROP BASE Intermediate_Dir "nsgmls\Debug"
+# PROP BASE Target_Dir "nsgmls"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "nsgmls\Debug"
+# PROP Intermediate_Dir "nsgmls\Debug"
+# PROP Target_Dir "nsgmls"
+OUTDIR=.\nsgmls\Debug
+INTDIR=.\nsgmls\Debug
+
+ALL : "lib - Win32 Debug" ".\dbgbin\nsgmls.exe"
+
+CLEAN : 
+       -@erase "$(INTDIR)\nsgmls.obj"
+       -@erase "$(INTDIR)\nsgmls.res"
+       -@erase "$(INTDIR)\nsgmls_inst.obj"
+       -@erase "$(INTDIR)\RastEventHandler.obj"
+       -@erase "$(INTDIR)\SgmlsEventHandler.obj"
+       -@erase "$(INTDIR)\StringSet.obj"
+       -@erase "$(INTDIR)\vc40.idb"
+       -@erase "$(INTDIR)\vc40.pdb"
+       -@erase "$(OUTDIR)\nsgmls.pdb"
+       -@erase ".\dbgbin\nsgmls.exe"
+       -@erase ".\dbgbin\nsgmls.ilk"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "include" /D "_DEBUG" /D "_CONSOLE" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE" /YX /c
+CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /I "include" /D "_DEBUG" /D\
+ "_CONSOLE" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE"\
+ /Fp"$(INTDIR)/nsgmls.pch" /YX /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c 
+CPP_OBJS=.\nsgmls\Debug/
+CPP_SBRS=.\.
+
+.c{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.c{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+RSC=rc.exe
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+RSC_PROJ=/l 0x809 /fo"$(INTDIR)/nsgmls.res" /d "_DEBUG" 
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/nsgmls.bsc" 
+BSC32_SBRS= \
+       
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /debug /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /debug /machine:I386 /out:"dbgbin/nsgmls.exe"
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
+ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo\
+ /subsystem:console /incremental:yes /pdb:"$(OUTDIR)/nsgmls.pdb" /debug\
+ /machine:I386 /out:"dbgbin/nsgmls.exe" 
+LINK32_OBJS= \
+       "$(INTDIR)\nsgmls.obj" \
+       "$(INTDIR)\nsgmls.res" \
+       "$(INTDIR)\nsgmls_inst.obj" \
+       "$(INTDIR)\RastEventHandler.obj" \
+       "$(INTDIR)\SgmlsEventHandler.obj" \
+       "$(INTDIR)\StringSet.obj" \
+       ".\lib\Debug\sp133d.lib"
+
+".\dbgbin\nsgmls.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+    $(LINK32) @<<
+  $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF  "$(CFG)" == "spam - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "spam\Release"
+# PROP BASE Intermediate_Dir "spam\Release"
+# PROP BASE Target_Dir "spam"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "spam\Release"
+# PROP Intermediate_Dir "spam\Release"
+# PROP Target_Dir "spam"
+OUTDIR=.\spam\Release
+INTDIR=.\spam\Release
+
+ALL : "lib - Win32 Release" ".\bin\spam.exe"
+
+CLEAN : 
+       -@erase "$(INTDIR)\CopyEventHandler.obj"
+       -@erase "$(INTDIR)\MarkupEventHandler.obj"
+       -@erase "$(INTDIR)\spam.obj"
+       -@erase "$(INTDIR)\spam.res"
+       -@erase "$(INTDIR)\spam_inst.obj"
+       -@erase ".\bin\spam.exe"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "include" /D "NDEBUG" /D "_CONSOLE" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE" /YX /c
+CPP_PROJ=/nologo /MD /W3 /GX /O2 /I "include" /D "NDEBUG" /D "_CONSOLE" /D\
+ "WIN32" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE"\
+ /Fp"$(INTDIR)/spam.pch" /YX /Fo"$(INTDIR)/" /c 
+CPP_OBJS=.\spam\Release/
+CPP_SBRS=.\.
+
+.c{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.c{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+RSC=rc.exe
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+RSC_PROJ=/l 0x809 /fo"$(INTDIR)/spam.res" /d "NDEBUG" 
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/spam.bsc" 
+BSC32_SBRS= \
+       
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /machine:I386 /out:"bin/spam.exe"
+# SUBTRACT LINK32 /profile
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
+ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo\
+ /subsystem:console /incremental:no /pdb:"$(OUTDIR)/spam.pdb" /machine:I386\
+ /out:"bin/spam.exe" 
+LINK32_OBJS= \
+       "$(INTDIR)\CopyEventHandler.obj" \
+       "$(INTDIR)\MarkupEventHandler.obj" \
+       "$(INTDIR)\spam.obj" \
+       "$(INTDIR)\spam.res" \
+       "$(INTDIR)\spam_inst.obj" \
+       ".\lib\Release\sp133.lib"
+
+".\bin\spam.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+    $(LINK32) @<<
+  $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF  "$(CFG)" == "spam - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "spam\Debug"
+# PROP BASE Intermediate_Dir "spam\Debug"
+# PROP BASE Target_Dir "spam"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "spam\Debug"
+# PROP Intermediate_Dir "spam\Debug"
+# PROP Target_Dir "spam"
+OUTDIR=.\spam\Debug
+INTDIR=.\spam\Debug
+
+ALL : "lib - Win32 Debug" ".\dbgbin\spam.exe"
+
+CLEAN : 
+       -@erase "$(INTDIR)\CopyEventHandler.obj"
+       -@erase "$(INTDIR)\MarkupEventHandler.obj"
+       -@erase "$(INTDIR)\spam.obj"
+       -@erase "$(INTDIR)\spam.res"
+       -@erase "$(INTDIR)\spam_inst.obj"
+       -@erase "$(INTDIR)\vc40.idb"
+       -@erase "$(INTDIR)\vc40.pdb"
+       -@erase "$(OUTDIR)\spam.pdb"
+       -@erase ".\dbgbin\spam.exe"
+       -@erase ".\dbgbin\spam.ilk"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "include" /D "_DEBUG" /D "_CONSOLE" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE" /YX /c
+CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /I "include" /D "_DEBUG" /D\
+ "_CONSOLE" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE"\
+ /Fp"$(INTDIR)/spam.pch" /YX /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c 
+CPP_OBJS=.\spam\Debug/
+CPP_SBRS=.\.
+
+.c{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.c{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+RSC=rc.exe
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+RSC_PROJ=/l 0x809 /fo"$(INTDIR)/spam.res" /d "_DEBUG" 
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/spam.bsc" 
+BSC32_SBRS= \
+       
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /debug /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /debug /machine:I386 /out:"dbgbin/spam.exe"
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
+ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo\
+ /subsystem:console /incremental:yes /pdb:"$(OUTDIR)/spam.pdb" /debug\
+ /machine:I386 /out:"dbgbin/spam.exe" 
+LINK32_OBJS= \
+       "$(INTDIR)\CopyEventHandler.obj" \
+       "$(INTDIR)\MarkupEventHandler.obj" \
+       "$(INTDIR)\spam.obj" \
+       "$(INTDIR)\spam.res" \
+       "$(INTDIR)\spam_inst.obj" \
+       ".\lib\Debug\sp133d.lib"
+
+".\dbgbin\spam.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+    $(LINK32) @<<
+  $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF  "$(CFG)" == "spent - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "spent\Release"
+# PROP BASE Intermediate_Dir "spent\Release"
+# PROP BASE Target_Dir "spent"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "spent\Release"
+# PROP Intermediate_Dir "spent\Release"
+# PROP Target_Dir "spent"
+OUTDIR=.\spent\Release
+INTDIR=.\spent\Release
+
+ALL : "lib - Win32 Release" ".\bin\spent.exe"
+
+CLEAN : 
+       -@erase "$(INTDIR)\spent.obj"
+       -@erase ".\bin\spent.exe"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "include" /D "NDEBUG" /D "_CONSOLE" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE" /YX /c
+CPP_PROJ=/nologo /MD /W3 /GX /O2 /I "include" /D "NDEBUG" /D "_CONSOLE" /D\
+ "WIN32" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE"\
+ /Fp"$(INTDIR)/spent.pch" /YX /Fo"$(INTDIR)/" /c 
+CPP_OBJS=.\spent\Release/
+CPP_SBRS=.\.
+
+.c{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.c{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+RSC=rc.exe
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/spent.bsc" 
+BSC32_SBRS= \
+       
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /machine:I386 /out:"bin/spent.exe"
+# SUBTRACT LINK32 /profile
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
+ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo\
+ /subsystem:console /incremental:no /pdb:"$(OUTDIR)/spent.pdb" /machine:I386\
+ /out:"bin/spent.exe" 
+LINK32_OBJS= \
+       "$(INTDIR)\spent.obj" \
+       ".\lib\Release\sp133.lib"
+
+".\bin\spent.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+    $(LINK32) @<<
+  $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF  "$(CFG)" == "spent - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "spent\Debug"
+# PROP BASE Intermediate_Dir "spent\Debug"
+# PROP BASE Target_Dir "spent"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "spent\Debug"
+# PROP Intermediate_Dir "spent\Debug"
+# PROP Target_Dir "spent"
+OUTDIR=.\spent\Debug
+INTDIR=.\spent\Debug
+
+ALL : "lib - Win32 Debug" ".\dbgbin\spent.exe"
+
+CLEAN : 
+       -@erase "$(INTDIR)\spent.obj"
+       -@erase "$(INTDIR)\vc40.idb"
+       -@erase "$(INTDIR)\vc40.pdb"
+       -@erase "$(OUTDIR)\spent.pdb"
+       -@erase ".\dbgbin\spent.exe"
+       -@erase ".\dbgbin\spent.ilk"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "include" /D "_DEBUG" /D "_CONSOLE" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE" /YX /c
+CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /I "include" /D "_DEBUG" /D\
+ "_CONSOLE" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE"\
+ /Fp"$(INTDIR)/spent.pch" /YX /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c 
+CPP_OBJS=.\spent\Debug/
+CPP_SBRS=.\.
+
+.c{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.c{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+RSC=rc.exe
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/spent.bsc" 
+BSC32_SBRS= \
+       
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /debug /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /debug /machine:I386 /out:"dbgbin/spent.exe"
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
+ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo\
+ /subsystem:console /incremental:yes /pdb:"$(OUTDIR)/spent.pdb" /debug\
+ /machine:I386 /out:"dbgbin/spent.exe" 
+LINK32_OBJS= \
+       "$(INTDIR)\spent.obj" \
+       ".\lib\Debug\sp133d.lib"
+
+".\dbgbin\spent.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+    $(LINK32) @<<
+  $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF  "$(CFG)" == "sgmlnorm - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "sgmlnorm\Release"
+# PROP BASE Intermediate_Dir "sgmlnorm\Release"
+# PROP BASE Target_Dir "sgmlnorm"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "sgmlnorm\Release"
+# PROP Intermediate_Dir "sgmlnorm\Release"
+# PROP Target_Dir "sgmlnorm"
+OUTDIR=.\sgmlnorm\Release
+INTDIR=.\sgmlnorm\Release
+
+ALL : "lib - Win32 Release" ".\bin\sgmlnorm.exe"
+
+CLEAN : 
+       -@erase "$(INTDIR)\SGMLGenerator.obj"
+       -@erase "$(INTDIR)\sgmlnorm.obj"
+       -@erase ".\bin\sgmlnorm.exe"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "include" /I "generic" /D "NDEBUG" /D "_CONSOLE" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE" /YX /c
+CPP_PROJ=/nologo /MD /W3 /GX /O2 /I "include" /I "generic" /D "NDEBUG" /D\
+ "_CONSOLE" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE"\
+ /Fp"$(INTDIR)/sgmlnorm.pch" /YX /Fo"$(INTDIR)/" /c 
+CPP_OBJS=.\sgmlnorm\Release/
+CPP_SBRS=.\.
+
+.c{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.c{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+RSC=rc.exe
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/sgmlnorm.bsc" 
+BSC32_SBRS= \
+       
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /machine:I386 /out:"bin/sgmlnorm.exe"
+# SUBTRACT LINK32 /profile
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
+ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo\
+ /subsystem:console /incremental:no /pdb:"$(OUTDIR)/sgmlnorm.pdb" /machine:I386\
+ /out:"bin/sgmlnorm.exe" 
+LINK32_OBJS= \
+       "$(INTDIR)\SGMLGenerator.obj" \
+       "$(INTDIR)\sgmlnorm.obj" \
+       ".\lib\Release\sp133.lib"
+
+".\bin\sgmlnorm.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+    $(LINK32) @<<
+  $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF  "$(CFG)" == "sgmlnorm - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "sgmlnorm\Debug"
+# PROP BASE Intermediate_Dir "sgmlnorm\Debug"
+# PROP BASE Target_Dir "sgmlnorm"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "sgmlnorm\Debug"
+# PROP Intermediate_Dir "sgmlnorm\Debug"
+# PROP Target_Dir "sgmlnorm"
+OUTDIR=.\sgmlnorm\Debug
+INTDIR=.\sgmlnorm\Debug
+
+ALL : "lib - Win32 Debug" ".\dbgbin\sgmlnorm.exe"
+
+CLEAN : 
+       -@erase "$(INTDIR)\SGMLGenerator.obj"
+       -@erase "$(INTDIR)\sgmlnorm.obj"
+       -@erase "$(INTDIR)\vc40.idb"
+       -@erase "$(INTDIR)\vc40.pdb"
+       -@erase "$(OUTDIR)\sgmlnorm.pdb"
+       -@erase ".\dbgbin\sgmlnorm.exe"
+       -@erase ".\dbgbin\sgmlnorm.ilk"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "include" /I "generic" /D "_DEBUG" /D "_CONSOLE" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE" /YX /c
+CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /I "include" /I "generic" /D "_DEBUG"\
+ /D "_CONSOLE" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE"\
+ /Fp"$(INTDIR)/sgmlnorm.pch" /YX /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c 
+CPP_OBJS=.\sgmlnorm\Debug/
+CPP_SBRS=.\.
+
+.c{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.c{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+RSC=rc.exe
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/sgmlnorm.bsc" 
+BSC32_SBRS= \
+       
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /debug /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /debug /machine:I386 /out:"dbgbin/sgmlnorm.exe"
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
+ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo\
+ /subsystem:console /incremental:yes /pdb:"$(OUTDIR)/sgmlnorm.pdb" /debug\
+ /machine:I386 /out:"dbgbin/sgmlnorm.exe" 
+LINK32_OBJS= \
+       "$(INTDIR)\SGMLGenerator.obj" \
+       "$(INTDIR)\sgmlnorm.obj" \
+       ".\lib\Debug\sp133d.lib"
+
+".\dbgbin\sgmlnorm.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+    $(LINK32) @<<
+  $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF  "$(CFG)" == "all - Win32 Release"
+
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "all\Release"
+# PROP BASE Intermediate_Dir "all\Release"
+# PROP BASE Target_Dir "all"
+# PROP BASE Cmd_Line "NMAKE /f all.mak"
+# PROP BASE Rebuild_Opt "/a"
+# PROP BASE Target_File "all\all.exe"
+# PROP BASE Bsc_Name "all\all.bsc"
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "all\Release"
+# PROP Intermediate_Dir "all\Release"
+# PROP Target_Dir "all"
+# PROP Cmd_Line ""
+# PROP Rebuild_Opt ""
+# PROP Target_File "all"
+# PROP Bsc_Name ""
+OUTDIR=.\all\Release
+INTDIR=.\all\Release
+
+ALL : "sx - Win32 Release" "spent - Win32 Release" "spam - Win32 Release"\
+ "sgmlnorm - Win32 Release" "nsgmls - Win32 Release" "lib - Win32 Release" 
+
+CLEAN : 
+       -@erase 
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+!ELSEIF  "$(CFG)" == "all - Win32 Debug"
+
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "all\Debug"
+# PROP BASE Intermediate_Dir "all\Debug"
+# PROP BASE Target_Dir "all"
+# PROP BASE Cmd_Line "NMAKE /f all.mak"
+# PROP BASE Rebuild_Opt "/a"
+# PROP BASE Target_File "all\all.exe"
+# PROP BASE Bsc_Name "all\all.bsc"
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "all\Debug"
+# PROP Intermediate_Dir "all\Debug"
+# PROP Target_Dir "all"
+# PROP Cmd_Line ""
+# PROP Rebuild_Opt ""
+# PROP Target_File "all"
+# PROP Bsc_Name ""
+OUTDIR=.\all\Debug
+INTDIR=.\all\Debug
+
+ALL : "sx - Win32 Debug" "spent - Win32 Debug" "spam - Win32 Debug"\
+ "sgmlnorm - Win32 Debug" "nsgmls - Win32 Debug" "lib - Win32 Debug" 
+
+CLEAN : 
+       -@erase 
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+!ELSEIF  "$(CFG)" == "sx - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "sx\Release"
+# PROP BASE Intermediate_Dir "sx\Release"
+# PROP BASE Target_Dir "sx"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "sx\Release"
+# PROP Intermediate_Dir "sx\Release"
+# PROP Target_Dir "sx"
+OUTDIR=.\sx\Release
+INTDIR=.\sx\Release
+
+ALL : "lib - Win32 Release" ".\bin\sx.exe"
+
+CLEAN : 
+       -@erase "$(INTDIR)\sx.obj"
+       -@erase "$(INTDIR)\sx.res"
+       -@erase "$(INTDIR)\sx_inst.obj"
+       -@erase "$(INTDIR)\XmlOutputEventHandler.obj"
+       -@erase ".\bin\sx.exe"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE" /YX /c
+CPP_PROJ=/nologo /MD /W3 /GX /O2 /I "include" /D "NDEBUG" /D "WIN32" /D\
+ "_CONSOLE" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE"\
+ /Fp"$(INTDIR)/sx.pch" /YX /Fo"$(INTDIR)/" /c 
+CPP_OBJS=.\sx\Release/
+CPP_SBRS=.\.
+
+.c{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.c{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+RSC=rc.exe
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+RSC_PROJ=/l 0x809 /fo"$(INTDIR)/sx.res" /d "NDEBUG" 
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/sx.bsc" 
+BSC32_SBRS= \
+       
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /machine:I386 /out:"bin/sx.exe"
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
+ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo\
+ /subsystem:console /incremental:no /pdb:"$(OUTDIR)/sx.pdb" /machine:I386\
+ /out:"bin/sx.exe" 
+LINK32_OBJS= \
+       "$(INTDIR)\sx.obj" \
+       "$(INTDIR)\sx.res" \
+       "$(INTDIR)\sx_inst.obj" \
+       "$(INTDIR)\XmlOutputEventHandler.obj" \
+       ".\lib\Release\sp133.lib"
+
+".\bin\sx.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+    $(LINK32) @<<
+  $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF  "$(CFG)" == "sx - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "sx\Debug"
+# PROP BASE Intermediate_Dir "sx\Debug"
+# PROP BASE Target_Dir "sx"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "sx\Debug"
+# PROP Intermediate_Dir "sx\Debug"
+# PROP Target_Dir "sx"
+OUTDIR=.\sx\Debug
+INTDIR=.\sx\Debug
+
+ALL : "lib - Win32 Debug" ".\dbgbin\sx.exe"
+
+CLEAN : 
+       -@erase "$(INTDIR)\sx.obj"
+       -@erase "$(INTDIR)\sx.res"
+       -@erase "$(INTDIR)\sx_inst.obj"
+       -@erase "$(INTDIR)\vc40.idb"
+       -@erase "$(INTDIR)\vc40.pdb"
+       -@erase "$(INTDIR)\XmlOutputEventHandler.obj"
+       -@erase "$(OUTDIR)\sx.pdb"
+       -@erase ".\dbgbin\sx.exe"
+       -@erase ".\dbgbin\sx.ilk"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE" /YX /c
+CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /I "include" /D "_DEBUG" /D "WIN32"\
+ /D "_CONSOLE" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE"\
+ /Fp"$(INTDIR)/sx.pch" /YX /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c 
+CPP_OBJS=.\sx\Debug/
+CPP_SBRS=.\.
+
+.c{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.c{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+RSC=rc.exe
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+RSC_PROJ=/l 0x809 /fo"$(INTDIR)/sx.res" /d "_DEBUG" 
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/sx.bsc" 
+BSC32_SBRS= \
+       
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /debug /machine:I386 /out:"dbgbin/sx.exe"
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
+ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo\
+ /subsystem:console /incremental:yes /pdb:"$(OUTDIR)/sx.pdb" /debug\
+ /machine:I386 /out:"dbgbin/sx.exe" 
+LINK32_OBJS= \
+       "$(INTDIR)\sx.obj" \
+       "$(INTDIR)\sx.res" \
+       "$(INTDIR)\sx_inst.obj" \
+       "$(INTDIR)\XmlOutputEventHandler.obj" \
+       ".\lib\Debug\sp133d.lib"
+
+".\dbgbin\sx.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+    $(LINK32) @<<
+  $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ENDIF 
+
+################################################################################
+# Begin Target
+
+# Name "lib - Win32 Release"
+# Name "lib - Win32 Debug"
+
+!IF  "$(CFG)" == "lib - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "lib - Win32 Debug"
+
+!ENDIF 
+
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\xentmgr_inst.cxx
+DEP_CPP_XENTM=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\Mutex.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OffsetOrderedList.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+!IF  "$(CFG)" == "lib - Win32 Release"
+
+# ADD CPP /Yu"splib.h"
+
+"$(INTDIR)\xentmgr_inst.obj" : $(SOURCE) $(DEP_CPP_XENTM) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "include" /I "generic" /D "NDEBUG" /D\
+ "_WINDOWS" /D "WINSOCK" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/lib.pch" /Yu"splib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "lib - Win32 Debug"
+
+# ADD CPP /Yu"splib.h"
+
+"$(INTDIR)\xentmgr_inst.obj" : $(SOURCE) $(DEP_CPP_XENTM) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "include" /I "generic" /D "_DEBUG" /D\
+ "_WINDOWS" /D "WINSOCK" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/lib.pch" /Yu"splib.h" /Fo"$(INTDIR)/"\
+ /Fd"$(INTDIR)/" /c $(SOURCE)
+
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\URLStorage.cxx
+DEP_CPP_URLST=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       ".\lib\URLStorageMessages.h"\
+       {$(INCLUDE)}"\sys\TYPES.H"\
+       
+
+"$(INTDIR)\URLStorage.obj" : $(SOURCE) $(DEP_CPP_URLST) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\UnivCharsetDesc.cxx
+DEP_CPP_UNIVC=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\UnivCharsetDesc.obj" : $(SOURCE) $(DEP_CPP_UNIVC) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\UnicodeCodingSystem.cxx
+DEP_CPP_UNICO=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\UnicodeCodingSystem.obj" : $(SOURCE) $(DEP_CPP_UNICO) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\Undo.cxx
+DEP_CPP_UNDO_=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\Undo.obj" : $(SOURCE) $(DEP_CPP_UNDO_) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\TypeId.cxx
+DEP_CPP_TYPEI=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\TypeId.obj" : $(SOURCE) $(DEP_CPP_TYPEI) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\TrieBuilder.cxx
+DEP_CPP_TRIEB=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\TrieBuilder.obj" : $(SOURCE) $(DEP_CPP_TRIEB) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\TokenMessageArg.h
+
+!IF  "$(CFG)" == "lib - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "lib - Win32 Debug"
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\TokenMessageArg.cxx
+DEP_CPP_TOKEN=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\TokenMessageArg.obj" : $(SOURCE) $(DEP_CPP_TOKEN) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\token.h
+
+!IF  "$(CFG)" == "lib - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "lib - Win32 Debug"
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\Text.cxx
+DEP_CPP_TEXT_=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\Text.obj" : $(SOURCE) $(DEP_CPP_TEXT_) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\Syntax.cxx
+DEP_CPP_SYNTA=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\Syntax.obj" : $(SOURCE) $(DEP_CPP_SYNTA) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\StorageManager.cxx
+DEP_CPP_STORA=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\StorageManager.obj" : $(SOURCE) $(DEP_CPP_STORA) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\StdioStorage.cxx
+DEP_CPP_STDIO=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StdioStorageMessages.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\StdioStorage.obj" : $(SOURCE) $(DEP_CPP_STDIO) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\SOEntityCatalog.cxx
+DEP_CPP_SOENT=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\CatalogMessages.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\SOEntityCatalog.obj" : $(SOURCE) $(DEP_CPP_SOENT) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\SJISCodingSystem.cxx
+DEP_CPP_SJISC=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\SJISCodingSystem.obj" : $(SOURCE) $(DEP_CPP_SJISC) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\ShortReferenceMap.cxx
+DEP_CPP_SHORT=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\ShortReferenceMap.obj" : $(SOURCE) $(DEP_CPP_SHORT) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\SgmlParser.cxx
+DEP_CPP_SGMLP=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\SgmlParser.obj" : $(SOURCE) $(DEP_CPP_SGMLP) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\SearchResultMessageArg.cxx
+DEP_CPP_SEARC=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\SearchResultMessageArg.obj" : $(SOURCE) $(DEP_CPP_SEARC) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\SdText.cxx
+DEP_CPP_SDTEX=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\SdText.obj" : $(SOURCE) $(DEP_CPP_SDTEX) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\Sd.cxx
+DEP_CPP_SD_CX=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\Sd.obj" : $(SOURCE) $(DEP_CPP_SD_CX) "$(INTDIR)" "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\RewindStorageObject.cxx
+DEP_CPP_REWIN=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\RewindStorageObject.obj" : $(SOURCE) $(DEP_CPP_REWIN) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\Recognizer.cxx
+DEP_CPP_RECOG=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\Recognizer.obj" : $(SOURCE) $(DEP_CPP_RECOG) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\PosixStorage.cxx
+DEP_CPP_POSIX=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\PosixStorageMessages.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       {$(INCLUDE)}"\sys\STAT.H"\
+       {$(INCLUDE)}"\sys\TYPES.H"\
+       
+
+"$(INTDIR)\PosixStorage.obj" : $(SOURCE) $(DEP_CPP_POSIX) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\Partition.cxx
+DEP_CPP_PARTI=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\Partition.obj" : $(SOURCE) $(DEP_CPP_PARTI) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\parseSd.cxx
+DEP_CPP_PARSE=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\parseSd.obj" : $(SOURCE) $(DEP_CPP_PARSE) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\ParserState.cxx
+DEP_CPP_PARSER=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\ParserState.obj" : $(SOURCE) $(DEP_CPP_PARSER) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\ParserOptions.cxx
+DEP_CPP_PARSERO=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\ParserOptions.obj" : $(SOURCE) $(DEP_CPP_PARSERO) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\ParserMessages.cxx
+DEP_CPP_PARSERM=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\ParserMessages.obj" : $(SOURCE) $(DEP_CPP_PARSERM) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\parser_inst.cxx
+DEP_CPP_PARSER_=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+!IF  "$(CFG)" == "lib - Win32 Release"
+
+# ADD CPP /Yu"splib.h"
+
+"$(INTDIR)\parser_inst.obj" : $(SOURCE) $(DEP_CPP_PARSER_) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "include" /I "generic" /D "NDEBUG" /D\
+ "_WINDOWS" /D "WINSOCK" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/lib.pch" /Yu"splib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "lib - Win32 Debug"
+
+# ADD CPP /Yu"splib.h"
+
+"$(INTDIR)\parser_inst.obj" : $(SOURCE) $(DEP_CPP_PARSER_) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "include" /I "generic" /D "_DEBUG" /D\
+ "_WINDOWS" /D "WINSOCK" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/lib.pch" /Yu"splib.h" /Fo"$(INTDIR)/"\
+ /Fd"$(INTDIR)/" /c $(SOURCE)
+
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\Parser.cxx
+DEP_CPP_PARSER_C=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\Parser.obj" : $(SOURCE) $(DEP_CPP_PARSER_C) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\parseParam.cxx
+DEP_CPP_PARSEP=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\parseParam.obj" : $(SOURCE) $(DEP_CPP_PARSEP) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\parseMode.cxx
+DEP_CPP_PARSEM=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\parseMode.obj" : $(SOURCE) $(DEP_CPP_PARSEM) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\parseInstance.cxx
+DEP_CPP_PARSEI=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\parseInstance.obj" : $(SOURCE) $(DEP_CPP_PARSEI) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\parseDecl.cxx
+DEP_CPP_PARSED=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\parseDecl.obj" : $(SOURCE) $(DEP_CPP_PARSED) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\parseCommon.cxx
+DEP_CPP_PARSEC=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\parseCommon.obj" : $(SOURCE) $(DEP_CPP_PARSEC) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\parseAttribute.cxx
+DEP_CPP_PARSEA=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\parseAttribute.obj" : $(SOURCE) $(DEP_CPP_PARSEA) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\Param.cxx
+DEP_CPP_PARAM=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\Param.obj" : $(SOURCE) $(DEP_CPP_PARAM) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\OutputState.cxx
+DEP_CPP_OUTPU=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\OutputState.obj" : $(SOURCE) $(DEP_CPP_OUTPU) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\OutputCharStream.cxx
+DEP_CPP_OUTPUT=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\OutputCharStream.obj" : $(SOURCE) $(DEP_CPP_OUTPUT) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\OpenElement.cxx
+DEP_CPP_OPENE=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\OpenElement.obj" : $(SOURCE) $(DEP_CPP_OPENE) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\OffsetOrderedList.h
+
+!IF  "$(CFG)" == "lib - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "lib - Win32 Debug"
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\OffsetOrderedList.cxx
+DEP_CPP_OFFSE=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\Mutex.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OffsetOrderedList.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\OffsetOrderedList.obj" : $(SOURCE) $(DEP_CPP_OFFSE) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\NumericCharRefOrigin.cxx
+DEP_CPP_NUMER=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\NumericCharRefOrigin.obj" : $(SOURCE) $(DEP_CPP_NUMER) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\Notation.cxx
+DEP_CPP_NOTAT=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\Notation.obj" : $(SOURCE) $(DEP_CPP_NOTAT) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\ModeInfo.cxx
+DEP_CPP_MODEI=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\ModeInfo.obj" : $(SOURCE) $(DEP_CPP_MODEI) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\MessageReporter.cxx
+DEP_CPP_MESSA=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\MessageReporterMessages.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\MessageReporter.obj" : $(SOURCE) $(DEP_CPP_MESSA) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\MessageEventHandler.cxx
+DEP_CPP_MESSAG=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\MessageEventHandler.obj" : $(SOURCE) $(DEP_CPP_MESSAG) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\MessageArg.cxx
+DEP_CPP_MESSAGE=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\MessageArg.obj" : $(SOURCE) $(DEP_CPP_MESSAGE) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\Message.cxx
+DEP_CPP_MESSAGE_=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\Message.obj" : $(SOURCE) $(DEP_CPP_MESSAGE_) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\Markup.cxx
+DEP_CPP_MARKU=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\Markup.obj" : $(SOURCE) $(DEP_CPP_MARKU) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\Lpd.cxx
+DEP_CPP_LPD_C=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\Lpd.obj" : $(SOURCE) $(DEP_CPP_LPD_C) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\Location.cxx
+DEP_CPP_LOCAT=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\Mutex.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\Location.obj" : $(SOURCE) $(DEP_CPP_LOCAT) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\LiteralStorage.cxx
+DEP_CPP_LITER=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\LiteralStorage.obj" : $(SOURCE) $(DEP_CPP_LITER) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\LinkProcess.cxx
+DEP_CPP_LINKP=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\LinkProcess.obj" : $(SOURCE) $(DEP_CPP_LINKP) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\Link.cxx
+DEP_CPP_LINK_=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\Link.obj" : $(SOURCE) $(DEP_CPP_LINK_) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\InternalInputSource.cxx
+DEP_CPP_INTER=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\InternalInputSource.obj" : $(SOURCE) $(DEP_CPP_INTER) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\InputSource.cxx
+DEP_CPP_INPUT=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\InputSource.obj" : $(SOURCE) $(DEP_CPP_INPUT) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\IListBase.cxx
+DEP_CPP_ILIST=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\IListBase.obj" : $(SOURCE) $(DEP_CPP_ILIST) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\IdentityCodingSystem.cxx
+DEP_CPP_IDENT=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\IdentityCodingSystem.obj" : $(SOURCE) $(DEP_CPP_IDENT) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\Id.cxx
+DEP_CPP_ID_CX=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\Id.obj" : $(SOURCE) $(DEP_CPP_ID_CX) "$(INTDIR)" "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\Hash.cxx
+DEP_CPP_HASH_=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\Hash.obj" : $(SOURCE) $(DEP_CPP_HASH_) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\Group.cxx
+DEP_CPP_GROUP=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\Group.obj" : $(SOURCE) $(DEP_CPP_GROUP) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\Fixed2CodingSystem.cxx
+DEP_CPP_FIXED=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\Fixed2CodingSystem.obj" : $(SOURCE) $(DEP_CPP_FIXED) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\ExternalId.cxx
+DEP_CPP_EXTER=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\ExternalId.obj" : $(SOURCE) $(DEP_CPP_EXTER) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\ExtendEntityManager.cxx
+DEP_CPP_EXTEN=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EntityManagerMessages.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\Mutex.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OffsetOrderedList.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\ExtendEntityManager.obj" : $(SOURCE) $(DEP_CPP_EXTEN) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\Event.cxx
+DEP_CPP_EVENT=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\Event.obj" : $(SOURCE) $(DEP_CPP_EVENT) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\EUCJPCodingSystem.cxx
+DEP_CPP_EUCJP=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\EUCJPCodingSystem.obj" : $(SOURCE) $(DEP_CPP_EUCJP) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\ErrnoMessageArg.cxx
+DEP_CPP_ERRNO=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\ErrnoMessageArg.obj" : $(SOURCE) $(DEP_CPP_ERRNO) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\entmgr_inst.cxx
+DEP_CPP_ENTMG=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+!IF  "$(CFG)" == "lib - Win32 Release"
+
+# ADD CPP /Yu"splib.h"
+
+"$(INTDIR)\entmgr_inst.obj" : $(SOURCE) $(DEP_CPP_ENTMG) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "include" /I "generic" /D "NDEBUG" /D\
+ "_WINDOWS" /D "WINSOCK" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/lib.pch" /Yu"splib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "lib - Win32 Debug"
+
+# ADD CPP /Yu"splib.h"
+
+"$(INTDIR)\entmgr_inst.obj" : $(SOURCE) $(DEP_CPP_ENTMG) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "include" /I "generic" /D "_DEBUG" /D\
+ "_WINDOWS" /D "WINSOCK" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/lib.pch" /Yu"splib.h" /Fo"$(INTDIR)/"\
+ /Fd"$(INTDIR)/" /c $(SOURCE)
+
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\EntityManager.cxx
+DEP_CPP_ENTIT=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\EntityManager.obj" : $(SOURCE) $(DEP_CPP_ENTIT) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\EntityDecl.cxx
+DEP_CPP_ENTITY=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\EntityDecl.obj" : $(SOURCE) $(DEP_CPP_ENTITY) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\EntityCatalog.cxx
+DEP_CPP_ENTITYC=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\EntityCatalog.obj" : $(SOURCE) $(DEP_CPP_ENTITYC) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\Entity.cxx
+DEP_CPP_ENTITY_=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\Entity.obj" : $(SOURCE) $(DEP_CPP_ENTITY_) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\ElementType.cxx
+DEP_CPP_ELEME=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\ElementType.obj" : $(SOURCE) $(DEP_CPP_ELEME) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\Dtd.cxx
+DEP_CPP_DTD_C=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\Dtd.obj" : $(SOURCE) $(DEP_CPP_DTD_C) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\DescriptorManager.cxx
+DEP_CPP_DESCR=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\DescriptorManager.obj" : $(SOURCE) $(DEP_CPP_DESCR) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\ContentToken.cxx
+DEP_CPP_CONTE=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\ContentToken.obj" : $(SOURCE) $(DEP_CPP_CONTE) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\CharsetRegistry.cxx
+DEP_CPP_CHARS=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\big5.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\gb2312.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\iso646-jis.h"\
+       ".\lib\iso8859-2.h"\
+       ".\lib\iso8859-3.h"\
+       ".\lib\iso8859-4.h"\
+       ".\lib\iso8859-5.h"\
+       ".\lib\iso8859-6.h"\
+       ".\lib\iso8859-7.h"\
+       ".\lib\iso8859-8.h"\
+       ".\lib\iso8859-9.h"\
+       ".\lib\jis0201.h"\
+       ".\lib\jis0208.h"\
+       ".\lib\jis0212.h"\
+       ".\lib\ksc5601.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\CharsetRegistry.obj" : $(SOURCE) $(DEP_CPP_CHARS) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\CharsetInfo.cxx
+DEP_CPP_CHARSE=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\CharsetInfo.obj" : $(SOURCE) $(DEP_CPP_CHARSE) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\CharsetDecl.cxx
+DEP_CPP_CHARSET=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\CharsetDecl.obj" : $(SOURCE) $(DEP_CPP_CHARSET) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\Attribute.cxx
+DEP_CPP_ATTRI=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\Attribute.obj" : $(SOURCE) $(DEP_CPP_ATTRI) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\assert.cxx
+DEP_CPP_ASSER=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\assert.obj" : $(SOURCE) $(DEP_CPP_ASSER) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\app_inst.cxx
+DEP_CPP_APP_I=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+!IF  "$(CFG)" == "lib - Win32 Release"
+
+# ADD CPP /Yu"splib.h"
+
+"$(INTDIR)\app_inst.obj" : $(SOURCE) $(DEP_CPP_APP_I) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "include" /I "generic" /D "NDEBUG" /D\
+ "_WINDOWS" /D "WINSOCK" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/lib.pch" /Yu"splib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "lib - Win32 Debug"
+
+# ADD CPP /Yu"splib.h"
+
+"$(INTDIR)\app_inst.obj" : $(SOURCE) $(DEP_CPP_APP_I) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "include" /I "generic" /D "_DEBUG" /D\
+ "_WINDOWS" /D "WINSOCK" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/lib.pch" /Yu"splib.h" /Fo"$(INTDIR)/"\
+ /Fd"$(INTDIR)/" /c $(SOURCE)
+
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\Allocator.cxx
+DEP_CPP_ALLOC=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\Allocator.obj" : $(SOURCE) $(DEP_CPP_ALLOC) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\ErrorCountEventHandler.cxx
+DEP_CPP_ERROR=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\ErrorCountEventHandler.obj" : $(SOURCE) $(DEP_CPP_ERROR) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\Win32CodingSystem.cxx
+DEP_CPP_WIN32=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\Win32CodingSystem.obj" : $(SOURCE) $(DEP_CPP_WIN32) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\UTF8CodingSystem.cxx
+DEP_CPP_UTF8C=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\UTF8CodingSystem.obj" : $(SOURCE) $(DEP_CPP_UTF8C) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\StringVectorMessageArg.cxx
+DEP_CPP_STRIN=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\StringVectorMessageArg.obj" : $(SOURCE) $(DEP_CPP_STRIN) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\ParserApp.cxx
+DEP_CPP_PARSERA=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserAppMessages.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\ParserApp.obj" : $(SOURCE) $(DEP_CPP_PARSERA) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\EntityApp.cxx
+DEP_CPP_ENTITYA=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\WinInetStorage.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\EntityApp.obj" : $(SOURCE) $(DEP_CPP_ENTITYA) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\CmdLineApp.cxx
+DEP_CPP_CMDLI=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\MessageTable.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\CmdLineAppMessages.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       ".\lib\version.h"\
+       {$(INCLUDE)}"\sys\TYPES.H"\
+       
+
+"$(INTDIR)\CmdLineApp.obj" : $(SOURCE) $(DEP_CPP_CMDLI) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\ConsoleOutput.cxx
+DEP_CPP_CONSO=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\ConsoleOutput.obj" : $(SOURCE) $(DEP_CPP_CONSO) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\ContentState.cxx
+DEP_CPP_CONTEN=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\ContentState.obj" : $(SOURCE) $(DEP_CPP_CONTEN) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\ArcEngine.cxx
+DEP_CPP_ARCEN=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcEngineMessages.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\ArcEngine.obj" : $(SOURCE) $(DEP_CPP_ARCEN) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\arc_inst.cxx
+DEP_CPP_ARC_I=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+!IF  "$(CFG)" == "lib - Win32 Release"
+
+# ADD CPP /Yu"splib.h"
+
+"$(INTDIR)\arc_inst.obj" : $(SOURCE) $(DEP_CPP_ARC_I) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "include" /I "generic" /D "NDEBUG" /D\
+ "_WINDOWS" /D "WINSOCK" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/lib.pch" /Yu"splib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "lib - Win32 Debug"
+
+# ADD CPP /Yu"splib.h"
+
+"$(INTDIR)\arc_inst.obj" : $(SOURCE) $(DEP_CPP_ARC_I) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "include" /I "generic" /D "_DEBUG" /D\
+ "_WINDOWS" /D "WINSOCK" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/lib.pch" /Yu"splib.h" /Fo"$(INTDIR)/"\
+ /Fd"$(INTDIR)/" /c $(SOURCE)
+
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\splib.cxx
+DEP_CPP_SPLIB=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+!IF  "$(CFG)" == "lib - Win32 Release"
+
+# ADD CPP /Yc"splib.h"
+
+BuildCmds= \
+       $(CPP) /nologo /MD /W3 /GX /O2 /I "include" /I "generic" /D "NDEBUG" /D\
+ "_WINDOWS" /D "WINSOCK" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/lib.pch" /Yc"splib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE) \
+       
+
+"$(INTDIR)\splib.obj" : $(SOURCE) $(DEP_CPP_SPLIB) "$(INTDIR)"
+   $(BuildCmds)
+
+"$(INTDIR)\lib.pch" : $(SOURCE) $(DEP_CPP_SPLIB) "$(INTDIR)"
+   $(BuildCmds)
+
+!ELSEIF  "$(CFG)" == "lib - Win32 Debug"
+
+# ADD CPP /Yc"splib.h"
+
+BuildCmds= \
+       $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "include" /I "generic" /D "_DEBUG" /D\
+ "_WINDOWS" /D "WINSOCK" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/lib.pch" /Yc"splib.h" /Fo"$(INTDIR)/"\
+ /Fd"$(INTDIR)/" /c $(SOURCE) \
+       
+
+"$(INTDIR)\splib.obj" : $(SOURCE) $(DEP_CPP_SPLIB) "$(INTDIR)"
+   $(BuildCmds)
+
+"$(INTDIR)\lib.pch" : $(SOURCE) $(DEP_CPP_SPLIB) "$(INTDIR)"
+   $(BuildCmds)
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\SGMLApplication.cxx
+DEP_CPP_SGMLA=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\SGMLApplication.obj" : $(SOURCE) $(DEP_CPP_SGMLA) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\ParserEventGeneratorKit.cxx
+DEP_CPP_PARSERE=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\ParserEventGeneratorKit.obj" : $(SOURCE) $(DEP_CPP_PARSERE)\
+ "$(INTDIR)" "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\GenericEventHandler.cxx
+DEP_CPP_GENER=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\GenericEventHandler.obj" : $(SOURCE) $(DEP_CPP_GENER) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\EventGenerator.cxx
+DEP_CPP_EVENTG=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\EventGenerator.obj" : $(SOURCE) $(DEP_CPP_EVENTG) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\lib.rc
+DEP_RSC_LIB_R=\
+       ".\lib\ArcEngineMessages.rc"\
+       ".\lib\CatalogMessages.rc"\
+       ".\lib\CmdLineAppMessages.rc"\
+       ".\lib\EntityManagerMessages.rc"\
+       ".\lib\MessageFormatterMessages.rc"\
+       ".\lib\MessageReporterMessages.rc"\
+       ".\lib\ParserAppMessages.rc"\
+       ".\lib\ParserMessages.rc"\
+       ".\lib\PosixStorageMessages.rc"\
+       ".\lib\StdioStorageMessages.rc"\
+       ".\lib\URLStorageMessages.rc"\
+       
+
+!IF  "$(CFG)" == "lib - Win32 Release"
+
+
+"$(INTDIR)\lib.res" : $(SOURCE) $(DEP_RSC_LIB_R) "$(INTDIR)"
+   $(RSC) /l 0x809 /fo"$(INTDIR)/lib.res" /i "lib" /d "NDEBUG" $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "lib - Win32 Debug"
+
+
+"$(INTDIR)\lib.res" : $(SOURCE) $(DEP_RSC_LIB_R) "$(INTDIR)"
+   $(RSC) /l 0x809 /fo"$(INTDIR)/lib.res" /i "lib" /d "_DEBUG" $(SOURCE)
+
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\MessageTable.cxx
+DEP_CPP_MESSAGET=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\MessageTable.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\MessageTable.obj" : $(SOURCE) $(DEP_CPP_MESSAGET) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\WinInetStorage.cxx
+DEP_CPP_WININ=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\WinInetStorage.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       ".\lib\WinInetStorageMessages.h"\
+       
+
+"$(INTDIR)\WinInetStorage.obj" : $(SOURCE) $(DEP_CPP_WININ) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\ParserMessages.msg
+
+!IF  "$(CFG)" == "lib - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "lib - Win32 Debug"
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\arc_inst.m4
+
+!IF  "$(CFG)" == "lib - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "lib - Win32 Debug"
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\app_inst.m4
+
+!IF  "$(CFG)" == "lib - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "lib - Win32 Debug"
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\entmgr_inst.m4
+
+!IF  "$(CFG)" == "lib - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "lib - Win32 Debug"
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\instmac.m4
+
+!IF  "$(CFG)" == "lib - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "lib - Win32 Debug"
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\parser_inst.m4
+
+!IF  "$(CFG)" == "lib - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "lib - Win32 Debug"
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\xentmgr_inst.m4
+
+!IF  "$(CFG)" == "lib - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "lib - Win32 Debug"
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\TranslateCodingSystem.cxx
+DEP_CPP_TRANS=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TranslateCodingSystem.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\TranslateCodingSystem.obj" : $(SOURCE) $(DEP_CPP_TRANS) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\CodingSystemKit.cxx
+DEP_CPP_CODIN=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Big5CodingSystem.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TranslateCodingSystem.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\XMLCodingSystem.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\CodingSystemKit.obj" : $(SOURCE) $(DEP_CPP_CODIN) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\CmdLineAppMessages.msg
+
+!IF  "$(CFG)" == "lib - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "lib - Win32 Debug"
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\EntityManagerMessages.msg
+
+!IF  "$(CFG)" == "lib - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "lib - Win32 Debug"
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\CodingSystem.cxx
+DEP_CPP_CODING=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\CodingSystem.obj" : $(SOURCE) $(DEP_CPP_CODING) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\Big5CodingSystem.cxx
+DEP_CPP_BIG5C=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Big5CodingSystem.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\Big5CodingSystem.obj" : $(SOURCE) $(DEP_CPP_BIG5C) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\OutputByteStream.cxx
+DEP_CPP_OUTPUTB=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       {$(INCLUDE)}"\sys\STAT.H"\
+       {$(INCLUDE)}"\sys\TYPES.H"\
+       
+
+"$(INTDIR)\OutputByteStream.obj" : $(SOURCE) $(DEP_CPP_OUTPUTB) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\MessageFormatter.cxx
+DEP_CPP_MESSAGEF=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\MessageFormatterMessages.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\MessageFormatter.obj" : $(SOURCE) $(DEP_CPP_MESSAGEF) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\WinApp.cxx
+DEP_CPP_WINAP=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\WinApp.h"\
+       ".\include\WinInetStorage.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+# PROP Exclude_From_Build 0
+
+"$(INTDIR)\WinApp.obj" : $(SOURCE) $(DEP_CPP_WINAP) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\NotationStorage.cxx
+DEP_CPP_NOTATI=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\NotationStorage.obj" : $(SOURCE) $(DEP_CPP_NOTATI) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\lib\XMLCodingSystem.cxx
+DEP_CPP_XMLCO=\
+       ".\generic\EventGenerator.h"\
+       ".\generic\ParserEventGeneratorKit.h"\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\ConsoleOutput.h"\
+       ".\include\constant.h"\
+       ".\include\ContentState.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\DescriptorManager.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\EUCJPCodingSystem.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Fixed2CodingSystem.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IdentityCodingSystem.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\ISetIter.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\List.cxx"\
+       ".\include\List.h"\
+       ".\include\ListIter.h"\
+       ".\include\LiteralStorage.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\NotationStorage.h"\
+       ".\include\OpenElement.h"\
+       ".\include\Options.cxx"\
+       ".\include\Options.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\PosixStorage.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\RewindStorageObject.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SearchResultMessageArg.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\SJISCodingSystem.h"\
+       ".\include\SOEntityCatalog.h"\
+       ".\include\sptchar.h"\
+       ".\include\StdioStorage.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnicodeCodingSystem.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\URLStorage.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\Win32CodingSystem.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\XMLCodingSystem.h"\
+       ".\include\xnew.h"\
+       ".\lib\ArcProcessor.h"\
+       ".\lib\CatalogEntry.h"\
+       ".\lib\EquivClass.h"\
+       ".\lib\EventQueue.h"\
+       ".\lib\events.h"\
+       ".\lib\Group.h"\
+       ".\lib\Id.h"\
+       ".\lib\LpdEntityRef.h"\
+       ".\lib\MarkupScan.h"\
+       ".\lib\ModeInfo.h"\
+       ".\lib\NameToken.h"\
+       ".\lib\NumericCharRefOrigin.h"\
+       ".\lib\OutputState.h"\
+       ".\lib\Param.h"\
+       ".\lib\Parser.h"\
+       ".\lib\ParserMessages.h"\
+       ".\lib\ParserState.h"\
+       ".\lib\Partition.h"\
+       ".\lib\Priority.h"\
+       ".\lib\Recognizer.h"\
+       ".\lib\SdFormalError.h"\
+       ".\lib\splib.h"\
+       ".\lib\splibpch.h"\
+       ".\lib\SrInfo.h"\
+       ".\lib\StorageObjectPosition.h"\
+       ".\lib\StringVectorMessageArg.h"\
+       ".\lib\token.h"\
+       ".\lib\TokenMessageArg.h"\
+       ".\lib\Trie.h"\
+       ".\lib\TrieBuilder.h"\
+       ".\lib\Undo.h"\
+       
+
+"$(INTDIR)\XMLCodingSystem.obj" : $(SOURCE) $(DEP_CPP_XMLCO) "$(INTDIR)"\
+ "$(INTDIR)\lib.pch"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+# End Target
+################################################################################
+# Begin Target
+
+# Name "nsgmls - Win32 Release"
+# Name "nsgmls - Win32 Debug"
+
+!IF  "$(CFG)" == "nsgmls - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "nsgmls - Win32 Debug"
+
+!ENDIF 
+
+################################################################################
+# Begin Project Dependency
+
+# Project_Dep_Name "lib"
+
+!IF  "$(CFG)" == "nsgmls - Win32 Release"
+
+"lib - Win32 Release" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\SP.mak" CFG="lib - Win32 Release" 
+
+!ELSEIF  "$(CFG)" == "nsgmls - Win32 Debug"
+
+"lib - Win32 Debug" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\SP.mak" CFG="lib - Win32 Debug" 
+
+!ENDIF 
+
+# End Project Dependency
+################################################################################
+# Begin Source File
+
+SOURCE=.\nsgmls\StringSet.cxx
+DEP_CPP_STRING=\
+       ".\include\Boolean.h"\
+       ".\include\config.h"\
+       ".\include\Hash.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\xnew.h"\
+       ".\nsgmls\StringSet.h"\
+       
+
+"$(INTDIR)\StringSet.obj" : $(SOURCE) $(DEP_CPP_STRING) "$(INTDIR)"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\nsgmls\SgmlsEventHandler.cxx
+DEP_CPP_SGMLS=\
+       ".\include\Allocator.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\nsgmls\SgmlsEventHandler.h"\
+       ".\nsgmls\StringSet.h"\
+       
+
+"$(INTDIR)\SgmlsEventHandler.obj" : $(SOURCE) $(DEP_CPP_SGMLS) "$(INTDIR)"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\nsgmls\RastEventHandler.cxx
+DEP_CPP_RASTE=\
+       ".\include\Allocator.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\nsgmls\RastEventHandler.h"\
+       ".\nsgmls\RastEventHandlerMessages.h"\
+       
+
+"$(INTDIR)\RastEventHandler.obj" : $(SOURCE) $(DEP_CPP_RASTE) "$(INTDIR)"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\nsgmls\nsgmls_inst.cxx
+DEP_CPP_NSGML=\
+       ".\include\Allocator.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\nsgmls\RastEventHandler.h"\
+       ".\nsgmls\StringSet.h"\
+       
+
+"$(INTDIR)\nsgmls_inst.obj" : $(SOURCE) $(DEP_CPP_NSGML) "$(INTDIR)"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\nsgmls\nsgmls.cxx
+DEP_CPP_NSGMLS=\
+       ".\include\Allocator.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\LinkProcess.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageEventHandler.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\sptchar.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\nsgmls\NsgmlsMessages.h"\
+       ".\nsgmls\RastEventHandler.h"\
+       ".\nsgmls\SgmlsEventHandler.h"\
+       ".\nsgmls\StringSet.h"\
+       
+
+"$(INTDIR)\nsgmls.obj" : $(SOURCE) $(DEP_CPP_NSGMLS) "$(INTDIR)"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\nsgmls\nsgmls.rc
+DEP_RSC_NSGMLS_=\
+       ".\nsgmls\NsgmlsMessages.rc"\
+       ".\nsgmls\RastEventHandlerMessages.rc"\
+       
+
+!IF  "$(CFG)" == "nsgmls - Win32 Release"
+
+
+"$(INTDIR)\nsgmls.res" : $(SOURCE) $(DEP_RSC_NSGMLS_) "$(INTDIR)"
+   $(RSC) /l 0x809 /fo"$(INTDIR)/nsgmls.res" /i "nsgmls" /d "NDEBUG" $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "nsgmls - Win32 Debug"
+
+
+"$(INTDIR)\nsgmls.res" : $(SOURCE) $(DEP_RSC_NSGMLS_) "$(INTDIR)"
+   $(RSC) /l 0x809 /fo"$(INTDIR)/nsgmls.res" /i "nsgmls" /d "_DEBUG" $(SOURCE)
+
+
+!ENDIF 
+
+# End Source File
+# End Target
+################################################################################
+# Begin Target
+
+# Name "spam - Win32 Release"
+# Name "spam - Win32 Debug"
+
+!IF  "$(CFG)" == "spam - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "spam - Win32 Debug"
+
+!ENDIF 
+
+################################################################################
+# Begin Project Dependency
+
+# Project_Dep_Name "lib"
+
+!IF  "$(CFG)" == "spam - Win32 Release"
+
+"lib - Win32 Release" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\SP.mak" CFG="lib - Win32 Release" 
+
+!ELSEIF  "$(CFG)" == "spam - Win32 Debug"
+
+"lib - Win32 Debug" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\SP.mak" CFG="lib - Win32 Debug" 
+
+!ENDIF 
+
+# End Project Dependency
+################################################################################
+# Begin Source File
+
+SOURCE=.\spam\spam_inst.cxx
+DEP_CPP_SPAM_=\
+       ".\include\Allocator.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spam\CopyEventHandler.h"\
+       ".\spam\MarkupEventHandler.h"\
+       
+
+"$(INTDIR)\spam_inst.obj" : $(SOURCE) $(DEP_CPP_SPAM_) "$(INTDIR)"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\spam\spam.cxx
+DEP_CPP_SPAM_C=\
+       ".\include\Allocator.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\sptchar.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spam\CopyEventHandler.h"\
+       ".\spam\MarkupEventHandler.h"\
+       ".\spam\SpamMessages.h"\
+       
+
+"$(INTDIR)\spam.obj" : $(SOURCE) $(DEP_CPP_SPAM_C) "$(INTDIR)"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\spam\MarkupEventHandler.cxx
+DEP_CPP_MARKUP=\
+       ".\include\Allocator.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spam\MarkupEventHandler.h"\
+       
+
+"$(INTDIR)\MarkupEventHandler.obj" : $(SOURCE) $(DEP_CPP_MARKUP) "$(INTDIR)"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\spam\CopyEventHandler.cxx
+DEP_CPP_COPYE=\
+       ".\include\Allocator.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spam\CopyEventHandler.h"\
+       ".\spam\MarkupEventHandler.h"\
+       
+
+"$(INTDIR)\CopyEventHandler.obj" : $(SOURCE) $(DEP_CPP_COPYE) "$(INTDIR)"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\spam\SpamMessages.msg
+
+!IF  "$(CFG)" == "spam - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "spam - Win32 Debug"
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\spam\spam.rc
+DEP_RSC_SPAM_R=\
+       ".\spam\SpamMessages.rc"\
+       
+
+!IF  "$(CFG)" == "spam - Win32 Release"
+
+
+"$(INTDIR)\spam.res" : $(SOURCE) $(DEP_RSC_SPAM_R) "$(INTDIR)"
+   $(RSC) /l 0x809 /fo"$(INTDIR)/spam.res" /i "spam" /d "NDEBUG" $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "spam - Win32 Debug"
+
+
+"$(INTDIR)\spam.res" : $(SOURCE) $(DEP_RSC_SPAM_R) "$(INTDIR)"
+   $(RSC) /l 0x809 /fo"$(INTDIR)/spam.res" /i "spam" /d "_DEBUG" $(SOURCE)
+
+
+!ENDIF 
+
+# End Source File
+# End Target
+################################################################################
+# Begin Target
+
+# Name "spent - Win32 Release"
+# Name "spent - Win32 Debug"
+
+!IF  "$(CFG)" == "spent - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "spent - Win32 Debug"
+
+!ENDIF 
+
+################################################################################
+# Begin Project Dependency
+
+# Project_Dep_Name "lib"
+
+!IF  "$(CFG)" == "spent - Win32 Release"
+
+"lib - Win32 Release" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\SP.mak" CFG="lib - Win32 Release" 
+
+!ELSEIF  "$(CFG)" == "spent - Win32 Debug"
+
+"lib - Win32 Debug" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\SP.mak" CFG="lib - Win32 Debug" 
+
+!ENDIF 
+
+# End Project Dependency
+################################################################################
+# Begin Source File
+
+SOURCE=.\spent\spent.cxx
+DEP_CPP_SPENT=\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\InputSource.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       
+
+"$(INTDIR)\spent.obj" : $(SOURCE) $(DEP_CPP_SPENT) "$(INTDIR)"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\spent\SpentMessages.msg
+
+!IF  "$(CFG)" == "spent - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "spent - Win32 Debug"
+
+!ENDIF 
+
+# End Source File
+# End Target
+################################################################################
+# Begin Target
+
+# Name "sgmlnorm - Win32 Release"
+# Name "sgmlnorm - Win32 Debug"
+
+!IF  "$(CFG)" == "sgmlnorm - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "sgmlnorm - Win32 Debug"
+
+!ENDIF 
+
+################################################################################
+# Begin Project Dependency
+
+# Project_Dep_Name "lib"
+
+!IF  "$(CFG)" == "sgmlnorm - Win32 Release"
+
+"lib - Win32 Release" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\SP.mak" CFG="lib - Win32 Release" 
+
+!ELSEIF  "$(CFG)" == "sgmlnorm - Win32 Debug"
+
+"lib - Win32 Debug" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\SP.mak" CFG="lib - Win32 Debug" 
+
+!ENDIF 
+
+# End Project Dependency
+################################################################################
+# Begin Source File
+
+SOURCE=.\sgmlnorm\sgmlnorm.cxx
+DEP_CPP_SGMLN=\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Allocator.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\GenericEventHandler.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\sgmlnorm\SGMLGenerator.h"\
+       
+
+"$(INTDIR)\sgmlnorm.obj" : $(SOURCE) $(DEP_CPP_SGMLN) "$(INTDIR)"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\sgmlnorm\SGMLGenerator.cxx
+DEP_CPP_SGMLG=\
+       ".\generic\SGMLApplication.h"\
+       ".\include\Boolean.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\config.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\sgmlnorm\SGMLGenerator.h"\
+       
+
+"$(INTDIR)\SGMLGenerator.obj" : $(SOURCE) $(DEP_CPP_SGMLG) "$(INTDIR)"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+# End Target
+################################################################################
+# Begin Target
+
+# Name "all - Win32 Release"
+# Name "all - Win32 Debug"
+
+!IF  "$(CFG)" == "all - Win32 Release"
+
+".\all" : 
+   CD all
+   
+
+!ELSEIF  "$(CFG)" == "all - Win32 Debug"
+
+".\all" : 
+   CD all
+   
+
+!ENDIF 
+
+################################################################################
+# Begin Project Dependency
+
+# Project_Dep_Name "lib"
+
+!IF  "$(CFG)" == "all - Win32 Release"
+
+"lib - Win32 Release" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\SP.mak" CFG="lib - Win32 Release" 
+
+!ELSEIF  "$(CFG)" == "all - Win32 Debug"
+
+"lib - Win32 Debug" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\SP.mak" CFG="lib - Win32 Debug" 
+
+!ENDIF 
+
+# End Project Dependency
+################################################################################
+# Begin Project Dependency
+
+# Project_Dep_Name "nsgmls"
+
+!IF  "$(CFG)" == "all - Win32 Release"
+
+"nsgmls - Win32 Release" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\SP.mak" CFG="nsgmls - Win32 Release" 
+
+!ELSEIF  "$(CFG)" == "all - Win32 Debug"
+
+"nsgmls - Win32 Debug" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\SP.mak" CFG="nsgmls - Win32 Debug" 
+
+!ENDIF 
+
+# End Project Dependency
+################################################################################
+# Begin Project Dependency
+
+# Project_Dep_Name "sgmlnorm"
+
+!IF  "$(CFG)" == "all - Win32 Release"
+
+"sgmlnorm - Win32 Release" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\SP.mak" CFG="sgmlnorm - Win32 Release" 
+
+!ELSEIF  "$(CFG)" == "all - Win32 Debug"
+
+"sgmlnorm - Win32 Debug" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\SP.mak" CFG="sgmlnorm - Win32 Debug" 
+
+!ENDIF 
+
+# End Project Dependency
+################################################################################
+# Begin Project Dependency
+
+# Project_Dep_Name "spam"
+
+!IF  "$(CFG)" == "all - Win32 Release"
+
+"spam - Win32 Release" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\SP.mak" CFG="spam - Win32 Release" 
+
+!ELSEIF  "$(CFG)" == "all - Win32 Debug"
+
+"spam - Win32 Debug" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\SP.mak" CFG="spam - Win32 Debug" 
+
+!ENDIF 
+
+# End Project Dependency
+################################################################################
+# Begin Project Dependency
+
+# Project_Dep_Name "spent"
+
+!IF  "$(CFG)" == "all - Win32 Release"
+
+"spent - Win32 Release" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\SP.mak" CFG="spent - Win32 Release" 
+
+!ELSEIF  "$(CFG)" == "all - Win32 Debug"
+
+"spent - Win32 Debug" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\SP.mak" CFG="spent - Win32 Debug" 
+
+!ENDIF 
+
+# End Project Dependency
+################################################################################
+# Begin Project Dependency
+
+# Project_Dep_Name "sx"
+
+!IF  "$(CFG)" == "all - Win32 Release"
+
+"sx - Win32 Release" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\SP.mak" CFG="sx - Win32 Release" 
+
+!ELSEIF  "$(CFG)" == "all - Win32 Debug"
+
+"sx - Win32 Debug" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\SP.mak" CFG="sx - Win32 Debug" 
+
+!ENDIF 
+
+# End Project Dependency
+# End Target
+################################################################################
+# Begin Target
+
+# Name "sx - Win32 Release"
+# Name "sx - Win32 Debug"
+
+!IF  "$(CFG)" == "sx - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "sx - Win32 Debug"
+
+!ENDIF 
+
+################################################################################
+# Begin Project Dependency
+
+# Project_Dep_Name "lib"
+
+!IF  "$(CFG)" == "sx - Win32 Release"
+
+"lib - Win32 Release" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\SP.mak" CFG="lib - Win32 Release" 
+
+!ELSEIF  "$(CFG)" == "sx - Win32 Debug"
+
+"lib - Win32 Debug" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\SP.mak" CFG="lib - Win32 Debug" 
+
+!ENDIF 
+
+# End Project Dependency
+################################################################################
+# Begin Source File
+
+SOURCE=.\sx\sx.cxx
+DEP_CPP_SX_CX=\
+       ".\include\Allocator.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\sptchar.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\sx\SxMessages.h"\
+       ".\sx\XmlOutputEventHandler.h"\
+       
+
+"$(INTDIR)\sx.obj" : $(SOURCE) $(DEP_CPP_SX_CX) "$(INTDIR)"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\sx\sx_inst.cxx
+DEP_CPP_SX_IN=\
+       ".\include\Boolean.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\InputSource.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\TypeId.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       
+
+"$(INTDIR)\sx_inst.obj" : $(SOURCE) $(DEP_CPP_SX_IN) "$(INTDIR)"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\sx\XmlOutputEventHandler.cxx
+DEP_CPP_XMLOU=\
+       ".\include\Allocator.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\UTF8CodingSystem.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\sx\XmlOutputEventHandler.h"\
+       ".\sx\XmlOutputMessages.h"\
+       
+
+"$(INTDIR)\XmlOutputEventHandler.obj" : $(SOURCE) $(DEP_CPP_XMLOU) "$(INTDIR)"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\sx\sx.rc
+DEP_RSC_SX_RC=\
+       ".\sx\SxMessages.rc"\
+       ".\sx\XmlOutputMessages.rc"\
+       
+
+!IF  "$(CFG)" == "sx - Win32 Release"
+
+
+"$(INTDIR)\sx.res" : $(SOURCE) $(DEP_RSC_SX_RC) "$(INTDIR)"
+   $(RSC) /l 0x809 /fo"$(INTDIR)/sx.res" /i "sx" /d "NDEBUG" $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "sx - Win32 Debug"
+
+
+"$(INTDIR)\sx.res" : $(SOURCE) $(DEP_RSC_SX_RC) "$(INTDIR)"
+   $(RSC) /l 0x809 /fo"$(INTDIR)/sx.res" /i "sx" /d "_DEBUG" $(SOURCE)
+
+
+!ENDIF 
+
+# End Source File
+# End Target
+# End Project
+################################################################################
diff --git a/VERSION b/VERSION
new file mode 100644 (file)
index 0000000..1892b92
--- /dev/null
+++ b/VERSION
@@ -0,0 +1 @@
+1.3.2
diff --git a/all/README b/all/README
new file mode 100644 (file)
index 0000000..57ecba4
--- /dev/null
@@ -0,0 +1,2 @@
+This file exists only to ensure that the all directory exists.
+This directory is used in the Visual C++ build process.
diff --git a/all/all.dsp b/all/all.dsp
new file mode 100644 (file)
index 0000000..af92ad8
--- /dev/null
@@ -0,0 +1,93 @@
+# Microsoft Developer Studio Project File - Name="all" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) External Target" 0x0106
+
+CFG=all - Win32 Release
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "all.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "all.mak" CFG="all - Win32 Release"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "all - Win32 Release" (based on "Win32 (x86) External Target")
+!MESSAGE "all - Win32 Debug" (based on "Win32 (x86) External Target")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+
+!IF  "$(CFG)" == "all - Win32 Release"
+
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir ".\Release"
+# PROP BASE Intermediate_Dir ".\Release"
+# PROP BASE Cmd_Line "NMAKE /f all.mak"
+# PROP BASE Rebuild_Opt "/a"
+# PROP BASE Target_File "all\all.exe"
+# PROP BASE Bsc_Name "all\all.bsc"
+# PROP BASE Target_Dir "."
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir ".\Release"
+# PROP Intermediate_Dir ".\Release"
+# PROP Cmd_Line ""
+# PROP Rebuild_Opt ""
+# PROP Target_File "all"
+# PROP Bsc_Name ""
+# PROP Target_Dir "."
+
+!ELSEIF  "$(CFG)" == "all - Win32 Debug"
+
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir ".\Debug"
+# PROP BASE Intermediate_Dir ".\Debug"
+# PROP BASE Cmd_Line "NMAKE /f all.mak"
+# PROP BASE Rebuild_Opt "/a"
+# PROP BASE Target_File "all\all.exe"
+# PROP BASE Bsc_Name "all\all.bsc"
+# PROP BASE Target_Dir "."
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir ".\Debug"
+# PROP Intermediate_Dir ".\Debug"
+# PROP Cmd_Line ""
+# PROP Rebuild_Opt ""
+# PROP Target_File "all"
+# PROP Bsc_Name ""
+# PROP Target_Dir "."
+
+!ENDIF 
+
+# Begin Target
+
+# Name "all - Win32 Release"
+# Name "all - Win32 Debug"
+
+!IF  "$(CFG)" == "all - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "all - Win32 Debug"
+
+!ENDIF 
+
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat;for;f90"
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/build-win32.bat b/build-win32.bat
new file mode 100755 (executable)
index 0000000..29750ce
--- /dev/null
@@ -0,0 +1,3 @@
+nmake -f sp-generate.mak
+nmake -f jade-generate.mak
+msdev jade.dsw /make "all - win32 release"
diff --git a/config/aclocal.m4 b/config/aclocal.m4
new file mode 100644 (file)
index 0000000..1166122
--- /dev/null
@@ -0,0 +1,3502 @@
+dnl aclocal.m4 generated automatically by aclocal 1.4-p5
+
+dnl Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+dnl PARTICULAR PURPOSE.
+
+dnl aclocal.m4 generated automatically by aclocal 1.4-p5
+
+dnl Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+dnl PARTICULAR PURPOSE.
+
+# libtool.m4 - Configure libtool for the host system. -*-Shell-script-*-
+
+# serial 46 AC_PROG_LIBTOOL
+AC_DEFUN([AC_PROG_LIBTOOL],
+[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+# Prevent multiple expansion
+define([AC_PROG_LIBTOOL], [])
+])
+
+AC_DEFUN([AC_LIBTOOL_SETUP],
+[AC_PREREQ(2.13)dnl
+AC_REQUIRE([AC_ENABLE_SHARED])dnl
+AC_REQUIRE([AC_ENABLE_STATIC])dnl
+AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_LD])dnl
+AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl
+AC_REQUIRE([AC_PROG_NM])dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl
+AC_REQUIRE([AC_OBJEXT])dnl
+AC_REQUIRE([AC_EXEEXT])dnl
+dnl
+
+_LT_AC_PROG_ECHO_BACKSLASH
+# Only perform the check for file, if the check method requires it
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    AC_PATH_MAGIC
+  fi
+  ;;
+esac
+
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+AC_CHECK_TOOL(STRIP, strip, :)
+
+ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no)
+ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL],
+enable_win32_dll=yes, enable_win32_dll=no)
+
+AC_ARG_ENABLE(libtool-lock,
+  [  --disable-libtool-lock  avoid locking (might break parallel builds)])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '[#]line __oline__ "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.$ac_objext` in
+    *32-bit*)
+      LD="${LD-ld} -32"
+      ;;
+    *N32*)
+      LD="${LD-ld} -n32"
+      ;;
+    *64-bit*)
+      LD="${LD-ld} -64"
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+    [AC_LANG_SAVE
+     AC_LANG_C
+     AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+     AC_LANG_RESTORE])
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+
+ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL],
+[*-*-cygwin* | *-*-mingw* | *-*-pw32*)
+  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+  AC_CHECK_TOOL(AS, as, false)
+  AC_CHECK_TOOL(OBJDUMP, objdump, false)
+
+  # recent cygwin and mingw systems supply a stub DllMain which the user
+  # can override, but on older systems we have to supply one
+  AC_CACHE_CHECK([if libtool should supply DllMain function], lt_cv_need_dllmain,
+    [AC_TRY_LINK([],
+      [extern int __attribute__((__stdcall__)) DllMain(void*, int, void*);
+      DllMain (0, 0, 0);],
+      [lt_cv_need_dllmain=no],[lt_cv_need_dllmain=yes])])
+
+  case $host/$CC in
+  *-*-cygwin*/gcc*-mno-cygwin*|*-*-mingw*)
+    # old mingw systems require "-dll" to link a DLL, while more recent ones
+    # require "-mdll"
+    SAVE_CFLAGS="$CFLAGS"
+    CFLAGS="$CFLAGS -mdll"
+    AC_CACHE_CHECK([how to link DLLs], lt_cv_cc_dll_switch,
+      [AC_TRY_LINK([], [], [lt_cv_cc_dll_switch=-mdll],[lt_cv_cc_dll_switch=-dll])])
+    CFLAGS="$SAVE_CFLAGS" ;;
+  *-*-cygwin* | *-*-pw32*)
+    # cygwin systems need to pass --dll to the linker, and not link
+    # crt.o which will require a WinMain@16 definition.
+    lt_cv_cc_dll_switch="-Wl,--dll -nostartfiles" ;;
+  esac
+  ;;
+  ])
+esac
+
+_LT_AC_LTCONFIG_HACK
+
+])
+
+# _LT_AC_CHECK_DLFCN
+# --------------------
+AC_DEFUN(_LT_AC_CHECK_DLFCN,
+[AC_CHECK_HEADERS(dlfcn.h)
+])# _LT_AC_CHECK_DLFCN
+
+# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+# ---------------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE],
+[AC_REQUIRE([AC_CANONICAL_HOST])
+AC_REQUIRE([AC_PROG_NM])
+AC_REQUIRE([AC_OBJEXT])
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [dnl
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+[symcode='[BCDEGRST]']
+
+# Regexp to match symbols that can be accessed directly from C.
+[sympat='\([_A-Za-z][_A-Za-z0-9]*\)']
+
+# Transform the above into a raw symbol and a C symbol.
+symxfrm='\1 \2\3 \3'
+
+# Transform an extracted symbol line into a proper C declaration
+lt_cv_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'"
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  [symcode='[BCDT]']
+  ;;
+cygwin* | mingw* | pw32*)
+  [symcode='[ABCDGISTW]']
+  ;;
+hpux*) # Its linker distinguishes data from code symbols
+  lt_cv_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+  ;;
+irix*)
+  [symcode='[BCDEGRST]']
+  ;;
+solaris* | sysv5*)
+  [symcode='[BDT]']
+  ;;
+sysv4)
+  [symcode='[DFNSTU]']
+  ;;
+esac
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $host_os in
+mingw*)
+  opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
+  [symcode='[ABCDGISTW]']
+fi
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Write the raw and C identifiers.
+[lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[       ]\($symcode$symcode*\)[         ][      ]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'"]
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+  rm -f conftest*
+  cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+EOF
+
+  if AC_TRY_EVAL(ac_compile); then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+       mv -f "$nlist"T "$nlist"
+      else
+       rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if egrep ' nm_test_var$' "$nlist" >/dev/null; then
+       if egrep ' nm_test_func$' "$nlist" >/dev/null; then
+         cat <<EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+         # Now generate the symbol file.
+         eval "$lt_cv_global_symbol_to_cdecl"' < "$nlist" >> conftest.$ac_ext'
+
+         cat <<EOF >> conftest.$ac_ext
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+  const char *name;
+  lt_ptr_t address;
+}
+[lt_preloaded_symbols[] =]
+{
+EOF
+         sed "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" >> conftest.$ac_ext
+         cat <<\EOF >> conftest.$ac_ext
+  {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+         # Now try linking the two files.
+         mv conftest.$ac_objext conftstm.$ac_objext
+         save_LIBS="$LIBS"
+         save_CFLAGS="$CFLAGS"
+         LIBS="conftstm.$ac_objext"
+         CFLAGS="$CFLAGS$no_builtin_flag"
+         if AC_TRY_EVAL(ac_link) && test -s conftest; then
+           pipe_works=yes
+         fi
+         LIBS="$save_LIBS"
+         CFLAGS="$save_CFLAGS"
+       else
+         echo "cannot find nm_test_func in $nlist" >&AC_FD_CC
+       fi
+      else
+       echo "cannot find nm_test_var in $nlist" >&AC_FD_CC
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AC_FD_CC
+    fi
+  else
+    echo "$progname: failed program was:" >&AC_FD_CC
+    cat conftest.$ac_ext >&5
+  fi
+  rm -f conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+])
+global_symbol_pipe="$lt_cv_sys_global_symbol_pipe"
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  global_symbol_to_cdecl=
+else
+  global_symbol_to_cdecl="$lt_cv_global_symbol_to_cdecl"
+fi
+if test -z "$global_symbol_pipe$global_symbol_to_cdecl"; then
+  AC_MSG_RESULT(failed)
+else
+  AC_MSG_RESULT(ok)
+fi
+]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+
+# _LT_AC_LIBTOOL_SYS_PATH_SEPARATOR
+# ---------------------------------
+AC_DEFUN([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR],
+[# Find the correct PATH separator.  Usually this is `:', but
+# DJGPP uses `;' like DOS.
+if test "X${PATH_SEPARATOR+set}" != Xset; then
+  UNAME=${UNAME-`uname 2>/dev/null`}
+  case X$UNAME in
+    *-DOS) lt_cv_sys_path_separator=';' ;;
+    *)     lt_cv_sys_path_separator=':' ;;
+  esac
+fi
+])# _LT_AC_LIBTOOL_SYS_PATH_SEPARATOR
+
+# _LT_AC_PROG_ECHO_BACKSLASH
+# --------------------------
+# Add some code to the start of the generated configure script which
+# will find an echo command which doesn;t interpret backslashes.
+AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH],
+[ifdef([AC_DIVERSION_NOTICE], [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
+                              [AC_DIVERT_PUSH(NOTICE)])
+_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR
+
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$ECHO in
+X*--fallback-echo)
+  # Remove one level of quotation (which was required for Make).
+  ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
+  ;;
+esac
+
+echo=${ECHO-echo}
+if test "X[$]1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X[$]1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
+  # Yippee, $echo works!
+  :
+else
+  # Restart under the correct shell.
+  exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
+fi
+
+if test "X[$]1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<EOF
+$*
+EOF
+  exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
+
+if test -z "$ECHO"; then
+if test "X${echo_test_string+set}" != Xset; then
+# find a string as large as possible, as long as the shell can cope with it
+  for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
+    # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+    if (echo_test_string="`eval $cmd`") 2>/dev/null &&
+       echo_test_string="`eval $cmd`" &&
+       (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
+    then
+      break
+    fi
+  done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+   echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+   test "X$echo_testing_string" = "X$echo_test_string"; then
+  :
+else
+  # The Solaris, AIX, and Digital Unix default echo programs unquote
+  # backslashes.  This makes it impossible to quote backslashes using
+  #   echo "$something" | sed 's/\\/\\\\/g'
+  #
+  # So, first we look for a working echo in the user's PATH.
+
+  IFS="${IFS=  }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
+  for dir in $PATH /usr/ucb; do
+    if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+       test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+       echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+       test "X$echo_testing_string" = "X$echo_test_string"; then
+      echo="$dir/echo"
+      break
+    fi
+  done
+  IFS="$save_ifs"
+
+  if test "X$echo" = Xecho; then
+    # We didn't find a better echo, so look for alternatives.
+    if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+       echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
+       test "X$echo_testing_string" = "X$echo_test_string"; then
+      # This shell has a builtin print -r that does the trick.
+      echo='print -r'
+    elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+        test "X$CONFIG_SHELL" != X/bin/ksh; then
+      # If we have ksh, try running configure again with it.
+      ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+      export ORIGINAL_CONFIG_SHELL
+      CONFIG_SHELL=/bin/ksh
+      export CONFIG_SHELL
+      exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
+    else
+      # Try using printf.
+      echo='printf %s\n'
+      if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+        echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+        test "X$echo_testing_string" = "X$echo_test_string"; then
+       # Cool, printf works
+       :
+      elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+          test "X$echo_testing_string" = 'X\t' &&
+          echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+          test "X$echo_testing_string" = "X$echo_test_string"; then
+       CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+       export CONFIG_SHELL
+       SHELL="$CONFIG_SHELL"
+       export SHELL
+       echo="$CONFIG_SHELL [$]0 --fallback-echo"
+      elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+          test "X$echo_testing_string" = 'X\t' &&
+          echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+          test "X$echo_testing_string" = "X$echo_test_string"; then
+       echo="$CONFIG_SHELL [$]0 --fallback-echo"
+      else
+       # maybe with a smaller string...
+       prev=:
+
+       for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
+         if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
+         then
+           break
+         fi
+         prev="$cmd"
+       done
+
+       if test "$prev" != 'sed 50q "[$]0"'; then
+         echo_test_string=`eval $prev`
+         export echo_test_string
+         exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
+       else
+         # Oops.  We lost completely, so just stick with echo.
+         echo=echo
+       fi
+      fi
+    fi
+  fi
+fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+ECHO=$echo
+if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
+   ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
+fi
+
+AC_SUBST(ECHO)
+AC_DIVERT_POP
+])# _LT_AC_PROG_ECHO_BACKSLASH
+
+# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+#                           ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ------------------------------------------------------------------
+AC_DEFUN(_LT_AC_TRY_DLOPEN_SELF,
+[if test "$cross_compiling" = yes; then :
+  [$4]
+else
+  AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<EOF
+[#line __oline__ "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL          RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL                DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL                0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW           RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW         DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW       RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW     DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW     0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
+
+    exit (status);
+}]
+EOF
+  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) $1 ;;
+      x$lt_dlneed_uscore) $2 ;;
+      x$lt_unknown|x*) $3 ;;
+    esac
+  else :
+    # compilation failed
+    $3
+  fi
+fi
+rm -fr conftest*
+])# _LT_AC_TRY_DLOPEN_SELF
+
+# AC_LIBTOOL_DLOPEN_SELF
+# -------------------
+AC_DEFUN(AC_LIBTOOL_DLOPEN_SELF,
+[if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  cygwin* | mingw* | pw32*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+   ;;
+
+  *)
+    AC_CHECK_LIB(dl, dlopen,  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+      [AC_CHECK_FUNC(dlopen, lt_cv_dlopen="dlopen",
+        [AC_CHECK_FUNC(shl_load, lt_cv_dlopen="shl_load",
+          [AC_CHECK_LIB(svld, dlopen,
+           [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+            [AC_CHECK_LIB(dld, shl_load,
+              [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"])
+           ])
+          ])
+        ])
+      ])
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    AC_CACHE_CHECK([whether a program can dlopen itself],
+         lt_cv_dlopen_self, [dnl
+         _LT_AC_TRY_DLOPEN_SELF(
+           lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+           lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+    ])
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      LDFLAGS="$LDFLAGS $link_static_flag"
+      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+         lt_cv_dlopen_self_static, [dnl
+         _LT_AC_TRY_DLOPEN_SELF(
+           lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+           lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
+      ])
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+])# AC_LIBTOOL_DLOPEN_SELF
+
+AC_DEFUN([_LT_AC_LTCONFIG_HACK],
+[AC_REQUIRE([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])dnl
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e s/^X//'
+[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g']
+
+# Same as above, but do not quote variable references.
+[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g']
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Constants:
+rm="rm -f"
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except M$VC,
+# which needs '.lib').
+libext=a
+ltmain="$ac_aux_dir/ltmain.sh"
+ofile="$default_ofile"
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+need_locks="$enable_libtool_lock"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+test -z "$AS" && AS=as
+test -z "$CC" && CC=cc
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$LD" && LD=ld
+test -z "$LN_S" && LN_S="ln -s"
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+test -z "$NM" && NM=nm
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$RANLIB" && RANLIB=:
+test -z "$STRIP" && STRIP=:
+test -z "$ac_objext" && ac_objext=o
+
+if test x"$host" != x"$build"; then
+  ac_tool_prefix=${host_alias}-
+else
+  ac_tool_prefix=
+fi
+
+# Transform linux* to *-*-linux-gnu*, to support old configure scripts.
+case $host_os in
+linux-gnu*) ;;
+linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
+esac
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+  old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds"
+fi
+
+# Allow CC to be a program name with arguments.
+set dummy $CC
+compiler="[$]2"
+
+AC_MSG_CHECKING([for objdir])
+rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+AC_MSG_RESULT($objdir)
+
+
+AC_ARG_WITH(pic, 
+[  --with-pic              try to use only PIC/non-PIC objects [default=use both]],
+pic_mode="$withval", pic_mode=default)
+test -z "$pic_mode" && pic_mode=default
+
+# We assume here that the value for lt_cv_prog_cc_pic will not be cached
+# in isolation, and that seeing it set (from the cache) indicates that
+# the associated values are set (in the cache) correctly too.
+AC_MSG_CHECKING([for $compiler option to produce PIC])
+AC_CACHE_VAL(lt_cv_prog_cc_pic,
+[ lt_cv_prog_cc_pic=
+  lt_cv_prog_cc_shlib=
+  lt_cv_prog_cc_wl=
+  lt_cv_prog_cc_static=
+  lt_cv_prog_cc_no_builtin=
+  lt_cv_prog_cc_can_build_shared=$can_build_shared
+
+  if test "$GCC" = yes; then
+    lt_cv_prog_cc_wl='-Wl,'
+    lt_cv_prog_cc_static='-static'
+
+    case $host_os in
+    aix*)
+      # Below there is a dirty hack to force normal static linking with -ldl
+      # The problem is because libdl dynamically linked with both libc and
+      # libC (AIX C++ library), which obviously doesn't included in libraries
+      # list by gcc. This cause undefined symbols with -static flags.
+      # This hack allows C programs to be linked with "-static -ldl", but
+      # we not sure about C++ programs.
+      lt_cv_prog_cc_static="$lt_cv_prog_cc_static ${lt_cv_prog_cc_wl}-lC"
+      ;;
+    amigaos*)
+      # FIXME: we need at least 68020 code to build shared libraries, but
+      # adding the `-m68020' flag to GCC prevents building anything better,
+      # like `-m68040'.
+      lt_cv_prog_cc_pic='-m68020 -resident32 -malways-restore-a4'
+      ;;
+    beos* | irix5* | irix6* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_cv_prog_cc_pic='-fno-common'
+      ;;
+    cygwin* | mingw* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_cv_prog_cc_pic='-DDLL_EXPORT'
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+        lt_cv_prog_cc_pic=-Kconform_pic
+      fi
+      ;;
+    *)
+      lt_cv_prog_cc_pic='-fPIC'
+      ;;
+    esac
+  else
+    # PORTME Check for PIC flags for the system compiler.
+    case $host_os in
+    aix3* | aix4* | aix5*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+        # AIX 5 now supports IA64 processor
+        lt_cv_prog_cc_static='-Bstatic'
+        lt_cv_prog_cc_wl='-Wl,'
+      else
+        lt_cv_prog_cc_static='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      # Is there a better lt_cv_prog_cc_static that works with the bundled CC?
+      lt_cv_prog_cc_wl='-Wl,'
+      lt_cv_prog_cc_static="${lt_cv_prog_cc_wl}-a ${lt_cv_prog_cc_wl}archive"
+      lt_cv_prog_cc_pic='+Z'
+      ;;
+
+    irix5* | irix6*)
+      lt_cv_prog_cc_wl='-Wl,'
+      lt_cv_prog_cc_static='-non_shared'
+      # PIC (with -KPIC) is the default.
+      ;;
+
+    cygwin* | mingw* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_cv_prog_cc_pic='-DDLL_EXPORT'
+      ;;
+
+    newsos6)
+      lt_cv_prog_cc_pic='-KPIC'
+      lt_cv_prog_cc_static='-Bstatic'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      # All OSF/1 code is PIC.
+      lt_cv_prog_cc_wl='-Wl,'
+      lt_cv_prog_cc_static='-non_shared'
+      ;;
+
+    sco3.2v5*)
+      lt_cv_prog_cc_pic='-Kpic'
+      lt_cv_prog_cc_static='-dn'
+      lt_cv_prog_cc_shlib='-belf'
+      ;;
+
+    solaris*)
+      lt_cv_prog_cc_pic='-KPIC'
+      lt_cv_prog_cc_static='-Bstatic'
+      lt_cv_prog_cc_wl='-Wl,'
+      ;;
+
+    sunos4*)
+      lt_cv_prog_cc_pic='-PIC'
+      lt_cv_prog_cc_static='-Bstatic'
+      lt_cv_prog_cc_wl='-Qoption ld '
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+      lt_cv_prog_cc_pic='-KPIC'
+      lt_cv_prog_cc_static='-Bstatic'
+      if test "x$host_vendor" = xsni; then
+        lt_cv_prog_cc_wl='-LD'
+      else
+        lt_cv_prog_cc_wl='-Wl,'
+      fi
+      ;;
+
+    uts4*)
+      lt_cv_prog_cc_pic='-pic'
+      lt_cv_prog_cc_static='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+       lt_cv_prog_cc_pic='-Kconform_pic'
+       lt_cv_prog_cc_static='-Bstatic'
+      fi
+      ;;
+
+    *)
+      lt_cv_prog_cc_can_build_shared=no
+      ;;
+    esac
+  fi
+])
+if test -z "$lt_cv_prog_cc_pic"; then
+  AC_MSG_RESULT([none])
+else
+  AC_MSG_RESULT([$lt_cv_prog_cc_pic])
+
+  # Check to make sure the pic_flag actually works.
+  AC_MSG_CHECKING([if $compiler PIC flag $lt_cv_prog_cc_pic works])
+  AC_CACHE_VAL(lt_cv_prog_cc_pic_works, [dnl
+    save_CFLAGS="$CFLAGS"
+    CFLAGS="$CFLAGS $lt_cv_prog_cc_pic -DPIC"
+    AC_TRY_COMPILE([], [], [dnl
+      case $host_os in
+      hpux9* | hpux10* | hpux11*)
+       # On HP-UX, both CC and GCC only warn that PIC is supported... then
+       # they create non-PIC objects.  So, if there were any warnings, we
+       # assume that PIC is not supported.
+       if test -s conftest.err; then
+         lt_cv_prog_cc_pic_works=no
+       else
+         lt_cv_prog_cc_pic_works=yes
+       fi
+       ;;
+      *)
+       lt_cv_prog_cc_pic_works=yes
+       ;;
+      esac
+    ], [dnl
+      lt_cv_prog_cc_pic_works=no
+    ])
+    CFLAGS="$save_CFLAGS"
+  ])
+
+  if test "X$lt_cv_prog_cc_pic_works" = Xno; then
+    lt_cv_prog_cc_pic=
+    lt_cv_prog_cc_can_build_shared=no
+  else
+    lt_cv_prog_cc_pic=" $lt_cv_prog_cc_pic"
+  fi
+
+  AC_MSG_RESULT([$lt_cv_prog_cc_pic_works])
+fi
+
+# Check for any special shared library compilation flags.
+if test -n "$lt_cv_prog_cc_shlib"; then
+  AC_MSG_WARN([\`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries])
+  if echo "$old_CC $old_CFLAGS " | [egrep -e "[        ]$lt_cv_prog_cc_shlib[  ]"] >/dev/null; then :
+  else
+   AC_MSG_WARN([add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure])
+    lt_cv_prog_cc_can_build_shared=no
+  fi
+fi
+
+AC_MSG_CHECKING([if $compiler static flag $lt_cv_prog_cc_static works])
+AC_CACHE_VAL([lt_cv_prog_cc_static_works], [dnl
+  lt_cv_prog_cc_static_works=no
+  save_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS $lt_cv_prog_cc_static"
+  AC_TRY_LINK([], [], [lt_cv_prog_cc_static_works=yes])
+  LDFLAGS="$save_LDFLAGS"
+])
+
+# Belt *and* braces to stop my trousers falling down:
+test "X$lt_cv_prog_cc_static_works" = Xno && lt_cv_prog_cc_static=
+AC_MSG_RESULT([$lt_cv_prog_cc_static_works])
+
+pic_flag="$lt_cv_prog_cc_pic"
+special_shlib_compile_flags="$lt_cv_prog_cc_shlib"
+wl="$lt_cv_prog_cc_wl"
+link_static_flag="$lt_cv_prog_cc_static"
+no_builtin_flag="$lt_cv_prog_cc_no_builtin"
+can_build_shared="$lt_cv_prog_cc_can_build_shared"
+
+
+# Check to see if options -o and -c are simultaneously supported by compiler
+AC_MSG_CHECKING([if $compiler supports -c -o file.$ac_objext])
+AC_CACHE_VAL([lt_cv_compiler_c_o], [
+$rm -r conftest 2>/dev/null
+mkdir conftest
+cd conftest
+echo "int some_variable = 0;" > conftest.$ac_ext
+mkdir out
+# According to Tom Tromey, Ian Lance Taylor reported there are C compilers
+# that will create temporary files in the current directory regardless of
+# the output directory.  Thus, making CWD read-only will cause this test
+# to fail, enabling locking or at least warning the user not to do parallel
+# builds.
+chmod -w .
+save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -o out/conftest2.$ac_objext"
+compiler_c_o=no
+if { (eval echo configure:__oline__: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then
+  # The compiler can only warn and ignore the option if not recognized
+  # So say no if there are warnings
+  if test -s out/conftest.err; then
+    lt_cv_compiler_c_o=no
+  else
+    lt_cv_compiler_c_o=yes
+  fi
+else
+  # Append any errors to the config.log.
+  cat out/conftest.err 1>&AC_FD_CC
+  lt_cv_compiler_c_o=no
+fi
+CFLAGS="$save_CFLAGS"
+chmod u+w .
+$rm conftest* out/*
+rmdir out
+cd ..
+rmdir conftest
+$rm -r conftest 2>/dev/null
+])
+compiler_c_o=$lt_cv_compiler_c_o
+AC_MSG_RESULT([$compiler_c_o])
+
+if test x"$compiler_c_o" = x"yes"; then
+  # Check to see if we can write to a .lo
+  AC_MSG_CHECKING([if $compiler supports -c -o file.lo])
+  AC_CACHE_VAL([lt_cv_compiler_o_lo], [
+  lt_cv_compiler_o_lo=no
+  save_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -c -o conftest.lo"
+  AC_TRY_COMPILE([], [int some_variable = 0;], [dnl
+    # The compiler can only warn and ignore the option if not recognized
+    # So say no if there are warnings
+    if test -s conftest.err; then
+      lt_cv_compiler_o_lo=no
+    else
+      lt_cv_compiler_o_lo=yes
+    fi
+  ])
+  CFLAGS="$save_CFLAGS"
+  ])
+  compiler_o_lo=$lt_cv_compiler_o_lo
+  AC_MSG_RESULT([$compiler_o_lo])
+else
+  compiler_o_lo=no
+fi
+
+# Check to see if we can do hard links to lock some files if needed
+hard_links="nottested"
+if test "$compiler_c_o" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  AC_MSG_CHECKING([if we can lock with hard links])
+  hard_links=yes
+  $rm conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  AC_MSG_RESULT([$hard_links])
+  if test "$hard_links" = no; then
+    AC_MSG_WARN([\`$CC' does not support \`-c -o', so \`make -j' may be unsafe])
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+if test "$GCC" = yes; then
+  # Check to see if options -fno-rtti -fno-exceptions are supported by compiler
+  AC_MSG_CHECKING([if $compiler supports -fno-rtti -fno-exceptions])
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  save_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.$ac_ext"
+  compiler_rtti_exceptions=no
+  AC_TRY_COMPILE([], [int some_variable = 0;], [dnl
+    # The compiler can only warn and ignore the option if not recognized
+    # So say no if there are warnings
+    if test -s conftest.err; then
+      compiler_rtti_exceptions=no
+    else
+      compiler_rtti_exceptions=yes
+    fi
+  ])
+  CFLAGS="$save_CFLAGS"
+  AC_MSG_RESULT([$compiler_rtti_exceptions])
+
+  if test "$compiler_rtti_exceptions" = "yes"; then
+    no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions'
+  else
+    no_builtin_flag=' -fno-builtin'
+  fi
+fi
+
+# See if the linker supports building shared libraries.
+AC_MSG_CHECKING([whether the linker ($LD) supports shared libraries])
+
+allow_undefined_flag=
+no_undefined_flag=
+need_lib_prefix=unknown
+need_version=unknown
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+archive_cmds=
+archive_expsym_cmds=
+old_archive_from_new_cmds=
+old_archive_from_expsyms_cmds=
+export_dynamic_flag_spec=
+whole_archive_flag_spec=
+thread_safe_flag_spec=
+hardcode_into_libs=no
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+hardcode_shlibpath_var=unsupported
+runpath_var=
+link_all_deplibs=unknown
+always_export_symbols=no
+export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols'
+# include_expsyms should be a list of space-separated symbols to be *always*
+# included in the symbol list
+include_expsyms=
+# exclude_expsyms can be an egrep regular expression of symbols to exclude
+# it will be wrapped by ` (' and `)$', so one must not match beginning or
+# end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+# as well as any symbol that contains `d'.
+exclude_expsyms="_GLOBAL_OFFSET_TABLE_"
+# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+# platforms (ab)use it in PIC code, but their linkers get confused if
+# the symbol is explicitly referenced.  Since portable code cannot
+# rely on this symbol name, it's probably fine to never include it in
+# preloaded symbol tables.
+extract_expsyms_cmds=
+
+case $host_os in
+cygwin* | mingw* | pw32* )
+  # FIXME: the MSVC++ port hasn't been tested in a loooong time
+  # When not using gcc, we currently assume that we are using
+  # Microsoft Visual C++.
+  if test "$GCC" != yes; then
+    with_gnu_ld=no
+  fi
+  ;;
+
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes; then
+  # If archive_cmds runs LD, not CC, wlarc should be empty
+  wlarc='${wl}'
+
+  # See if GNU ld supports shared libraries.
+  case $host_os in
+  aix3* | aix4* | aix5*)
+    # On AIX, the GNU linker is very broken
+    # Note:Check GNU linker on AIX 5-IA64 when/if it becomes available.
+    ld_shlibs=no
+    cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+    ;;
+
+  amigaos*)
+    archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_minus_L=yes
+
+    # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+    # that the semantics of dynamic libraries on AmigaOS, at least up
+    # to version 4, is to share data among multiple programs linked
+    # with the same dynamic library.  Since this doesn't match the
+    # behavior of shared libraries on other platforms, we can use
+    # them.
+    ld_shlibs=no
+    ;;
+
+  beos*)
+    if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+      allow_undefined_flag=unsupported
+      # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+      # support --undefined.  This deserves some investigation.  FIXME
+      archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+    else
+      ld_shlibs=no
+    fi
+    ;;
+
+  cygwin* | mingw* | pw32*)
+    # hardcode_libdir_flag_spec is actually meaningless, as there is
+    # no search path for DLLs.
+    hardcode_libdir_flag_spec='-L$libdir'
+    allow_undefined_flag=unsupported
+    always_export_symbols=yes
+
+    extract_expsyms_cmds='test -f $output_objdir/impgen.c || \
+      sed -e "/^# \/\* impgen\.c starts here \*\//,/^# \/\* impgen.c ends here \*\// { s/^# //;s/^# *$//; p; }" -e d < $''0 > $output_objdir/impgen.c~
+      test -f $output_objdir/impgen.exe || (cd $output_objdir && \
+      if test "x$HOST_CC" != "x" ; then $HOST_CC -o impgen impgen.c ; \
+      else $CC -o impgen impgen.c ; fi)~
+      $output_objdir/impgen $dir/$soroot > $output_objdir/$soname-def'
+
+    old_archive_from_expsyms_cmds='$DLLTOOL --as=$AS --dllname $soname --def $output_objdir/$soname-def --output-lib $output_objdir/$newlib'
+
+    # cygwin and mingw dlls have different entry points and sets of symbols
+    # to exclude.
+    # FIXME: what about values for MSVC?
+    dll_entry=__cygwin_dll_entry@12
+    dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12~
+    case $host_os in
+    mingw*)
+      # mingw values
+      dll_entry=_DllMainCRTStartup@12
+      dll_exclude_symbols=DllMain@12,DllMainCRTStartup@12,DllEntryPoint@12~
+      ;;
+    esac
+
+    # mingw and cygwin differ, and it's simplest to just exclude the union
+    # of the two symbol sets.
+    dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12,DllMainCRTStartup@12,DllEntryPoint@12
+
+    # recent cygwin and mingw systems supply a stub DllMain which the user
+    # can override, but on older systems we have to supply one (in ltdll.c)
+    if test "x$lt_cv_need_dllmain" = "xyes"; then
+      ltdll_obj='$output_objdir/$soname-ltdll.'"$ac_objext "
+      ltdll_cmds='test -f $output_objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < [$]0 > $output_objdir/$soname-ltdll.c~
+       test -f $output_objdir/$soname-ltdll.$ac_objext || (cd $output_objdir && $CC -c $soname-ltdll.c)~'
+    else
+      ltdll_obj=
+      ltdll_cmds=
+    fi
+
+    # Extract the symbol export list from an `--export-all' def file,
+    # then regenerate the def file from the symbol export list, so that
+    # the compiled dll only exports the symbol export list.
+    # Be careful not to strip the DATA tag left be newer dlltools.
+    export_symbols_cmds="$ltdll_cmds"'
+      $DLLTOOL --export-all --exclude-symbols '$dll_exclude_symbols' --output-def $output_objdir/$soname-def '$ltdll_obj'$libobjs $convenience~
+      [sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]*//" -e "s/ *;.*$//"] < $output_objdir/$soname-def > $export_symbols'
+
+    # If the export-symbols file already is a .def file (1st line
+    # is EXPORTS), use it as is.
+    # If DATA tags from a recent dlltool are present, honour them!
+    archive_expsym_cmds='if test "x`head -1 $export_symbols`" = xEXPORTS; then
+        cp $export_symbols $output_objdir/$soname-def;
+      else
+        echo EXPORTS > $output_objdir/$soname-def;
+        _lt_hint=1;
+        cat $export_symbols | while read symbol; do
+         set dummy \$symbol;
+         case \[$]# in
+           2) echo "   \[$]2 @ \$_lt_hint ; " >> $output_objdir/$soname-def;;
+           *) echo "     \[$]2 @ \$_lt_hint \[$]3 ; " >> $output_objdir/$soname-def;;
+         esac;
+         _lt_hint=`expr 1 + \$_lt_hint`;
+        done;
+      fi~
+      '"$ltdll_cmds"'
+      $CC -Wl,--base-file,$output_objdir/$soname-base '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~
+      $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp~
+      $CC -Wl,--base-file,$output_objdir/$soname-base $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~
+      $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp --output-lib $output_objdir/$libname.dll.a~
+      $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags'
+    ;;
+
+  netbsd*)
+    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+      archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+      wlarc=
+    else
+      archive_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      archive_expsym_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+    fi
+    ;;
+
+  solaris* | sysv5*)
+    if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then
+      ld_shlibs=no
+      cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+    elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+    else
+      ld_shlibs=no
+    fi
+    ;;
+
+  sunos4*)
+    archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+    wlarc=
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  *)
+    if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+    else
+      ld_shlibs=no
+    fi
+    ;;
+  esac
+
+  if test "$ld_shlibs" = yes; then
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'
+    export_dynamic_flag_spec='${wl}--export-dynamic'
+    case $host_os in
+    cygwin* | mingw* | pw32*)
+      # dlltool doesn't understand --whole-archive et. al.
+      whole_archive_flag_spec=
+      ;;
+    *)
+      # ancient GNU ld didn't support --whole-archive et. al.
+      if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then
+       whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      else
+       whole_archive_flag_spec=
+      fi
+      ;;
+    esac
+  fi
+else
+  # PORTME fill in a description of your system's linker (not GNU ld)
+  case $host_os in
+  aix3*)
+    allow_undefined_flag=unsupported
+    always_export_symbols=yes
+    archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+    # Note: this linker hardcodes the directories in LIBPATH if there
+    # are no directories specified by -L.
+    hardcode_minus_L=yes
+    if test "$GCC" = yes && test -z "$link_static_flag"; then
+      # Neither direct hardcoding nor static linking is supported with a
+      # broken collect2.
+      hardcode_direct=unsupported
+    fi
+    ;;
+
+  aix4* | aix5*)
+    # When large executables or shared objects are built, AIX ld can
+    # have problems creating the table of contents.  If linking a library
+    # or program results in "error TOC overflow" add -mminimal-toc to
+    # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+    # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+    archive_cmds=''
+    hardcode_libdir_separator=':'
+    if test "$GCC" = yes; then
+      collect2name=`${CC} -print-prog-name=collect2`
+      if test -f "$collect2name" && \
+        strings "$collect2name" | grep resolve_lib_name >/dev/null
+      then
+       # We have reworked collect2
+       hardcode_direct=yes
+      else
+        # We have old collect2
+        hardcode_direct=unsupported
+        # It fails to find uninstalled libraries when the uninstalled
+        # path is not listed in the libpath.  Setting hardcode_minus_L
+        # to unsupported forces relinking
+        hardcode_minus_L=yes
+        hardcode_libdir_flag_spec='-L$libdir'
+        hardcode_libdir_separator=
+      fi
+      shared_flag='-shared'
+    else
+      if test "$host_cpu" = ia64; then
+        shared_flag='-G'
+      else
+        shared_flag='${wl}-bM:SRE'
+      fi
+      hardcode_direct=yes
+    fi
+
+    if test "$host_cpu" = ia64; then
+      # On IA64, the linker does run time linking by default, so we don't
+      # have to do anything special.
+      aix_use_runtimelinking=no
+      exp_sym_flag='-Bexport'
+      no_entry_flag=""
+    else
+      # Test if we are trying to use run time linking, or normal AIX style linking.
+      # If -brtl is somewhere in LDFLAGS, we need to do run time linking.
+      aix_use_runtimelinking=no
+      for ld_flag in $LDFLAGS; do
+        if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl" ); then
+          aix_use_runtimelinking=yes
+          break
+        fi
+      done
+      exp_sym_flag='-bexport'
+      no_entry_flag='-bnoentry'
+    fi
+    # It seems that -bexpall can do strange things, so it is better to
+    # generate a list of symbols to export.
+    always_export_symbols=yes
+    if test "$aix_use_runtimelinking" = yes; then
+      hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:/usr/lib:/lib'
+      allow_undefined_flag=' -Wl,-G'
+      archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"
+    else
+      if test "$host_cpu" = ia64; then
+        hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+       allow_undefined_flag="-znodefs"
+        archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname ${wl}-h$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"
+      else
+        hardcode_libdir_flag_spec='${wl}-bnolibpath ${wl}-blibpath:$libdir:/usr/lib:/lib'
+        # Warning - without using the other run time loading flags, -berok will
+        #           link without error, but may produce a broken library.
+        allow_undefined_flag='${wl}-berok'
+        # This is a bit strange, but is similar to how AIX traditionally builds
+        # it's shared libraries.
+        archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"' ~$AR -crlo $objdir/$libname$release.a $objdir/$soname'
+      fi
+    fi
+    ;;
+
+  amigaos*)
+    archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_minus_L=yes
+    # see comment about different semantics on the GNU ld section
+    ld_shlibs=no
+    ;;
+
+  cygwin* | mingw* | pw32*)
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    # hardcode_libdir_flag_spec is actually meaningless, as there is
+    # no search path for DLLs.
+    hardcode_libdir_flag_spec=' '
+    allow_undefined_flag=unsupported
+    # Tell ltmain to make .lib files, not .a files.
+    libext=lib
+    # FIXME: Setting linknames here is a bad hack.
+    archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames='
+    # The linker will automatically build a .lib file if we build a DLL.
+    old_archive_from_new_cmds='true'
+    # FIXME: Should let the user specify the lib program.
+    old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs'
+    fix_srcfile_path='`cygpath -w "$srcfile"`'
+    ;;
+
+  darwin* | rhapsody*)
+    allow_undefined_flag='-undefined suppress'
+    # FIXME: Relying on posixy $() will cause problems for
+    #        cross-compilation, but unfortunately the echo tests do not
+    #        yet detect zsh echo's removal of \ escapes.
+    archive_cmds='$CC $(test .$module = .yes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib $libobjs $deplibs$linkopts -install_name $rpath/$soname $(test -n "$verstring" -a x$verstring != x0.0 && echo $verstring)'
+    # We need to add '_' to the symbols in $export_symbols first
+    #archive_expsym_cmds="$archive_cmds"' && strip -s $export_symbols'
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    whole_archive_flag_spec='-all_load $convenience'
+    ;;
+
+  freebsd1*)
+    ld_shlibs=no
+    ;;
+
+  # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+  # support.  Future versions do this automatically, but an explicit c++rt0.o
+  # does not break anything, and helps significantly (at the cost of a little
+  # extra space).
+  freebsd2.2*)
+    archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+    hardcode_libdir_flag_spec='-R$libdir'
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+  freebsd2*)
+    archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+    hardcode_direct=yes
+    hardcode_minus_L=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+  freebsd*)
+    archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+    hardcode_libdir_flag_spec='-R$libdir'
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  hpux9* | hpux10* | hpux11*)
+    case $host_os in
+    hpux9*) archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ;;
+    *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;;
+    esac
+    hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+    hardcode_libdir_separator=:
+    hardcode_direct=yes
+    hardcode_minus_L=yes # Not in the search PATH, but as the default
+                        # location of the library.
+    export_dynamic_flag_spec='${wl}-E'
+    ;;
+
+  irix5* | irix6*)
+    if test "$GCC" = yes; then
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+    else
+      archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+    fi
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    hardcode_libdir_separator=:
+    link_all_deplibs=yes
+    ;;
+
+  netbsd*)
+    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+    else
+      archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+    fi
+    hardcode_libdir_flag_spec='-R$libdir'
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  newsos6)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
+    hardcode_direct=yes
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    hardcode_libdir_separator=:
+    hardcode_shlibpath_var=no
+    ;;
+
+  openbsd*)
+    archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+    hardcode_libdir_flag_spec='-R$libdir'
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  os2*)
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_minus_L=yes
+    allow_undefined_flag=unsupported
+    archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+    old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+    ;;
+
+  osf3*)
+    if test "$GCC" = yes; then
+      allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+      archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+    else
+      allow_undefined_flag=' -expect_unresolved \*'
+      archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+    fi
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    hardcode_libdir_separator=:
+    ;;
+
+  osf4* | osf5*)       # as osf3* with the addition of -msym flag
+    if test "$GCC" = yes; then
+      allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+      archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    else
+      allow_undefined_flag=' -expect_unresolved \*'
+      archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+      archive_expsym_cmds='for i in `cat $export_symbols`; do printf "-exported_symbol " >> $lib.exp; echo "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+      $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp'
+
+      #Both c and cxx compiler support -rpath directly
+      hardcode_libdir_flag_spec='-rpath $libdir'
+    fi
+    hardcode_libdir_separator=:
+    ;;
+
+  sco3.2v5*)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+    hardcode_shlibpath_var=no
+    runpath_var=LD_RUN_PATH
+    hardcode_runpath_var=yes
+    ;;
+
+  solaris*)
+    no_undefined_flag=' -z defs'
+    # $CC -shared without GNU ld will not create a library from C++
+    # object files and a static libstdc++, better avoid it by now
+    archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+    archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+               $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+    hardcode_libdir_flag_spec='-R$libdir'
+    hardcode_shlibpath_var=no
+    case $host_os in
+    [solaris2.[0-5] | solaris2.[0-5].*]) ;;
+    *) # Supported since Solaris 2.6 (maybe 2.5.1?)
+      whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;;
+    esac
+    link_all_deplibs=yes
+    ;;
+
+  sunos4*)
+    if test "x$host_vendor" = xsequent; then
+      # Use $CC to link under sequent, because it throws in some extra .o
+      # files that make .init and .fini sections work.
+      archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+    else
+      archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+    fi
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_direct=yes
+    hardcode_minus_L=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  sysv4)
+    if test "x$host_vendor" = xsno; then
+      archive_cmds='$LD -G -Bsymbolic -h $soname -o $lib $libobjs $deplibs $linkopts'
+      hardcode_direct=yes # is this really true???
+    else
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+    fi
+    runpath_var='LD_RUN_PATH'
+    hardcode_shlibpath_var=no
+    ;;
+
+  sysv4.3*)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+    hardcode_shlibpath_var=no
+    export_dynamic_flag_spec='-Bexport'
+    ;;
+
+  sysv5*)
+    no_undefined_flag=' -z text'
+    # $CC -shared without GNU ld will not create a library from C++
+    # object files and a static libstdc++, better avoid it by now
+    archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+    archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+               $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+    hardcode_libdir_flag_spec=
+    hardcode_shlibpath_var=no
+    runpath_var='LD_RUN_PATH'
+    ;;
+
+  uts4*)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_shlibpath_var=no
+    ;;
+
+  dgux*)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_shlibpath_var=no
+    ;;
+
+  sysv4*MP*)
+    if test -d /usr/nec; then
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var=no
+      runpath_var=LD_RUN_PATH
+      hardcode_runpath_var=yes
+      ld_shlibs=yes
+    fi
+    ;;
+
+  sysv4.2uw2*)
+    archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+    hardcode_direct=yes
+    hardcode_minus_L=no
+    hardcode_shlibpath_var=no
+    hardcode_runpath_var=yes
+    runpath_var=LD_RUN_PATH
+    ;;
+
+  sysv5uw7* | unixware7*)
+    no_undefined_flag='${wl}-z ${wl}text'
+    if test "$GCC" = yes; then
+      archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+    else
+      archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+    fi
+    runpath_var='LD_RUN_PATH'
+    hardcode_shlibpath_var=no
+    ;;
+
+  *)
+    ld_shlibs=no
+    ;;
+  esac
+fi
+AC_MSG_RESULT([$ld_shlibs])
+test "$ld_shlibs" = no && can_build_shared=no
+
+# Check hardcoding attributes.
+AC_MSG_CHECKING([how to hardcode library paths into programs])
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" || \
+   test -n "$runpath_var"; then
+
+  # We can hardcode non-existant directories.
+  if test "$hardcode_direct" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$hardcode_shlibpath_var" != no &&
+     test "$hardcode_minus_L" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+AC_MSG_RESULT([$hardcode_action])
+
+striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  AC_MSG_RESULT([yes])
+else
+  AC_MSG_RESULT([no])
+fi
+
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+# PORTME Fill in your ld.so characteristics
+AC_MSG_CHECKING([dynamic linker characteristics])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}.so$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}.so$major'
+  ;;
+
+aix4* | aix5*)
+  version_type=linux
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}.so$major ${libname}${release}.so$versuffix $libname.so'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      [ aix4 | aix4.[01] | aix4.[01].*)]
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+           echo ' yes '
+           echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+        :
+      else
+        can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so instead of
+      # lib<name>.a to let people know that these are not typical AIX shared libraries.
+      library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}.so$major'
+    fi
+    shlibpath_var=LIBPATH
+    deplibs_check_method=pass_all
+  fi
+  ;;
+
+amigaos*)
+  library_names_spec='$libname.ixlibrary $libname.a'
+  # Create ${libname}_ixlibrary.a entries in /sys/libs.
+  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | [$Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\'']`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done'
+  ;;
+
+beos*)
+  library_names_spec='${libname}.so'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi4*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  export_dynamic_flag_spec=-rdynamic
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32*)
+  version_type=windows
+  need_version=no
+  need_lib_prefix=no
+  case $GCC,$host_os in
+  yes,cygwin*)
+    library_names_spec='$libname.dll.a'
+    soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | [sed -e 's/[.]/-/g']`${versuffix}.dll'
+    postinstall_cmds='dlpath=`bash 2>&1 -c '\''. $dir/${file}i;echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog .libs/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`bash 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $rm \$dlpath'
+    ;;
+  yes,mingw*)
+    library_names_spec='${libname}`echo ${release} | [sed -e 's/[.]/-/g']`${versuffix}.dll'
+    sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g"`
+    ;;
+  yes,pw32*)
+    library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll'
+    ;;
+  *)
+    library_names_spec='${libname}`echo ${release} | [sed -e 's/[.]/-/g']`${versuffix}.dll $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  # FIXME: Relying on posixy $() will cause problems for
+  #        cross-compilation, but unfortunately the echo tests do not
+  #        yet detect zsh echo's removal of \ escapes.
+  library_names_spec='${libname}${release}${versuffix}.$(test .$module = .yes && echo so || echo dylib) ${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib) ${libname}.$(test .$module = .yes && echo so || echo dylib)'
+  soname_spec='${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib)'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+freebsd*)
+  objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  *)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  dynamic_linker="$host_os dld.sl"
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  shlibpath_var=SHLIB_PATH
+  shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+  library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl'
+  soname_spec='${libname}${release}.sl$major'
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
+
+irix5* | irix6*)
+  version_type=irix
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}.so$major'
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so $libname.so'
+  case $host_os in
+  irix5*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux-gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so'
+    soname_spec='${libname}${release}.so$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+openbsd*)
+  version_type=sunos
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+    need_version=no
+  fi
+  library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+os2*)
+  libname_spec='$name'
+  need_lib_prefix=no
+  library_names_spec='$libname.dll $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_version=no
+  soname_spec='${libname}${release}.so'
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+sco3.2v5*)
+  version_type=osf
+  soname_spec='${libname}${release}.so$major'
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+  version_type=linux
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so'
+    soname_spec='$libname.so.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+
+# Report the final consequences.
+AC_MSG_CHECKING([if libtool supports shared libraries])
+AC_MSG_RESULT([$can_build_shared])
+
+if test "$hardcode_action" = relink; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+AC_LIBTOOL_DLOPEN_SELF
+
+if test "$enable_shared" = yes && test "$GCC" = yes; then
+  case $archive_cmds in
+  *'~'*)
+    # FIXME: we may have to deal with multi-command sequences.
+    ;;
+  '$CC '*)
+    # Test whether the compiler implicitly links with -lc since on some
+    # systems, -lgcc has to come before -lc. If gcc already passes -lc
+    # to ld, don't add -lc before -lgcc.
+    AC_MSG_CHECKING([whether -lc should be explicitly linked in])
+    AC_CACHE_VAL([lt_cv_archive_cmds_need_lc],
+    [$rm conftest*
+    echo 'static int dummy;' > conftest.$ac_ext
+
+    if AC_TRY_EVAL(ac_compile); then
+      soname=conftest
+      lib=conftest
+      libobjs=conftest.$ac_objext
+      deplibs=
+      wl=$lt_cv_prog_cc_wl
+      compiler_flags=-v
+      linker_flags=-v
+      verstring=
+      output_objdir=.
+      libname=conftest
+      save_allow_undefined_flag=$allow_undefined_flag
+      allow_undefined_flag=
+      if AC_TRY_EVAL(archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1)
+      then
+       lt_cv_archive_cmds_need_lc=no
+      else
+       lt_cv_archive_cmds_need_lc=yes
+      fi
+      allow_undefined_flag=$save_allow_undefined_flag
+    else
+      cat conftest.err 1>&5
+    fi])
+    AC_MSG_RESULT([$lt_cv_archive_cmds_need_lc])
+    ;;
+  esac
+fi
+need_lc=${lt_cv_archive_cmds_need_lc-yes}
+
+# The second clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+  :
+else
+  # If there is no Makefile yet, we rely on a make rule to execute
+  # `config.status --recheck' to rerun these tests and create the
+  # libtool script then.
+  test -f Makefile && make "$ltmain"
+fi
+
+if test -f "$ltmain"; then
+  trap "$rm \"${ofile}T\"; exit 1" 1 2 15
+  $rm -f "${ofile}T"
+
+  echo creating $ofile
+
+  # Now quote all the things that may contain metacharacters while being
+  # careful not to overquote the AC_SUBSTed values.  We take copies of the
+  # variables and quote the copies for generation of the libtool script.
+  for var in echo old_CC old_CFLAGS \
+    AR AR_FLAGS CC LD LN_S NM SHELL \
+    reload_flag reload_cmds wl \
+    pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \
+    thread_safe_flag_spec whole_archive_flag_spec libname_spec \
+    library_names_spec soname_spec \
+    RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \
+    old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds \
+    postuninstall_cmds extract_expsyms_cmds old_archive_from_expsyms_cmds \
+    old_striplib striplib file_magic_cmd export_symbols_cmds \
+    deplibs_check_method allow_undefined_flag no_undefined_flag \
+    finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \
+    hardcode_libdir_flag_spec hardcode_libdir_separator  \
+    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+    compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do
+
+    case $var in
+    reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \
+    old_postinstall_cmds | old_postuninstall_cmds | \
+    export_symbols_cmds | archive_cmds | archive_expsym_cmds | \
+    extract_expsyms_cmds | old_archive_from_expsyms_cmds | \
+    postinstall_cmds | postuninstall_cmds | \
+    finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+      # Double-quote double-evaled strings.
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+      ;;
+    *)
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+      ;;
+    esac
+  done
+
+  cat <<__EOF__ > "${ofile}T"
+#! $SHELL
+
+# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996-2000 Free Software Foundation, Inc.
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="sed -e s/^X//"
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$need_lc
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# The default C compiler.
+CC=$lt_CC
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_wl
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_pic_flag
+pic_mode=$pic_mode
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_compiler_c_o
+
+# Can we write directly to a .lo ?
+compiler_o_lo=$lt_compiler_o_lo
+
+# Must we lock files when doing compilation ?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_link_static_flag
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_no_builtin_flag
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_global_symbol_to_cdecl
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# ### END LIBTOOL CONFIG
+
+__EOF__
+
+  case $host_os in
+  aix3*)
+    cat <<\EOF >> "${ofile}T"
+
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+EOF
+    ;;
+  esac
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | os2*)
+    cat <<'EOF' >> "${ofile}T"
+      # This is a source program that is used to create dlls on Windows
+      # Don't remove nor modify the starting and closing comments
+# /* ltdll.c starts here */
+# #define WIN32_LEAN_AND_MEAN
+# #include <windows.h>
+# #undef WIN32_LEAN_AND_MEAN
+# #include <stdio.h>
+#
+# #ifndef __CYGWIN__
+# #  ifdef __CYGWIN32__
+# #    define __CYGWIN__ __CYGWIN32__
+# #  endif
+# #endif
+#
+# #ifdef __cplusplus
+# extern "C" {
+# #endif
+# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
+# #ifdef __cplusplus
+# }
+# #endif
+#
+# #ifdef __CYGWIN__
+# #include <cygwin/cygwin_dll.h>
+# DECLARE_CYGWIN_DLL( DllMain );
+# #endif
+# HINSTANCE __hDllInstance_base;
+#
+# BOOL APIENTRY
+# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
+# {
+#   __hDllInstance_base = hInst;
+#   return TRUE;
+# }
+# /* ltdll.c ends here */
+        # This is a source program that is used to create import libraries
+        # on Windows for dlls which lack them. Don't remove nor modify the
+        # starting and closing comments
+# /* impgen.c starts here */
+# /*   Copyright (C) 1999-2000 Free Software Foundation, Inc.
+#
+#  This file is part of GNU libtool.
+#
+#  This program is free software; you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation; either version 2 of the License, or
+#  (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#  */
+#
+# #include <stdio.h>           /* for printf() */
+# #include <unistd.h>          /* for open(), lseek(), read() */
+# #include <fcntl.h>           /* for O_RDONLY, O_BINARY */
+# #include <string.h>          /* for strdup() */
+#
+# /* O_BINARY isn't required (or even defined sometimes) under Unix */
+# #ifndef O_BINARY
+# #define O_BINARY 0
+# #endif
+#
+# static unsigned int
+# pe_get16 (fd, offset)
+#      int fd;
+#      int offset;
+# {
+#   unsigned char b[2];
+#   lseek (fd, offset, SEEK_SET);
+#   read (fd, b, 2);
+#   return b[0] + (b[1]<<8);
+# }
+#
+# static unsigned int
+# pe_get32 (fd, offset)
+#     int fd;
+#     int offset;
+# {
+#   unsigned char b[4];
+#   lseek (fd, offset, SEEK_SET);
+#   read (fd, b, 4);
+#   return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
+# }
+#
+# static unsigned int
+# pe_as32 (ptr)
+#      void *ptr;
+# {
+#   unsigned char *b = ptr;
+#   return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
+# }
+#
+# int
+# main (argc, argv)
+#     int argc;
+#     char *argv[];
+# {
+#     int dll;
+#     unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
+#     unsigned long export_rva, export_size, nsections, secptr, expptr;
+#     unsigned long name_rvas, nexp;
+#     unsigned char *expdata, *erva;
+#     char *filename, *dll_name;
+#
+#     filename = argv[1];
+#
+#     dll = open(filename, O_RDONLY|O_BINARY);
+#     if (dll < 1)
+#      return 1;
+#
+#     dll_name = filename;
+#
+#     for (i=0; filename[i]; i++)
+#      if (filename[i] == '/' || filename[i] == '\\'  || filename[i] == ':')
+#          dll_name = filename + i +1;
+#
+#     pe_header_offset = pe_get32 (dll, 0x3c);
+#     opthdr_ofs = pe_header_offset + 4 + 20;
+#     num_entries = pe_get32 (dll, opthdr_ofs + 92);
+#
+#     if (num_entries < 1) /* no exports */
+#      return 1;
+#
+#     export_rva = pe_get32 (dll, opthdr_ofs + 96);
+#     export_size = pe_get32 (dll, opthdr_ofs + 100);
+#     nsections = pe_get16 (dll, pe_header_offset + 4 +2);
+#     secptr = (pe_header_offset + 4 + 20 +
+#            pe_get16 (dll, pe_header_offset + 4 + 16));
+#
+#     expptr = 0;
+#     for (i = 0; i < nsections; i++)
+#     {
+#      char sname[8];
+#      unsigned long secptr1 = secptr + 40 * i;
+#      unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
+#      unsigned long vsize = pe_get32 (dll, secptr1 + 16);
+#      unsigned long fptr = pe_get32 (dll, secptr1 + 20);
+#      lseek(dll, secptr1, SEEK_SET);
+#      read(dll, sname, 8);
+#      if (vaddr <= export_rva && vaddr+vsize > export_rva)
+#      {
+#          expptr = fptr + (export_rva - vaddr);
+#          if (export_rva + export_size > vaddr + vsize)
+#              export_size = vsize - (export_rva - vaddr);
+#          break;
+#      }
+#     }
+#
+#     expdata = (unsigned char*)malloc(export_size);
+#     lseek (dll, expptr, SEEK_SET);
+#     read (dll, expdata, export_size);
+#     erva = expdata - export_rva;
+#
+#     nexp = pe_as32 (expdata+24);
+#     name_rvas = pe_as32 (expdata+32);
+#
+#     printf ("EXPORTS\n");
+#     for (i = 0; i<nexp; i++)
+#     {
+#      unsigned long name_rva = pe_as32 (erva+name_rvas+i*4);
+#      printf ("\t%s @ %ld ;\n", erva+name_rva, 1+ i);
+#     }
+#
+#     return 0;
+# }
+# /* impgen.c ends here */
+
+EOF
+    ;;
+  esac
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "${ofile}T" || (rm -f "${ofile}T"; exit 1)
+
+  mv -f "${ofile}T" "$ofile" || \
+    (rm -f "$ofile" && cp "${ofile}T" "$ofile" && rm -f "${ofile}T")
+  chmod +x "$ofile"
+fi
+
+])# _LT_AC_LTCONFIG_HACK
+
+# AC_LIBTOOL_DLOPEN - enable checks for dlopen support
+AC_DEFUN([AC_LIBTOOL_DLOPEN], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])])
+
+# AC_LIBTOOL_WIN32_DLL - declare package support for building win32 dll's
+AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_BEFORE([$0], [AC_LIBTOOL_SETUP])])
+
+# AC_ENABLE_SHARED - implement the --enable-shared flag
+# Usage: AC_ENABLE_SHARED[(DEFAULT)]
+#   Where DEFAULT is either `yes' or `no'.  If omitted, it defaults to
+#   `yes'.
+AC_DEFUN([AC_ENABLE_SHARED],
+[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE(shared,
+changequote(<<, >>)dnl
+<<  --enable-shared[=PKGS]  build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT],
+changequote([, ])dnl
+[p=${PACKAGE-default}
+case $enableval in
+yes) enable_shared=yes ;;
+no) enable_shared=no ;;
+*)
+  enable_shared=no
+  # Look at the argument we got.  We use all the common list separators.
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+  for pkg in $enableval; do
+    if test "X$pkg" = "X$p"; then
+      enable_shared=yes
+    fi
+  done
+  IFS="$ac_save_ifs"
+  ;;
+esac],
+enable_shared=AC_ENABLE_SHARED_DEFAULT)dnl
+])
+
+# AC_DISABLE_SHARED - set the default shared flag to --disable-shared
+AC_DEFUN([AC_DISABLE_SHARED],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_SHARED(no)])
+
+# AC_ENABLE_STATIC - implement the --enable-static flag
+# Usage: AC_ENABLE_STATIC[(DEFAULT)]
+#   Where DEFAULT is either `yes' or `no'.  If omitted, it defaults to
+#   `yes'.
+AC_DEFUN([AC_ENABLE_STATIC],
+[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE(static,
+changequote(<<, >>)dnl
+<<  --enable-static[=PKGS]  build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT],
+changequote([, ])dnl
+[p=${PACKAGE-default}
+case $enableval in
+yes) enable_static=yes ;;
+no) enable_static=no ;;
+*)
+  enable_static=no
+  # Look at the argument we got.  We use all the common list separators.
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+  for pkg in $enableval; do
+    if test "X$pkg" = "X$p"; then
+      enable_static=yes
+    fi
+  done
+  IFS="$ac_save_ifs"
+  ;;
+esac],
+enable_static=AC_ENABLE_STATIC_DEFAULT)dnl
+])
+
+# AC_DISABLE_STATIC - set the default static flag to --disable-static
+AC_DEFUN([AC_DISABLE_STATIC],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_STATIC(no)])
+
+
+# AC_ENABLE_FAST_INSTALL - implement the --enable-fast-install flag
+# Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)]
+#   Where DEFAULT is either `yes' or `no'.  If omitted, it defaults to
+#   `yes'.
+AC_DEFUN([AC_ENABLE_FAST_INSTALL],
+[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE(fast-install,
+changequote(<<, >>)dnl
+<<  --enable-fast-install[=PKGS]  optimize for fast installation [default=>>AC_ENABLE_FAST_INSTALL_DEFAULT],
+changequote([, ])dnl
+[p=${PACKAGE-default}
+case $enableval in
+yes) enable_fast_install=yes ;;
+no) enable_fast_install=no ;;
+*)
+  enable_fast_install=no
+  # Look at the argument we got.  We use all the common list separators.
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+  for pkg in $enableval; do
+    if test "X$pkg" = "X$p"; then
+      enable_fast_install=yes
+    fi
+  done
+  IFS="$ac_save_ifs"
+  ;;
+esac],
+enable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl
+])
+
+# AC_DISABLE_FAST_INSTALL - set the default to --disable-fast-install
+AC_DEFUN([AC_DISABLE_FAST_INSTALL],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_FAST_INSTALL(no)])
+
+# AC_LIBTOOL_PICMODE - implement the --with-pic flag
+# Usage: AC_LIBTOOL_PICMODE[(MODE)]
+#   Where MODE is either `yes' or `no'.  If omitted, it defaults to
+#   `both'.
+AC_DEFUN([AC_LIBTOOL_PICMODE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+pic_mode=ifelse($#,1,$1,default)])
+
+
+# AC_PATH_TOOL_PREFIX - find a file program which can recognise shared library
+AC_DEFUN([AC_PATH_TOOL_PREFIX],
+[AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+  /*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+  ?:/*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path.
+  ;;
+  *)
+  ac_save_MAGIC_CMD="$MAGIC_CMD"
+  IFS="${IFS=   }"; ac_save_ifs="$IFS"; IFS=":"
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word.  This closes a longstanding sh security hole.
+  ac_dummy="ifelse([$2], , $PATH, [$2])"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$1; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+      if test -n "$file_magic_test_file"; then
+       case $deplibs_check_method in
+       "file_magic "*)
+         file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`"
+         MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+         if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+           egrep "$file_magic_regex" > /dev/null; then
+           :
+         else
+           cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+EOF
+         fi ;;
+       esac
+      fi
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  MAGIC_CMD="$ac_save_MAGIC_CMD"
+  ;;
+esac])
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  AC_MSG_RESULT($MAGIC_CMD)
+else
+  AC_MSG_RESULT(no)
+fi
+])
+
+
+# AC_PATH_MAGIC - find a file program which can recognise a shared library
+AC_DEFUN([AC_PATH_MAGIC],
+[AC_REQUIRE([AC_CHECK_TOOL_PREFIX])dnl
+AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin:$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    AC_PATH_TOOL_PREFIX(file, /usr/bin:$PATH)
+  else
+    MAGIC_CMD=:
+  fi
+fi
+])
+
+
+# AC_PROG_LD - find the path to the GNU or non-GNU linker
+AC_DEFUN([AC_PROG_LD],
+[AC_ARG_WITH(gnu-ld,
+[  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]],
+test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by GCC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]* | [A-Za-z]:[\\/]*)]
+      [re_direlt='/[^/][^/]*/\.\./']
+      # Canonicalize the path of ld
+      ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+       ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some GNU ld's only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      if "$lt_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+       test "$with_gnu_ld" != no && break
+      else
+       test "$with_gnu_ld" != yes && break
+      fi
+    fi
+  done
+  IFS="$ac_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_PROG_LD_GNU
+])
+
+# AC_PROG_LD_GNU -
+AC_DEFUN([AC_PROG_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
+  lt_cv_prog_gnu_ld=yes
+else
+  lt_cv_prog_gnu_ld=no
+fi])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])
+
+# AC_PROG_LD_RELOAD_FLAG - find reload flag for linker
+#   -- PORTME Some linkers may need a different reload flag.
+AC_DEFUN([AC_PROG_LD_RELOAD_FLAG],
+[AC_CACHE_CHECK([for $LD option to reload object files], lt_cv_ld_reload_flag,
+[lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+test -n "$reload_flag" && reload_flag=" $reload_flag"
+])
+
+# AC_DEPLIBS_CHECK_METHOD - how to check for library dependencies
+#  -- PORTME fill in with the dynamic library characteristics
+AC_DEFUN([AC_DEPLIBS_CHECK_METHOD],
+[AC_CACHE_CHECK([how to recognise dependant libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# ['file_magic [regex]'] -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given egrep regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix4* | aix5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi4*)
+  [lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)']
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin* | mingw* | pw32*)
+  lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method='file_magic Mach-O dynamically linked shared library'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  case "$host_os" in
+  rhapsody* | darwin1.[012])
+    lt_cv_file_magic_test_file=`echo /System/Library/Frameworks/System.framework/Versions/*/System | head -1`
+    ;;
+  *) # Darwin 1.3 on
+    lt_cv_file_magic_test_file='/usr/lib/libSystem.dylib'
+    ;;
+  esac
+  ;;
+
+freebsd*)
+  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      [lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[3-9]86 (compact )?demand paged shared library']
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20*|hpux11*)
+  [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library']
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libc.sl
+  ;;
+
+irix5* | irix6*)
+  case $host_os in
+  irix5*)
+    # this will be overridden with pass_all, but let us keep it just in case
+    lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1"
+    ;;
+  *)
+    case $LD in
+    *-32|*"-32 ") libmagic=32-bit;;
+    *-n32|*"-n32 ") libmagic=N32;;
+    *-64|*"-64 ") libmagic=64-bit;;
+    *) libmagic=never-match;;
+    esac
+    # this will be overridden with pass_all, but let us keep it just in case
+    [lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[1234] dynamic lib MIPS - version 1"]
+    ;;
+  esac
+  lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*`
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be Linux ELF.
+linux-gnu*)
+  case $host_cpu in
+  alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | s390* )
+    lt_cv_deplibs_check_method=pass_all ;;
+  *)
+    # glibc up to 2.1.1 does not perform some relocations on ARM
+    [lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;;]
+  esac
+  lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
+  ;;
+
+netbsd*)
+  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+    [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$']
+  else
+    [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so$']
+  fi
+  ;;
+
+newos6*)
+  [lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)']
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+osf3* | osf4* | osf5*)
+  # this will be overridden with pass_all, but let us keep it just in case
+  lt_cv_deplibs_check_method='file_magic COFF format alpha shared library'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sco3.2v5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  lt_cv_file_magic_test_file=/lib/libc.so
+  ;;
+
+[sysv5uw[78]* | sysv4*uw2*)]
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+  case $host_vendor in
+  motorola)
+    [lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]']
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    [lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )']
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    [lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"]
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  esac
+  ;;
+esac
+])
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+])
+
+
+# AC_PROG_NM - find the path to a BSD-compatible name lister
+AC_DEFUN([AC_PROG_NM],
+[AC_MSG_CHECKING([for BSD-compatible nm])
+AC_CACHE_VAL(lt_cv_path_NM,
+[if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+  for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do
+    test -z "$ac_dir" && ac_dir=.
+    tmp_nm=$ac_dir/${ac_tool_prefix}nm
+    if test -f $tmp_nm || test -f $tmp_nm$ac_exeext ; then
+      # Check to see if the nm accepts a BSD-compat flag.
+      # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+      #   nm: unknown option "B" ignored
+      # Tru64's nm complains that /dev/null is an invalid object file
+      if ($tmp_nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep '(/dev/null|Invalid file or object type)' >/dev/null; then
+       lt_cv_path_NM="$tmp_nm -B"
+       break
+      elif ($tmp_nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+       lt_cv_path_NM="$tmp_nm -p"
+       break
+      else
+       lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+       continue # so that we can try to find one that supports BSD flags
+      fi
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
+fi])
+NM="$lt_cv_path_NM"
+AC_MSG_RESULT([$NM])
+])
+
+# AC_CHECK_LIBM - check for math library
+AC_DEFUN([AC_CHECK_LIBM],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cygwin* | *-*-pw32*)
+  # These system don't have libm
+  ;;
+*-ncr-sysv4.3*)
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+  AC_CHECK_LIB(m, main, LIBM="$LIBM -lm")
+  ;;
+*)
+  AC_CHECK_LIB(m, main, LIBM="-lm")
+  ;;
+esac
+])
+
+# AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for
+# the libltdl convenience library and INCLTDL to the include flags for
+# the libltdl header and adds --enable-ltdl-convenience to the
+# configure arguments.  Note that LIBLTDL and INCLTDL are not
+# AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called.  If DIR is not
+# provided, it is assumed to be `libltdl'.  LIBLTDL will be prefixed
+# with '${top_builddir}/' and INCLTDL will be prefixed with
+# '${top_srcdir}/' (note the single quotes!).  If your package is not
+# flat and you're not using automake, define top_builddir and
+# top_srcdir appropriately in the Makefiles.
+AC_DEFUN([AC_LIBLTDL_CONVENIENCE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+  case $enable_ltdl_convenience in
+  no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
+  "") enable_ltdl_convenience=yes
+      ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
+  esac
+  LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la
+  INCLTDL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+])
+
+# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for
+# the libltdl installable library and INCLTDL to the include flags for
+# the libltdl header and adds --enable-ltdl-install to the configure
+# arguments.  Note that LIBLTDL and INCLTDL are not AC_SUBSTed, nor is
+# AC_CONFIG_SUBDIRS called.  If DIR is not provided and an installed
+# libltdl is not found, it is assumed to be `libltdl'.  LIBLTDL will
+# be prefixed with '${top_builddir}/' and INCLTDL will be prefixed
+# with '${top_srcdir}/' (note the single quotes!).  If your package is
+# not flat and you're not using automake, define top_builddir and
+# top_srcdir appropriately in the Makefiles.
+# In the future, this macro may have to be called after AC_PROG_LIBTOOL.
+AC_DEFUN([AC_LIBLTDL_INSTALLABLE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+  AC_CHECK_LIB(ltdl, main,
+  [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no],
+  [if test x"$enable_ltdl_install" = xno; then
+     AC_MSG_WARN([libltdl not installed, but installation disabled])
+   else
+     enable_ltdl_install=yes
+   fi
+  ])
+  if test x"$enable_ltdl_install" = x"yes"; then
+    ac_configure_args="$ac_configure_args --enable-ltdl-install"
+    LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la
+    INCLTDL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+  else
+    ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
+    LIBLTDL="-lltdl"
+    INCLTDL=
+  fi
+])
+
+# old names
+AC_DEFUN([AM_PROG_LIBTOOL],   [AC_PROG_LIBTOOL])
+AC_DEFUN([AM_ENABLE_SHARED],  [AC_ENABLE_SHARED($@)])
+AC_DEFUN([AM_ENABLE_STATIC],  [AC_ENABLE_STATIC($@)])
+AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+AC_DEFUN([AM_PROG_LD],        [AC_PROG_LD])
+AC_DEFUN([AM_PROG_NM],        [AC_PROG_NM])
+
+# This is just to silence aclocal about the macro not being used
+ifelse([AC_DISABLE_FAST_INSTALL])
+
+dnl Configure-time switch with default
+dnl
+dnl Each switch defines an --enable-FOO and --disable-FOO option in
+dnl the resulting configure script.
+dnl
+dnl Usage:
+dnl smr_SWITCH(name, description, default, pos-def, neg-def)
+dnl
+dnl where:
+dnl
+dnl name        name of switch; generates --enable-name & --disable-name
+dnl             options
+dnl description help string is set to this prefixed by "enable" or
+dnl             "disable", whichever is the non-default value
+dnl default     either "on" or "off"; specifies default if neither
+dnl             --enable-name nor --disable-name is specified
+dnl pos-def     a symbol to AC_DEFINE if switch is on (optional)
+dnl neg-def     a symbol to AC_DEFINE if switch is off (optional)
+dnl
+AC_DEFUN(smr_SWITCH, [
+    AC_MSG_CHECKING(whether to enable $2)
+    AC_ARG_ENABLE(
+        $1,
+        ifelse($3, on,
+            [  --disable-[$1]    disable [$2]],
+            [  --enable-[$1]     enable [$2]]),
+        [ if test "$enableval" = yes; then
+            AC_MSG_RESULT(yes)
+            ifelse($4, , , AC_DEFINE($4))
+        else
+            AC_MSG_RESULT(no)
+            ifelse($5, , , AC_DEFINE($5))
+        fi ],
+        ifelse($3, on,
+           [ AC_MSG_RESULT(yes)
+             ifelse($4, , , AC_DEFINE($4)) ],
+           [ AC_MSG_RESULT(no)
+            ifelse($5, , , AC_DEFINE($5))]))])
+
+dnl
+dnl Examine size_t and define SIZE_T_IS_UINT, if size_t is an unsigned int
+dnl
+AC_DEFUN(OJ_SIZE_T_IS_UINT,[
+       AC_REQUIRE([AC_TYPE_SIZE_T])
+       AC_MSG_CHECKING(whether size_t is unsigned int)
+       ac_cv_size_t_is_uint=no
+       AC_LANG_SAVE
+       AC_LANG_CPLUSPLUS
+       AC_TRY_COMPILE([#include <unistd.h>
+
+                       template<class T> class foo { };
+
+                        ], [
+                       foo<size_t> x;
+                       foo<unsigned int> y;
+                       x = y;
+               ],ac_cv_size_t_is_uint=yes)
+       AC_LANG_RESTORE
+       AC_MSG_RESULT($ac_cv_size_t_is_uint)
+       test "$ac_cv_size_t_is_uint" = "yes" && AC_DEFINE(SIZE_T_IS_UINT)
+])
+
+# Do all the work for Automake.  This macro actually does too much --
+# some checks are only needed if your package does certain things.
+# But this isn't really a big deal.
+
+# serial 1
+
+dnl Usage:
+dnl AM_INIT_AUTOMAKE(package,version, [no-define])
+
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_REQUIRE([AC_PROG_INSTALL])
+PACKAGE=[$1]
+AC_SUBST(PACKAGE)
+VERSION=[$2]
+AC_SUBST(VERSION)
+dnl test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+  AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+ifelse([$3],,
+AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package]))
+AC_REQUIRE([AM_SANITY_CHECK])
+AC_REQUIRE([AC_ARG_PROGRAM])
+dnl FIXME This is truly gross.
+missing_dir=`cd $ac_aux_dir && pwd`
+AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
+AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
+AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir)
+AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir)
+AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir)
+AC_REQUIRE([AC_PROG_MAKE_SET])])
+
+#
+# Check to make sure that the build environment is sane.
+#
+
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftestfile
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
+   if test "[$]*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftestfile`
+   fi
+   if test "[$]*" != "X $srcdir/configure conftestfile" \
+      && test "[$]*" != "X conftestfile $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "[$]2" = conftestfile
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+rm -f conftest*
+AC_MSG_RESULT(yes)])
+
+dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY)
+dnl The program must properly implement --version.
+AC_DEFUN([AM_MISSING_PROG],
+[AC_MSG_CHECKING(for working $2)
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if ($2 --version) < /dev/null > /dev/null 2>&1; then
+   $1=$2
+   AC_MSG_RESULT(found)
+else
+   $1="$3/missing $2"
+   AC_MSG_RESULT(missing)
+fi
+AC_SUBST($1)])
+
diff --git a/config/config.guess b/config/config.guess
new file mode 100755 (executable)
index 0000000..aa6ea3f
--- /dev/null
@@ -0,0 +1,1319 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002 Free Software Foundation, Inc.
+
+timestamp='2002-01-10'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit 0 ;;
+    --version | -v )
+       echo "$version" ; exit 0 ;;
+    --help | --h* | -h )
+       echo "$usage"; exit 0 ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )        # Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+
+dummy=dummy-$$
+trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script.
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int dummy(){}" > $dummy.c ;
+       for c in cc gcc c89 ; do
+         ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ;
+         if test $? = 0 ; then
+            CC_FOR_BUILD="$c"; break ;
+         fi ;
+       done ;
+       rm -f $dummy.c $dummy.o $dummy.rel ;
+       if test x"$CC_FOR_BUILD" = x ; then
+         CC_FOR_BUILD=no_compiler_found ;
+       fi
+       ;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+       PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+       # NetBSD (nbsd) targets should (where applicable) match one or
+       # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+       # *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+       # switched to ELF, *-*-netbsd* would select the old
+       # object file format.  This provides both forward
+       # compatibility and a consistent mechanism for selecting the
+       # object file format.
+       #
+       # Note: NetBSD doesn't particularly care about the vendor
+       # portion of the name.  We always set it to "unknown".
+       UNAME_MACHINE_ARCH=`(uname -p) 2>/dev/null` || \
+           UNAME_MACHINE_ARCH=unknown
+       case "${UNAME_MACHINE_ARCH}" in
+           arm*) machine=arm-unknown ;;
+           sh3el) machine=shl-unknown ;;
+           sh3eb) machine=sh-unknown ;;
+           *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+       esac
+       # The Operating System including object format, if it has switched
+       # to ELF recently, or will in the future.
+       case "${UNAME_MACHINE_ARCH}" in
+           arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+               eval $set_cc_for_build
+               if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+                       | grep __ELF__ >/dev/null
+               then
+                   # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+                   # Return netbsd for either.  FIX?
+                   os=netbsd
+               else
+                   os=netbsdelf
+               fi
+               ;;
+           *)
+               os=netbsd
+               ;;
+       esac
+       # The OS release
+       release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+       # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+       # contains redundant information, the shorter form:
+       # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+       echo "${machine}-${os}${release}"
+       exit 0 ;;
+    amiga:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    arc:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    hp300:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mac68k:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    macppc:OpenBSD:*:*)
+       echo powerpc-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mvme68k:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mvme88k:OpenBSD:*:*)
+       echo m88k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mvmeppc:OpenBSD:*:*)
+       echo powerpc-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    pmax:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sgi:OpenBSD:*:*)
+       echo mipseb-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sun3:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    wgrisc:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    *:OpenBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    alpha:OSF1:*:*)
+       if test $UNAME_RELEASE = "V4.0"; then
+               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+       fi
+       # A Vn.n version is a released version.
+       # A Tn.n version is a released field test version.
+       # A Xn.n version is an unreleased experimental baselevel.
+       # 1.2 uses "1.2" for uname -r.
+       cat <<EOF >$dummy.s
+       .data
+\$Lformat:
+       .byte 37,100,45,37,120,10,0     # "%d-%x\n"
+
+       .text
+       .globl main
+       .align 4
+       .ent main
+main:
+       .frame \$30,16,\$26,0
+       ldgp \$29,0(\$27)
+       .prologue 1
+       .long 0x47e03d80 # implver \$0
+       lda \$2,-1
+       .long 0x47e20c21 # amask \$2,\$1
+       lda \$16,\$Lformat
+       mov \$0,\$17
+       not \$1,\$18
+       jsr \$26,printf
+       ldgp \$29,0(\$26)
+       mov 0,\$16
+       jsr \$26,exit
+       .end main
+EOF
+       eval $set_cc_for_build
+       $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
+       if test "$?" = 0 ; then
+               case `./$dummy` in
+                       0-0)
+                               UNAME_MACHINE="alpha"
+                               ;;
+                       1-0)
+                               UNAME_MACHINE="alphaev5"
+                               ;;
+                       1-1)
+                               UNAME_MACHINE="alphaev56"
+                               ;;
+                       1-101)
+                               UNAME_MACHINE="alphapca56"
+                               ;;
+                       2-303)
+                               UNAME_MACHINE="alphaev6"
+                               ;;
+                       2-307)
+                               UNAME_MACHINE="alphaev67"
+                               ;;
+                       2-1307)
+                               UNAME_MACHINE="alphaev68"
+                               ;;
+               esac
+       fi
+       rm -f $dummy.s $dummy
+       echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+       exit 0 ;;
+    Alpha\ *:Windows_NT*:*)
+       # How do we know it's Interix rather than the generic POSIX subsystem?
+       # Should we change UNAME_MACHINE based on the output of uname instead
+       # of the specific Alpha model?
+       echo alpha-pc-interix
+       exit 0 ;;
+    21064:Windows_NT:50:3)
+       echo alpha-dec-winnt3.5
+       exit 0 ;;
+    Amiga*:UNIX_System_V:4.0:*)
+       echo m68k-unknown-sysv4
+       exit 0;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+       echo ${UNAME_MACHINE}-unknown-amigaos
+       exit 0 ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+       echo ${UNAME_MACHINE}-unknown-morphos
+       exit 0 ;;
+    *:OS/390:*:*)
+       echo i370-ibm-openedition
+       exit 0 ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+       echo arm-acorn-riscix${UNAME_RELEASE}
+       exit 0;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+       echo hppa1.1-hitachi-hiuxmpp
+       exit 0;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+       # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+       if test "`(/bin/universe) 2>/dev/null`" = att ; then
+               echo pyramid-pyramid-sysv3
+       else
+               echo pyramid-pyramid-bsd
+       fi
+       exit 0 ;;
+    NILE*:*:*:dcosx)
+       echo pyramid-pyramid-svr4
+       exit 0 ;;
+    sun4H:SunOS:5.*:*)
+       echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+       echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    i86pc:SunOS:5.*:*)
+       echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:6*:*)
+       # According to config.sub, this is the proper way to canonicalize
+       # SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+       # it's likely to be more like Solaris than SunOS4.
+       echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:*:*)
+       case "`/usr/bin/arch -k`" in
+           Series*|S4*)
+               UNAME_RELEASE=`uname -v`
+               ;;
+       esac
+       # Japanese Language versions have a version number like `4.1.3-JL'.
+       echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+       exit 0 ;;
+    sun3*:SunOS:*:*)
+       echo m68k-sun-sunos${UNAME_RELEASE}
+       exit 0 ;;
+    sun*:*:4.2BSD:*)
+       UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+       test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+       case "`/bin/arch`" in
+           sun3)
+               echo m68k-sun-sunos${UNAME_RELEASE}
+               ;;
+           sun4)
+               echo sparc-sun-sunos${UNAME_RELEASE}
+               ;;
+       esac
+       exit 0 ;;
+    aushp:SunOS:*:*)
+       echo sparc-auspex-sunos${UNAME_RELEASE}
+       exit 0 ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+       exit 0 ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+       echo m68k-atari-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+       exit 0 ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit 0 ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit 0 ;;
+    powerpc:machten:*:*)
+       echo powerpc-apple-machten${UNAME_RELEASE}
+       exit 0 ;;
+    RISC*:Mach:*:*)
+       echo mips-dec-mach_bsd4.3
+       exit 0 ;;
+    RISC*:ULTRIX:*:*)
+       echo mips-dec-ultrix${UNAME_RELEASE}
+       exit 0 ;;
+    VAX*:ULTRIX*:*:*)
+       echo vax-dec-ultrix${UNAME_RELEASE}
+       exit 0 ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+       echo clipper-intergraph-clix${UNAME_RELEASE}
+       exit 0 ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+       int main (int argc, char *argv[]) {
+#else
+       int main (argc, argv) int argc; char *argv[]; {
+#endif
+       #if defined (host_mips) && defined (MIPSEB)
+       #if defined (SYSTYPE_SYSV)
+         printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_SVR4)
+         printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+         printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+       #endif
+       #endif
+         exit (-1);
+       }
+EOF
+       $CC_FOR_BUILD $dummy.c -o $dummy \
+         && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+         && rm -f $dummy.c $dummy && exit 0
+       rm -f $dummy.c $dummy
+       echo mips-mips-riscos${UNAME_RELEASE}
+       exit 0 ;;
+    Motorola:PowerMAX_OS:*:*)
+       echo powerpc-motorola-powermax
+       exit 0 ;;
+    Night_Hawk:Power_UNIX:*:*)
+       echo powerpc-harris-powerunix
+       exit 0 ;;
+    m88k:CX/UX:7*:*)
+       echo m88k-harris-cxux7
+       exit 0 ;;
+    m88k:*:4*:R4*)
+       echo m88k-motorola-sysv4
+       exit 0 ;;
+    m88k:*:3*:R3*)
+       echo m88k-motorola-sysv3
+       exit 0 ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+       if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+       then
+           if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+              [ ${TARGET_BINARY_INTERFACE}x = x ]
+           then
+               echo m88k-dg-dgux${UNAME_RELEASE}
+           else
+               echo m88k-dg-dguxbcs${UNAME_RELEASE}
+           fi
+       else
+           echo i586-dg-dgux${UNAME_RELEASE}
+       fi
+       exit 0 ;;
+    M88*:DolphinOS:*:*)        # DolphinOS (SVR3)
+       echo m88k-dolphin-sysv3
+       exit 0 ;;
+    M88*:*:R3*:*)
+       # Delta 88k system running SVR3
+       echo m88k-motorola-sysv3
+       exit 0 ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+       echo m88k-tektronix-sysv3
+       exit 0 ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+       echo m68k-tektronix-bsd
+       exit 0 ;;
+    *:IRIX*:*:*)
+       echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+       exit 0 ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+       echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
+       exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+       echo i386-ibm-aix
+       exit 0 ;;
+    ia64:AIX:*:*)
+       if [ -x /usr/bin/oslevel ] ; then
+               IBM_REV=`/usr/bin/oslevel`
+       else
+               IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+       fi
+       echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+       exit 0 ;;
+    *:AIX:2:3)
+       if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+               eval $set_cc_for_build
+               sed 's/^                //' << EOF >$dummy.c
+               #include <sys/systemcfg.h>
+
+               main()
+                       {
+                       if (!__power_pc())
+                               exit(1);
+                       puts("powerpc-ibm-aix3.2.5");
+                       exit(0);
+                       }
+EOF
+               $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
+               rm -f $dummy.c $dummy
+               echo rs6000-ibm-aix3.2.5
+       elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+               echo rs6000-ibm-aix3.2.4
+       else
+               echo rs6000-ibm-aix3.2
+       fi
+       exit 0 ;;
+    *:AIX:*:[45])
+       IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
+       if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+               IBM_ARCH=rs6000
+       else
+               IBM_ARCH=powerpc
+       fi
+       if [ -x /usr/bin/oslevel ] ; then
+               IBM_REV=`/usr/bin/oslevel`
+       else
+               IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+       fi
+       echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+       exit 0 ;;
+    *:AIX:*:*)
+       echo rs6000-ibm-aix
+       exit 0 ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+       echo romp-ibm-bsd4.4
+       exit 0 ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+       echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+       exit 0 ;;                           # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+       echo rs6000-bull-bosx
+       exit 0 ;;
+    DPX/2?00:B.O.S.:*:*)
+       echo m68k-bull-sysv3
+       exit 0 ;;
+    9000/[34]??:4.3bsd:1.*:*)
+       echo m68k-hp-bsd
+       exit 0 ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+       echo m68k-hp-bsd4.4
+       exit 0 ;;
+    9000/[34678]??:HP-UX:*:*)
+       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+       case "${UNAME_MACHINE}" in
+           9000/31? )            HP_ARCH=m68000 ;;
+           9000/[34]?? )         HP_ARCH=m68k ;;
+           9000/[678][0-9][0-9])
+               if [ -x /usr/bin/getconf ]; then
+                   sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+                         '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+                        esac ;;
+                    esac
+               fi
+               if [ "${HP_ARCH}" = "" ]; then
+                   eval $set_cc_for_build
+                   sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+               {
+               case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+               case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+               case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+                   switch (bits)
+                       {
+                       case 64: puts ("hppa2.0w"); break;
+                       case 32: puts ("hppa2.0n"); break;
+                       default: puts ("hppa2.0"); break;
+                       } break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+                   puts ("hppa2.0"); break;
+              #endif
+               default: puts ("hppa1.0"); break;
+               }
+                  exit (0);
+              }
+EOF
+                   (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null) && HP_ARCH=`./$dummy`
+                   if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi
+                   rm -f $dummy.c $dummy
+               fi ;;
+       esac
+       echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+       exit 0 ;;
+    ia64:HP-UX:*:*)
+       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+       echo ia64-hp-hpux${HPUX_REV}
+       exit 0 ;;
+    3050*:HI-UX:*:*)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #include <unistd.h>
+       int
+       main ()
+       {
+         long cpu = sysconf (_SC_CPU_VERSION);
+         /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+            true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+            results, however.  */
+         if (CPU_IS_PA_RISC (cpu))
+           {
+             switch (cpu)
+               {
+                 case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+                 default: puts ("hppa-hitachi-hiuxwe2"); break;
+               }
+           }
+         else if (CPU_IS_HP_MC68K (cpu))
+           puts ("m68k-hitachi-hiuxwe2");
+         else puts ("unknown-hitachi-hiuxwe2");
+         exit (0);
+       }
+EOF
+       $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
+       rm -f $dummy.c $dummy
+       echo unknown-hitachi-hiuxwe2
+       exit 0 ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+       echo hppa1.1-hp-bsd
+       exit 0 ;;
+    9000/8??:4.3bsd:*:*)
+       echo hppa1.0-hp-bsd
+       exit 0 ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+       echo hppa1.0-hp-mpeix
+       exit 0 ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+       echo hppa1.1-hp-osf
+       exit 0 ;;
+    hp8??:OSF1:*:*)
+       echo hppa1.0-hp-osf
+       exit 0 ;;
+    i*86:OSF1:*:*)
+       if [ -x /usr/sbin/sysversion ] ; then
+           echo ${UNAME_MACHINE}-unknown-osf1mk
+       else
+           echo ${UNAME_MACHINE}-unknown-osf1
+       fi
+       exit 0 ;;
+    parisc*:Lites*:*:*)
+       echo hppa1.1-hp-lites
+       exit 0 ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+       echo c1-convex-bsd
+        exit 0 ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+        exit 0 ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+       echo c34-convex-bsd
+        exit 0 ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+       echo c38-convex-bsd
+        exit 0 ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+       echo c4-convex-bsd
+        exit 0 ;;
+    CRAY*X-MP:*:*:*)
+       echo xmp-cray-unicos
+        exit 0 ;;
+    CRAY*Y-MP:*:*:*)
+       echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    CRAY*[A-Z]90:*:*:*)
+       echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+       | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+             -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+             -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    CRAY*TS:*:*:*)
+       echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    CRAY*T3D:*:*:*)
+       echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    CRAY*T3E:*:*:*)
+       echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    CRAY*SV1:*:*:*)
+       echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    CRAY-2:*:*:*)
+       echo cray2-cray-unicos
+        exit 0 ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+       FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit 0 ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+       echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+       exit 0 ;;
+    sparc*:BSD/OS:*:*)
+       echo sparc-unknown-bsdi${UNAME_RELEASE}
+       exit 0 ;;
+    *:BSD/OS:*:*)
+       echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+       exit 0 ;;
+    *:FreeBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+       exit 0 ;;
+    i*:CYGWIN*:*)
+       echo ${UNAME_MACHINE}-pc-cygwin
+       exit 0 ;;
+    i*:MINGW*:*)
+       echo ${UNAME_MACHINE}-pc-mingw32
+       exit 0 ;;
+    i*:PW*:*)
+       echo ${UNAME_MACHINE}-pc-pw32
+       exit 0 ;;
+    x86:Interix*:3*)
+       echo i386-pc-interix3
+       exit 0 ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+       # How do we know it's Interix rather than the generic POSIX subsystem?
+       # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+       # UNAME_MACHINE based on the output of uname instead of i386?
+       echo i386-pc-interix
+       exit 0 ;;
+    i*:UWIN*:*)
+       echo ${UNAME_MACHINE}-pc-uwin
+       exit 0 ;;
+    p*:CYGWIN*:*)
+       echo powerpcle-unknown-cygwin
+       exit 0 ;;
+    prep*:SunOS:5.*:*)
+       echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    *:GNU:*:*)
+       echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+       exit 0 ;;
+    i*86:Minix:*:*)
+       echo ${UNAME_MACHINE}-pc-minix
+       exit 0 ;;
+    arm*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit 0 ;;
+    ia64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux
+       exit 0 ;;
+    m68*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit 0 ;;
+    mips:Linux:*:*)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #undef CPU
+       #undef mips
+       #undef mipsel
+       #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) 
+       CPU=mipsel 
+       #else
+       #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) 
+       CPU=mips
+       #else
+       CPU=
+       #endif
+       #endif 
+EOF
+       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+       rm -f $dummy.c
+       test x"${CPU}" != x && echo "${CPU}-pc-linux-gnu" && exit 0
+       ;;
+    ppc:Linux:*:*)
+       echo powerpc-unknown-linux-gnu
+       exit 0 ;;
+    ppc64:Linux:*:*)
+       echo powerpc64-unknown-linux-gnu
+       exit 0 ;;
+    alpha:Linux:*:*)
+       case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+         EV5)   UNAME_MACHINE=alphaev5 ;;
+         EV56)  UNAME_MACHINE=alphaev56 ;;
+         PCA56) UNAME_MACHINE=alphapca56 ;;
+         PCA57) UNAME_MACHINE=alphapca56 ;;
+         EV6)   UNAME_MACHINE=alphaev6 ;;
+         EV67)  UNAME_MACHINE=alphaev67 ;;
+         EV68*) UNAME_MACHINE=alphaev68 ;;
+        esac
+       objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+       if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+       echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+       exit 0 ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+       # Look for CPU level
+       case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+         PA7*) echo hppa1.1-unknown-linux-gnu ;;
+         PA8*) echo hppa2.0-unknown-linux-gnu ;;
+         *)    echo hppa-unknown-linux-gnu ;;
+       esac
+       exit 0 ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+       echo hppa64-unknown-linux-gnu
+       exit 0 ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+       echo ${UNAME_MACHINE}-ibm-linux
+       exit 0 ;;
+    sh*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit 0 ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit 0 ;;
+    x86_64:Linux:*:*)
+       echo x86_64-unknown-linux-gnu
+       exit 0 ;;
+    i*86:Linux:*:*)
+       # The BFD linker knows what the default object file format is, so
+       # first see if it will tell us. cd to the root directory to prevent
+       # problems with other programs or directories called `ld' in the path.
+       ld_supported_targets=`cd /; ld --help 2>&1 \
+                        | sed -ne '/supported targets:/!d
+                                   s/[         ][      ]*/ /g
+                                   s/.*supported targets: *//
+                                   s/ .*//
+                                   p'`
+        case "$ld_supported_targets" in
+         elf32-i386)
+               TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+               ;;
+         a.out-i386-linux)
+               echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+               exit 0 ;;               
+         coff-i386)
+               echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+               exit 0 ;;
+         "")
+               # Either a pre-BFD a.out linker (linux-gnuoldld) or
+               # one that does not give us useful --help.
+               echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+               exit 0 ;;
+       esac
+       # Determine whether the default compiler is a.out or elf
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #include <features.h>
+       #ifdef __ELF__
+       # ifdef __GLIBC__
+       #  if __GLIBC__ >= 2
+       LIBC=gnu
+       #  else
+       LIBC=gnulibc1
+       #  endif
+       # else
+       LIBC=gnulibc1
+       # endif
+       #else
+       LIBC=gnuaout
+       #endif
+EOF
+       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
+       rm -f $dummy.c
+       test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0
+       test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
+       ;;
+    i*86:DYNIX/ptx:4*:*)
+       # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+       # earlier versions are messed up and put the nodename in both
+       # sysname and nodename.
+       echo i386-sequent-sysv4
+       exit 0 ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+       # I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+       echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+       exit 0 ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+       UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+       if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+               echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+       else
+               echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+       fi
+       exit 0 ;;
+    i*86:*:5:[78]*)
+       case `/bin/uname -X | grep "^Machine"` in
+           *486*)           UNAME_MACHINE=i486 ;;
+           *Pentium)        UNAME_MACHINE=i586 ;;
+           *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+       esac
+       echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+       exit 0 ;;
+    i*86:*:3.2:*)
+       if test -f /usr/options/cb.name; then
+               UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+               echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+       elif /bin/uname -X 2>/dev/null >/dev/null ; then
+               UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+               (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+               (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+                       && UNAME_MACHINE=i586
+               (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \
+                       && UNAME_MACHINE=i686
+               (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \
+                       && UNAME_MACHINE=i686
+               echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+       else
+               echo ${UNAME_MACHINE}-pc-sysv32
+       fi
+       exit 0 ;;
+    i*86:*DOS:*:*)
+       echo ${UNAME_MACHINE}-pc-msdosdjgpp
+       exit 0 ;;
+    pc:*:*:*)
+       # Left here for compatibility:
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i386.
+       echo i386-pc-msdosdjgpp
+        exit 0 ;;
+    Intel:Mach:3*:*)
+       echo i386-pc-mach3
+       exit 0 ;;
+    paragon:*:*:*)
+       echo i860-intel-osf1
+       exit 0 ;;
+    i860:*:4.*:*) # i860-SVR4
+       if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+         echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+       else # Add other i860-SVR4 vendors below as they are discovered.
+         echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+       fi
+       exit 0 ;;
+    mini*:CTIX:SYS*5:*)
+       # "miniframe"
+       echo m68010-convergent-sysv
+       exit 0 ;;
+    M68*:*:R3V[567]*:*)
+       test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+    3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0)
+       OS_REL=''
+       test -r /etc/.relid \
+       && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+         && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+         && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && echo i486-ncr-sysv4 && exit 0 ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+       echo m68k-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    mc68030:UNIX_System_V:4.*:*)
+       echo m68k-atari-sysv4
+       exit 0 ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+       echo i386-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    TSUNAMI:LynxOS:2.*:*)
+       echo sparc-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    rs6000:LynxOS:2.*:*)
+       echo rs6000-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+       echo powerpc-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    SM[BE]S:UNIX_SV:*:*)
+       echo mips-dde-sysv${UNAME_RELEASE}
+       exit 0 ;;
+    RM*:ReliantUNIX-*:*:*)
+       echo mips-sni-sysv4
+       exit 0 ;;
+    RM*:SINIX-*:*:*)
+       echo mips-sni-sysv4
+       exit 0 ;;
+    *:SINIX-*:*:*)
+       if uname -p 2>/dev/null >/dev/null ; then
+               UNAME_MACHINE=`(uname -p) 2>/dev/null`
+               echo ${UNAME_MACHINE}-sni-sysv4
+       else
+               echo ns32k-sni-sysv
+       fi
+       exit 0 ;;
+    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                      # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit 0 ;;
+    *:UNIX_System_V:4*:FTX*)
+       # From Gerald Hewes <hewes@openmarket.com>.
+       # How about differentiating between stratus architectures? -djm
+       echo hppa1.1-stratus-sysv4
+       exit 0 ;;
+    *:*:*:FTX*)
+       # From seanf@swdc.stratus.com.
+       echo i860-stratus-sysv4
+       exit 0 ;;
+    *:VOS:*:*)
+       # From Paul.Green@stratus.com.
+       echo hppa1.1-stratus-vos
+       exit 0 ;;
+    mc68*:A/UX:*:*)
+       echo m68k-apple-aux${UNAME_RELEASE}
+       exit 0 ;;
+    news*:NEWS-OS:6*:*)
+       echo mips-sony-newsos6
+       exit 0 ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+       if [ -d /usr/nec ]; then
+               echo mips-nec-sysv${UNAME_RELEASE}
+       else
+               echo mips-unknown-sysv${UNAME_RELEASE}
+       fi
+        exit 0 ;;
+    BeBox:BeOS:*:*)    # BeOS running on hardware made by Be, PPC only.
+       echo powerpc-be-beos
+       exit 0 ;;
+    BeMac:BeOS:*:*)    # BeOS running on Mac or Mac clone, PPC only.
+       echo powerpc-apple-beos
+       exit 0 ;;
+    BePC:BeOS:*:*)     # BeOS running on Intel PC compatible.
+       echo i586-pc-beos
+       exit 0 ;;
+    SX-4:SUPER-UX:*:*)
+       echo sx4-nec-superux${UNAME_RELEASE}
+       exit 0 ;;
+    SX-5:SUPER-UX:*:*)
+       echo sx5-nec-superux${UNAME_RELEASE}
+       exit 0 ;;
+    Power*:Rhapsody:*:*)
+       echo powerpc-apple-rhapsody${UNAME_RELEASE}
+       exit 0 ;;
+    *:Rhapsody:*:*)
+       echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+       exit 0 ;;
+    *:Darwin:*:*)
+       echo `uname -p`-apple-darwin${UNAME_RELEASE}
+       exit 0 ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+       if test "${UNAME_MACHINE}" = "x86pc"; then
+               UNAME_MACHINE=pc
+       fi
+       echo `uname -p`-${UNAME_MACHINE}-nto-qnx
+       exit 0 ;;
+    *:QNX:*:4*)
+       echo i386-pc-qnx
+       exit 0 ;;
+    NSR-[GKLNPTVW]:NONSTOP_KERNEL:*:*)
+       echo nsr-tandem-nsk${UNAME_RELEASE}
+       exit 0 ;;
+    *:NonStop-UX:*:*)
+       echo mips-compaq-nonstopux
+       exit 0 ;;
+    BS2000:POSIX*:*:*)
+       echo bs2000-siemens-sysv
+       exit 0 ;;
+    DS/*:UNIX_System_V:*:*)
+       echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+       exit 0 ;;
+    *:Plan9:*:*)
+       # "uname -m" is not consistent, so use $cputype instead. 386
+       # is converted to i386 for consistency with other x86
+       # operating systems.
+       if test "$cputype" = "386"; then
+           UNAME_MACHINE=i386
+       else
+           UNAME_MACHINE="$cputype"
+       fi
+       echo ${UNAME_MACHINE}-unknown-plan9
+       exit 0 ;;
+    i*86:OS/2:*:*)
+       # If we were able to find `uname', then EMX Unix compatibility
+       # is probably installed.
+       echo ${UNAME_MACHINE}-pc-os2-emx
+       exit 0 ;;
+    *:TOPS-10:*:*)
+       echo pdp10-unknown-tops10
+       exit 0 ;;
+    *:TENEX:*:*)
+       echo pdp10-unknown-tenex
+       exit 0 ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+       echo pdp10-dec-tops20
+       exit 0 ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+       echo pdp10-xkl-tops20
+       exit 0 ;;
+    *:TOPS-20:*:*)
+       echo pdp10-unknown-tops20
+       exit 0 ;;
+    *:ITS:*:*)
+       echo pdp10-unknown-its
+       exit 0 ;;
+    i*86:XTS-300:*:STOP)
+       echo ${UNAME_MACHINE}-unknown-stop
+       exit 0 ;;
+    i*86:atheos:*:*)
+       echo ${UNAME_MACHINE}-unknown-atheos
+       exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+         ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+       printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+       printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0
+rm -f $dummy.c $dummy
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+       echo c1-convex-bsd
+       exit 0 ;;
+    c2*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+       exit 0 ;;
+    c34*)
+       echo c34-convex-bsd
+       exit 0 ;;
+    c38*)
+       echo c38-convex-bsd
+       exit 0 ;;
+    c4*)
+       echo c4-convex-bsd
+       exit 0 ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+    ftp://ftp.gnu.org/pub/gnu/config/
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/config/config.sub b/config/config.sub
new file mode 100755 (executable)
index 0000000..1657334
--- /dev/null
@@ -0,0 +1,1440 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002 Free Software Foundation, Inc.
+
+timestamp='2002-01-02'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#      CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#      CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit 0 ;;
+    --version | -v )
+       echo "$version" ; exit 0 ;;
+    --help | --h* | -h )
+       echo "$usage"; exit 0 ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )        # Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit 0;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+       -sun*os*)
+               # Prevent following clause from handling this invalid input.
+               ;;
+       -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+       -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+       -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+       -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+       -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+       -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+       -apple | -axis)
+               os=
+               basic_machine=$1
+               ;;
+       -sim | -cisco | -oki | -wec | -winbond)
+               os=
+               basic_machine=$1
+               ;;
+       -scout)
+               ;;
+       -wrs)
+               os=-vxworks
+               basic_machine=$1
+               ;;
+       -chorusos*)
+               os=-chorusos
+               basic_machine=$1
+               ;;
+       -chorusrdb)
+               os=-chorusrdb
+               basic_machine=$1
+               ;;
+       -hiux*)
+               os=-hiuxwe2
+               ;;
+       -sco5)
+               os=-sco3.2v5
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco4)
+               os=-sco3.2v4
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2.[4-9]*)
+               os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2v[4-9]*)
+               # Don't forget version if it is 3.2v4 or newer.
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco*)
+               os=-sco3.2v2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -udk*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -isc)
+               os=-isc2.2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -clix*)
+               basic_machine=clipper-intergraph
+               ;;
+       -isc*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -lynx*)
+               os=-lynxos
+               ;;
+       -ptx*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+               ;;
+       -windowsnt*)
+               os=`echo $os | sed -e 's/windowsnt/winnt/'`
+               ;;
+       -psos*)
+               os=-psos
+               ;;
+       -mint | -mint[0-9]*)
+               basic_machine=m68k-atari
+               os=-mint
+               ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+       # Recognize the basic CPU types without company name.
+       # Some are omitted here because they have special meanings below.
+       1750a | 580 \
+       | a29k \
+       | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+       | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+       | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+       | c4x | clipper \
+       | d10v | d30v | dsp16xx \
+       | fr30 \
+       | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+       | i370 | i860 | i960 | ia64 \
+       | m32r | m68000 | m68k | m88k | mcore \
+       | mips16 | mips64 | mips64el | mips64orion | mips64orionel \
+       | mips64vr4100 | mips64vr4100el | mips64vr4300 \
+       | mips64vr4300el | mips64vr5000 | mips64vr5000el \
+       | mipsbe | mipseb | mipsel | mipsle | mipstx39 | mipstx39el \
+       | mipsisa32 \
+       | mn10200 | mn10300 \
+       | ns16k | ns32k \
+       | openrisc \
+       | pdp10 | pdp11 | pj | pjl \
+       | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+       | pyramid \
+       | sh | sh[34] | sh[34]eb | shbe | shle \
+       | sparc | sparc64 | sparclet | sparclite | sparcv9 | sparcv9b \
+       | strongarm \
+       | tahoe | thumb | tic80 | tron \
+       | v850 | v850e \
+       | we32k \
+       | x86 | xscale | xstormy16 | xtensa \
+       | z8k)
+               basic_machine=$basic_machine-unknown
+               ;;
+       m6811 | m68hc11 | m6812 | m68hc12)
+               # Motorola 68HC11/12.
+               basic_machine=$basic_machine-unknown
+               os=-none
+               ;;
+       m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+               ;;
+
+       # We use `pc' rather than `unknown'
+       # because (1) that's what they normally are, and
+       # (2) the word "unknown" tends to confuse beginning users.
+       i*86 | x86_64)
+         basic_machine=$basic_machine-pc
+         ;;
+       # Object if more than one company name word.
+       *-*-*)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+       # Recognize the basic CPU types with company name.
+       580-* \
+       | a29k-* \
+       | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+       | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+       | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+       | arm-*  | armbe-* | armle-* | armv*-* \
+       | avr-* \
+       | bs2000-* \
+       | c[123]* | c30-* | [cjt]90-* | c54x-* \
+       | clipper-* | cray2-* | cydra-* \
+       | d10v-* | d30v-* \
+       | elxsi-* \
+       | f30[01]-* | f700-* | fr30-* | fx80-* \
+       | h8300-* | h8500-* \
+       | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+       | i*86-* | i860-* | i960-* | ia64-* \
+       | m32r-* \
+       | m68000-* | m680[01234]0-* | m68360-* | m683?2-* | m68k-* \
+       | m88110-* | m88k-* | mcore-* \
+       | mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \
+       | mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \
+       | mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipseb-* \
+       | mipsle-* | mipsel-* | mipstx39-* | mipstx39el-* \
+       | none-* | np1-* | ns16k-* | ns32k-* \
+       | orion-* \
+       | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+       | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+       | pyramid-* \
+       | romp-* | rs6000-* \
+       | sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* \
+       | sparc-* | sparc64-* | sparc86x-* | sparclite-* \
+       | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* \
+       | t3e-* | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \
+       | v850-* | v850e-* | vax-* \
+       | we32k-* \
+       | x86-* | x86_64-* | xmp-* | xps100-* | xscale-* | xstormy16-* \
+       | xtensa-* \
+       | ymp-* \
+       | z8k-*)
+               ;;
+       # Recognize the various machine names and aliases which stand
+       # for a CPU type and a company and sometimes even an OS.
+       386bsd)
+               basic_machine=i386-unknown
+               os=-bsd
+               ;;
+       3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+               basic_machine=m68000-att
+               ;;
+       3b*)
+               basic_machine=we32k-att
+               ;;
+       a29khif)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       adobe68k)
+               basic_machine=m68010-adobe
+               os=-scout
+               ;;
+       alliant | fx80)
+               basic_machine=fx80-alliant
+               ;;
+       altos | altos3068)
+               basic_machine=m68k-altos
+               ;;
+       am29k)
+               basic_machine=a29k-none
+               os=-bsd
+               ;;
+       amdahl)
+               basic_machine=580-amdahl
+               os=-sysv
+               ;;
+       amiga | amiga-*)
+               basic_machine=m68k-unknown
+               ;;
+       amigaos | amigados)
+               basic_machine=m68k-unknown
+               os=-amigaos
+               ;;
+       amigaunix | amix)
+               basic_machine=m68k-unknown
+               os=-sysv4
+               ;;
+       apollo68)
+               basic_machine=m68k-apollo
+               os=-sysv
+               ;;
+       apollo68bsd)
+               basic_machine=m68k-apollo
+               os=-bsd
+               ;;
+       aux)
+               basic_machine=m68k-apple
+               os=-aux
+               ;;
+       balance)
+               basic_machine=ns32k-sequent
+               os=-dynix
+               ;;
+       convex-c1)
+               basic_machine=c1-convex
+               os=-bsd
+               ;;
+       convex-c2)
+               basic_machine=c2-convex
+               os=-bsd
+               ;;
+       convex-c32)
+               basic_machine=c32-convex
+               os=-bsd
+               ;;
+       convex-c34)
+               basic_machine=c34-convex
+               os=-bsd
+               ;;
+       convex-c38)
+               basic_machine=c38-convex
+               os=-bsd
+               ;;
+       cray | ymp)
+               basic_machine=ymp-cray
+               os=-unicos
+               ;;
+       cray2)
+               basic_machine=cray2-cray
+               os=-unicos
+               ;;
+       [cjt]90)
+               basic_machine=${basic_machine}-cray
+               os=-unicos
+               ;;
+       crds | unos)
+               basic_machine=m68k-crds
+               ;;
+       cris | cris-* | etrax*)
+               basic_machine=cris-axis
+               ;;
+       da30 | da30-*)
+               basic_machine=m68k-da30
+               ;;
+       decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+               basic_machine=mips-dec
+               ;;
+       decsystem10* | dec10*)
+               basic_machine=pdp10-dec
+               os=-tops10
+               ;;
+       decsystem20* | dec20*)
+               basic_machine=pdp10-dec
+               os=-tops20
+               ;;
+       delta | 3300 | motorola-3300 | motorola-delta \
+             | 3300-motorola | delta-motorola)
+               basic_machine=m68k-motorola
+               ;;
+       delta88)
+               basic_machine=m88k-motorola
+               os=-sysv3
+               ;;
+       dpx20 | dpx20-*)
+               basic_machine=rs6000-bull
+               os=-bosx
+               ;;
+       dpx2* | dpx2*-bull)
+               basic_machine=m68k-bull
+               os=-sysv3
+               ;;
+       ebmon29k)
+               basic_machine=a29k-amd
+               os=-ebmon
+               ;;
+       elxsi)
+               basic_machine=elxsi-elxsi
+               os=-bsd
+               ;;
+       encore | umax | mmax)
+               basic_machine=ns32k-encore
+               ;;
+       es1800 | OSE68k | ose68k | ose | OSE)
+               basic_machine=m68k-ericsson
+               os=-ose
+               ;;
+       fx2800)
+               basic_machine=i860-alliant
+               ;;
+       genix)
+               basic_machine=ns32k-ns
+               ;;
+       gmicro)
+               basic_machine=tron-gmicro
+               os=-sysv
+               ;;
+       go32)
+               basic_machine=i386-pc
+               os=-go32
+               ;;
+       h3050r* | hiux*)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       h8300hms)
+               basic_machine=h8300-hitachi
+               os=-hms
+               ;;
+       h8300xray)
+               basic_machine=h8300-hitachi
+               os=-xray
+               ;;
+       h8500hms)
+               basic_machine=h8500-hitachi
+               os=-hms
+               ;;
+       harris)
+               basic_machine=m88k-harris
+               os=-sysv3
+               ;;
+       hp300-*)
+               basic_machine=m68k-hp
+               ;;
+       hp300bsd)
+               basic_machine=m68k-hp
+               os=-bsd
+               ;;
+       hp300hpux)
+               basic_machine=m68k-hp
+               os=-hpux
+               ;;
+       hp3k9[0-9][0-9] | hp9[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hp9k2[0-9][0-9] | hp9k31[0-9])
+               basic_machine=m68000-hp
+               ;;
+       hp9k3[2-9][0-9])
+               basic_machine=m68k-hp
+               ;;
+       hp9k6[0-9][0-9] | hp6[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hp9k7[0-79][0-9] | hp7[0-79][0-9])
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k78[0-9] | hp78[0-9])
+               # FIXME: really hppa2.0-hp
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+               # FIXME: really hppa2.0-hp
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[0-9][13679] | hp8[0-9][13679])
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[0-9][0-9] | hp8[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hppa-next)
+               os=-nextstep3
+               ;;
+       hppaosf)
+               basic_machine=hppa1.1-hp
+               os=-osf
+               ;;
+       hppro)
+               basic_machine=hppa1.1-hp
+               os=-proelf
+               ;;
+       i370-ibm* | ibm*)
+               basic_machine=i370-ibm
+               ;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+       i*86v32)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv32
+               ;;
+       i*86v4*)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv4
+               ;;
+       i*86v)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv
+               ;;
+       i*86sol2)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-solaris2
+               ;;
+       i386mach)
+               basic_machine=i386-mach
+               os=-mach
+               ;;
+       i386-vsta | vsta)
+               basic_machine=i386-unknown
+               os=-vsta
+               ;;
+       iris | iris4d)
+               basic_machine=mips-sgi
+               case $os in
+                   -irix*)
+                       ;;
+                   *)
+                       os=-irix4
+                       ;;
+               esac
+               ;;
+       isi68 | isi)
+               basic_machine=m68k-isi
+               os=-sysv
+               ;;
+       m88k-omron*)
+               basic_machine=m88k-omron
+               ;;
+       magnum | m3230)
+               basic_machine=mips-mips
+               os=-sysv
+               ;;
+       merlin)
+               basic_machine=ns32k-utek
+               os=-sysv
+               ;;
+       mingw32)
+               basic_machine=i386-pc
+               os=-mingw32
+               ;;
+       miniframe)
+               basic_machine=m68000-convergent
+               ;;
+       *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+               basic_machine=m68k-atari
+               os=-mint
+               ;;
+       mipsel*-linux*)
+               basic_machine=mipsel-unknown
+               os=-linux-gnu
+               ;;
+       mips*-linux*)
+               basic_machine=mips-unknown
+               os=-linux-gnu
+               ;;
+       mips3*-*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+               ;;
+       mips3*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+               ;;
+       mmix*)
+               basic_machine=mmix-knuth
+               os=-mmixware
+               ;;
+       monitor)
+               basic_machine=m68k-rom68k
+               os=-coff
+               ;;
+       morphos)
+               basic_machine=powerpc-unknown
+               os=-morphos
+               ;;
+       msdos)
+               basic_machine=i386-pc
+               os=-msdos
+               ;;
+       mvs)
+               basic_machine=i370-ibm
+               os=-mvs
+               ;;
+       ncr3000)
+               basic_machine=i486-ncr
+               os=-sysv4
+               ;;
+       netbsd386)
+               basic_machine=i386-unknown
+               os=-netbsd
+               ;;
+       netwinder)
+               basic_machine=armv4l-rebel
+               os=-linux
+               ;;
+       news | news700 | news800 | news900)
+               basic_machine=m68k-sony
+               os=-newsos
+               ;;
+       news1000)
+               basic_machine=m68030-sony
+               os=-newsos
+               ;;
+       news-3600 | risc-news)
+               basic_machine=mips-sony
+               os=-newsos
+               ;;
+       necv70)
+               basic_machine=v70-nec
+               os=-sysv
+               ;;
+       next | m*-next )
+               basic_machine=m68k-next
+               case $os in
+                   -nextstep* )
+                       ;;
+                   -ns2*)
+                     os=-nextstep2
+                       ;;
+                   *)
+                     os=-nextstep3
+                       ;;
+               esac
+               ;;
+       nh3000)
+               basic_machine=m68k-harris
+               os=-cxux
+               ;;
+       nh[45]000)
+               basic_machine=m88k-harris
+               os=-cxux
+               ;;
+       nindy960)
+               basic_machine=i960-intel
+               os=-nindy
+               ;;
+       mon960)
+               basic_machine=i960-intel
+               os=-mon960
+               ;;
+       nonstopux)
+               basic_machine=mips-compaq
+               os=-nonstopux
+               ;;
+       np1)
+               basic_machine=np1-gould
+               ;;
+       nsr-tandem)
+               basic_machine=nsr-tandem
+               ;;
+       op50n-* | op60c-*)
+               basic_machine=hppa1.1-oki
+               os=-proelf
+               ;;
+       OSE68000 | ose68000)
+               basic_machine=m68000-ericsson
+               os=-ose
+               ;;
+       os68k)
+               basic_machine=m68k-none
+               os=-os68k
+               ;;
+       pa-hitachi)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       paragon)
+               basic_machine=i860-intel
+               os=-osf
+               ;;
+       pbd)
+               basic_machine=sparc-tti
+               ;;
+       pbb)
+               basic_machine=m68k-tti
+               ;;
+        pc532 | pc532-*)
+               basic_machine=ns32k-pc532
+               ;;
+       pentium | p5 | k5 | k6 | nexgen | viac3)
+               basic_machine=i586-pc
+               ;;
+       pentiumpro | p6 | 6x86 | athlon)
+               basic_machine=i686-pc
+               ;;
+       pentiumii | pentium2)
+               basic_machine=i686-pc
+               ;;
+       pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+               basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumpro-* | p6-* | 6x86-* | athlon-*)
+               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumii-* | pentium2-*)
+               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pn)
+               basic_machine=pn-gould
+               ;;
+       power)  basic_machine=power-ibm
+               ;;
+       ppc)    basic_machine=powerpc-unknown
+               ;;
+       ppc-*)  basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppcle | powerpclittle | ppc-le | powerpc-little)
+               basic_machine=powerpcle-unknown
+               ;;
+       ppcle-* | powerpclittle-*)
+               basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppc64)  basic_machine=powerpc64-unknown
+               ;;
+       ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+               basic_machine=powerpc64le-unknown
+               ;;
+       ppc64le-* | powerpc64little-*)
+               basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ps2)
+               basic_machine=i386-ibm
+               ;;
+       pw32)
+               basic_machine=i586-unknown
+               os=-pw32
+               ;;
+       rom68k)
+               basic_machine=m68k-rom68k
+               os=-coff
+               ;;
+       rm[46]00)
+               basic_machine=mips-siemens
+               ;;
+       rtpc | rtpc-*)
+               basic_machine=romp-ibm
+               ;;
+       s390 | s390-*)
+               basic_machine=s390-ibm
+               ;;
+       s390x | s390x-*)
+               basic_machine=s390x-ibm
+               ;;
+       sa29200)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       sequent)
+               basic_machine=i386-sequent
+               ;;
+       sh)
+               basic_machine=sh-hitachi
+               os=-hms
+               ;;
+       sparclite-wrs | simso-wrs)
+               basic_machine=sparclite-wrs
+               os=-vxworks
+               ;;
+       sps7)
+               basic_machine=m68k-bull
+               os=-sysv2
+               ;;
+       spur)
+               basic_machine=spur-unknown
+               ;;
+       st2000)
+               basic_machine=m68k-tandem
+               ;;
+       stratus)
+               basic_machine=i860-stratus
+               os=-sysv4
+               ;;
+       sun2)
+               basic_machine=m68000-sun
+               ;;
+       sun2os3)
+               basic_machine=m68000-sun
+               os=-sunos3
+               ;;
+       sun2os4)
+               basic_machine=m68000-sun
+               os=-sunos4
+               ;;
+       sun3os3)
+               basic_machine=m68k-sun
+               os=-sunos3
+               ;;
+       sun3os4)
+               basic_machine=m68k-sun
+               os=-sunos4
+               ;;
+       sun4os3)
+               basic_machine=sparc-sun
+               os=-sunos3
+               ;;
+       sun4os4)
+               basic_machine=sparc-sun
+               os=-sunos4
+               ;;
+       sun4sol2)
+               basic_machine=sparc-sun
+               os=-solaris2
+               ;;
+       sun3 | sun3-*)
+               basic_machine=m68k-sun
+               ;;
+       sun4)
+               basic_machine=sparc-sun
+               ;;
+       sun386 | sun386i | roadrunner)
+               basic_machine=i386-sun
+               ;;
+       sv1)
+               basic_machine=sv1-cray
+               os=-unicos
+               ;;
+       symmetry)
+               basic_machine=i386-sequent
+               os=-dynix
+               ;;
+       t3e)
+               basic_machine=t3e-cray
+               os=-unicos
+               ;;
+       tic54x | c54x*)
+               basic_machine=tic54x-unknown
+               os=-coff
+               ;;
+       tx39)
+               basic_machine=mipstx39-unknown
+               ;;
+       tx39el)
+               basic_machine=mipstx39el-unknown
+               ;;
+       toad1)
+               basic_machine=pdp10-xkl
+               os=-tops20
+               ;;
+       tower | tower-32)
+               basic_machine=m68k-ncr
+               ;;
+       udi29k)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       ultra3)
+               basic_machine=a29k-nyu
+               os=-sym1
+               ;;
+       v810 | necv810)
+               basic_machine=v810-nec
+               os=-none
+               ;;
+       vaxv)
+               basic_machine=vax-dec
+               os=-sysv
+               ;;
+       vms)
+               basic_machine=vax-dec
+               os=-vms
+               ;;
+       vpp*|vx|vx-*)
+               basic_machine=f301-fujitsu
+               ;;
+       vxworks960)
+               basic_machine=i960-wrs
+               os=-vxworks
+               ;;
+       vxworks68)
+               basic_machine=m68k-wrs
+               os=-vxworks
+               ;;
+       vxworks29k)
+               basic_machine=a29k-wrs
+               os=-vxworks
+               ;;
+       w65*)
+               basic_machine=w65-wdc
+               os=-none
+               ;;
+       w89k-*)
+               basic_machine=hppa1.1-winbond
+               os=-proelf
+               ;;
+       windows32)
+               basic_machine=i386-pc
+               os=-windows32-msvcrt
+               ;;
+       xmp)
+               basic_machine=xmp-cray
+               os=-unicos
+               ;;
+        xps | xps100)
+               basic_machine=xps100-honeywell
+               ;;
+       z8k-*-coff)
+               basic_machine=z8k-unknown
+               os=-sim
+               ;;
+       none)
+               basic_machine=none-none
+               os=-none
+               ;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+       w89k)
+               basic_machine=hppa1.1-winbond
+               ;;
+       op50n)
+               basic_machine=hppa1.1-oki
+               ;;
+       op60c)
+               basic_machine=hppa1.1-oki
+               ;;
+       mips)
+               if [ x$os = x-linux-gnu ]; then
+                       basic_machine=mips-unknown
+               else
+                       basic_machine=mips-mips
+               fi
+               ;;
+       romp)
+               basic_machine=romp-ibm
+               ;;
+       rs6000)
+               basic_machine=rs6000-ibm
+               ;;
+       vax)
+               basic_machine=vax-dec
+               ;;
+       pdp10)
+               # there are many clones, so DEC is not a safe bet
+               basic_machine=pdp10-unknown
+               ;;
+       pdp11)
+               basic_machine=pdp11-dec
+               ;;
+       we32k)
+               basic_machine=we32k-att
+               ;;
+       sh3 | sh4 | sh3eb | sh4eb)
+               basic_machine=sh-unknown
+               ;;
+       sparc | sparcv9 | sparcv9b)
+               basic_machine=sparc-sun
+               ;;
+        cydra)
+               basic_machine=cydra-cydrome
+               ;;
+       orion)
+               basic_machine=orion-highlevel
+               ;;
+       orion105)
+               basic_machine=clipper-highlevel
+               ;;
+       mac | mpw | mac-mpw)
+               basic_machine=m68k-apple
+               ;;
+       pmac | pmac-mpw)
+               basic_machine=powerpc-apple
+               ;;
+       c4x*)
+               basic_machine=c4x-none
+               os=-coff
+               ;;
+       *-unknown)
+               # Make sure to match an already-canonicalized machine name.
+               ;;
+       *)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+       *-digital*)
+               basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+               ;;
+       *-commodore*)
+               basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+               ;;
+       *)
+               ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+       # -solaris* is a basic system type, with this one exception.
+       -solaris1 | -solaris1.*)
+               os=`echo $os | sed -e 's|solaris1|sunos4|'`
+               ;;
+       -solaris)
+               os=-solaris2
+               ;;
+       -svr4*)
+               os=-sysv4
+               ;;
+       -unixware*)
+               os=-sysv4.2uw
+               ;;
+       -gnu/linux*)
+               os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+               ;;
+       # First accept the basic system types.
+       # The portable systems comes first.
+       # Each alternative MUST END IN A *, to match a version number.
+       # -sysv* is not here because it comes later, after sysvr4.
+       -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+             | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+             | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+             | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+             | -aos* \
+             | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+             | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+             | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
+             | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+             | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+             | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+             | -chorusos* | -chorusrdb* \
+             | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+             | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
+             | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \
+             | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+             | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+             | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* | -morphos*)
+       # Remember, each alternative MUST END IN *, to match a version number.
+               ;;
+       -qnx*)
+               case $basic_machine in
+                   x86-* | i*86-*)
+                       ;;
+                   *)
+                       os=-nto$os
+                       ;;
+               esac
+               ;;
+       -nto*)
+               os=-nto-qnx
+               ;;
+       -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+             | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
+             | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+               ;;
+       -mac*)
+               os=`echo $os | sed -e 's|mac|macos|'`
+               ;;
+       -linux*)
+               os=`echo $os | sed -e 's|linux|linux-gnu|'`
+               ;;
+       -sunos5*)
+               os=`echo $os | sed -e 's|sunos5|solaris2|'`
+               ;;
+       -sunos6*)
+               os=`echo $os | sed -e 's|sunos6|solaris3|'`
+               ;;
+       -opened*)
+               os=-openedition
+               ;;
+       -wince*)
+               os=-wince
+               ;;
+       -osfrose*)
+               os=-osfrose
+               ;;
+       -osf*)
+               os=-osf
+               ;;
+       -utek*)
+               os=-bsd
+               ;;
+       -dynix*)
+               os=-bsd
+               ;;
+       -acis*)
+               os=-aos
+               ;;
+       -atheos*)
+               os=-atheos
+               ;;
+       -386bsd)
+               os=-bsd
+               ;;
+       -ctix* | -uts*)
+               os=-sysv
+               ;;
+       -ns2 )
+               os=-nextstep2
+               ;;
+       -nsk*)
+               os=-nsk
+               ;;
+       # Preserve the version number of sinix5.
+       -sinix5.*)
+               os=`echo $os | sed -e 's|sinix|sysv|'`
+               ;;
+       -sinix*)
+               os=-sysv4
+               ;;
+       -triton*)
+               os=-sysv3
+               ;;
+       -oss*)
+               os=-sysv3
+               ;;
+       -svr4)
+               os=-sysv4
+               ;;
+       -svr3)
+               os=-sysv3
+               ;;
+       -sysvr4)
+               os=-sysv4
+               ;;
+       # This must come after -sysvr4.
+       -sysv*)
+               ;;
+       -ose*)
+               os=-ose
+               ;;
+       -es1800*)
+               os=-ose
+               ;;
+       -xenix)
+               os=-xenix
+               ;;
+        -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+               os=-mint
+               ;;
+       -none)
+               ;;
+       *)
+               # Get rid of the `-' at the beginning of $os.
+               os=`echo $os | sed 's/[^-]*-//'`
+               echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+       *-acorn)
+               os=-riscix1.2
+               ;;
+       arm*-rebel)
+               os=-linux
+               ;;
+       arm*-semi)
+               os=-aout
+               ;;
+       # This must come before the *-dec entry.
+       pdp10-*)
+               os=-tops20
+               ;;
+        pdp11-*)
+               os=-none
+               ;;
+       *-dec | vax-*)
+               os=-ultrix4.2
+               ;;
+       m68*-apollo)
+               os=-domain
+               ;;
+       i386-sun)
+               os=-sunos4.0.2
+               ;;
+       m68000-sun)
+               os=-sunos3
+               # This also exists in the configure program, but was not the
+               # default.
+               # os=-sunos4
+               ;;
+       m68*-cisco)
+               os=-aout
+               ;;
+       mips*-cisco)
+               os=-elf
+               ;;
+       mips*-*)
+               os=-elf
+               ;;
+       *-tti)  # must be before sparc entry or we get the wrong os.
+               os=-sysv3
+               ;;
+       sparc-* | *-sun)
+               os=-sunos4.1.1
+               ;;
+       *-be)
+               os=-beos
+               ;;
+       *-ibm)
+               os=-aix
+               ;;
+       *-wec)
+               os=-proelf
+               ;;
+       *-winbond)
+               os=-proelf
+               ;;
+       *-oki)
+               os=-proelf
+               ;;
+       *-hp)
+               os=-hpux
+               ;;
+       *-hitachi)
+               os=-hiux
+               ;;
+       i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+               os=-sysv
+               ;;
+       *-cbm)
+               os=-amigaos
+               ;;
+       *-dg)
+               os=-dgux
+               ;;
+       *-dolphin)
+               os=-sysv3
+               ;;
+       m68k-ccur)
+               os=-rtu
+               ;;
+       m88k-omron*)
+               os=-luna
+               ;;
+       *-next )
+               os=-nextstep
+               ;;
+       *-sequent)
+               os=-ptx
+               ;;
+       *-crds)
+               os=-unos
+               ;;
+       *-ns)
+               os=-genix
+               ;;
+       i370-*)
+               os=-mvs
+               ;;
+       *-next)
+               os=-nextstep3
+               ;;
+        *-gould)
+               os=-sysv
+               ;;
+        *-highlevel)
+               os=-bsd
+               ;;
+       *-encore)
+               os=-bsd
+               ;;
+        *-sgi)
+               os=-irix
+               ;;
+        *-siemens)
+               os=-sysv4
+               ;;
+       *-masscomp)
+               os=-rtu
+               ;;
+       f30[01]-fujitsu | f700-fujitsu)
+               os=-uxpv
+               ;;
+       *-rom68k)
+               os=-coff
+               ;;
+       *-*bug)
+               os=-coff
+               ;;
+       *-apple)
+               os=-macos
+               ;;
+       *-atari*)
+               os=-mint
+               ;;
+       *)
+               os=-none
+               ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+       *-unknown)
+               case $os in
+                       -riscix*)
+                               vendor=acorn
+                               ;;
+                       -sunos*)
+                               vendor=sun
+                               ;;
+                       -aix*)
+                               vendor=ibm
+                               ;;
+                       -beos*)
+                               vendor=be
+                               ;;
+                       -hpux*)
+                               vendor=hp
+                               ;;
+                       -mpeix*)
+                               vendor=hp
+                               ;;
+                       -hiux*)
+                               vendor=hitachi
+                               ;;
+                       -unos*)
+                               vendor=crds
+                               ;;
+                       -dgux*)
+                               vendor=dg
+                               ;;
+                       -luna*)
+                               vendor=omron
+                               ;;
+                       -genix*)
+                               vendor=ns
+                               ;;
+                       -mvs* | -opened*)
+                               vendor=ibm
+                               ;;
+                       -ptx*)
+                               vendor=sequent
+                               ;;
+                       -vxsim* | -vxworks*)
+                               vendor=wrs
+                               ;;
+                       -aux*)
+                               vendor=apple
+                               ;;
+                       -hms*)
+                               vendor=hitachi
+                               ;;
+                       -mpw* | -macos*)
+                               vendor=apple
+                               ;;
+                       -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+                               vendor=atari
+                               ;;
+                       -vos*)
+                               vendor=stratus
+                               ;;
+               esac
+               basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+               ;;
+esac
+
+echo $basic_machine$os
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/config/configure.in b/config/configure.in
new file mode 100644 (file)
index 0000000..466c4ee
--- /dev/null
@@ -0,0 +1,291 @@
+dnl
+dnl  configure.in
+dnl
+AC_REVISION($Id: configure.in,v 1.8.4.2.2.12 2002/12/01 11:53:21 icastle Exp $)
+dnl
+dnl  Process this file with autoconf to produce a configure script.
+dnl
+dnl  Copyright (C) 1998 Cees A. de Groot
+dnl
+
+dnl
+dnl  Credits: this autoconf script was largely "inspired" <g> by the
+dnl  autoconf script around SP made by Henry Thompson.
+dnl
+AC_INIT(dsssl)
+AC_CONFIG_AUX_DIR(config)
+AM_INIT_AUTOMAKE( openjade, 1.3.2)
+TOP=`pwd`
+AC_SUBST(TOP)
+dnl
+dnl Location of OpenSP include files
+dnl
+AC_MSG_CHECKING(location of OpenSP include files)
+AC_ARG_ENABLE(spincludedir,
+[  --enable-spincludedir=pathlist
+       location of OpenSP include files],
+       [if test $enableval
+        then
+           AC_MSG_RESULT($enableval)
+           SPINCLUDEDIR="$enableval"
+        else
+           for d in ${prefix}/include/OpenSP /usr/local/include/OpenSP \
+             /usr/include/OpenSP; do
+            AC_CHECK_FILE($d, [SPINCLUDEDIR="$d"; break])
+          done
+         fi],
+        [for d in ${prefix}/include/OpenSP /usr/local/include/OpenSP \
+           /usr/include/OpenSP; do
+          AC_CHECK_FILE($d, [SPINCLUDEDIR="$d"; break])
+        done])
+if test x${SPINCLUDEDIR} = x; then
+  AC_MSG_ERROR("OpenSP include files do not exist")
+fi
+AC_SUBST(SPINCLUDEDIR)
+
+dnl
+dnl Location of OpenSP library
+dnl
+case "${SPINCLUDEDIR}" in
+  ${prefix}/include/OpenSP) osplibdir=${prefix}/lib ;;
+  /usr/local/include/OpenSP) osplibdir=/usr/local/lib ;;
+  *) osplibdir=/usr/lib ;;
+esac
+# On PPC64 libosp is to be found in /usr/lib64; thus
+# fall back to this directory
+test -d ${osplibdir}64 && osplibdir=${osplibdir}64
+AC_MSG_CHECKING(location of OpenSP Library)
+AC_ARG_ENABLE(splibdir,
+[  --enable-splibdir=pathlist
+       location of OpenSP library],
+       [if test $enableval
+        then
+           AC_MSG_RESULT($enableval)
+           SPLIBDIR="$enableval"
+        else
+          AC_MSG_RESULT($osplibdir)
+          SPLIBDIR=$osplibdir
+         fi],
+        [ AC_MSG_RESULT($osplibdir)
+          SPLIBDIR=$osplibdir])
+unset osplibdir
+
+AC_SUBST(SPLIBDIR)
+
+dnl AC_ARG_PROGRAM
+
+AC_CANONICAL_HOST
+
+if test "$CXXFLAGS" = ""; then 
+  CXXFLAGS="-O2"
+fi
+
+dnl
+dnl  Backup original Makefiles, people may want to revert to it if
+dnl  configure doesn't work.
+dnl
+echo 'saving distribution makefiles...'
+test ! -f Makefile.dist && test -f Makefile && cp Makefile Makefile.dist
+test ! -f Makefile.lib.dist && test -f Makefile.lib && cp Makefile.lib Makefile.lib.dist
+test ! -f Makefile.prog.dist && test -f Makefile.prog && cp Makefile.prog Makefile.prog.dist
+test ! -f Makefile.comm.dist && test -f Makefile.comm && cp Makefile.comm Makefile.comm.dist
+
+dnl
+dnl  Check for programs
+dnl
+AC_PROG_CC
+AC_PROG_INSTALL
+AC_PROG_LN_S
+AC_PROG_CXX
+AC_PATH_PROGS(PERL, perl, perl)
+test "$INSTALL" = "./config/install-sh -c" && INSTALL=`pwd`"/config/install-sh -c"
+
+dnl
+dnl  Stuff special to GNU C++
+dnl
+
+case "${host}" in
+  *-*-darwin*)
+    LINKFLAGS="-no-undefined"
+    ;;
+  *)
+    if test "$GXX"
+    then
+dnl FIXME these need tests for non-GNU compilers
+       AC_CACHE_CHECK(whether GNU C++ supports automatic template instantiation,
+              ac_cv_c_gnu_automatic_templates,
+                  [AC_EGREP_CPP(yes,[
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 8)
+  yes
+#endif
+                 ],
+                    ac_cv_c_gnu_automatic_templates=yes,
+                    ac_cv_c_gnu_automatic_templates=no)
+                  ])
+        if test "$ac_cv_c_gnu_automatic_templates" = yes; then
+            AC_DEFINE(SP_DEFINE_TEMPLATES,1,
+              [define this to include template definitions in the headers])
+        else
+            AC_DEFINE(SP_MANUAL_INST,1,
+              [define this to compile explicit template instantiations])
+            CXXFLAGS="$CXXFLAGS -fno-implicit-templates"
+        fi
+    fi
+    ;;
+esac
+
+dnl
+dnl  Checks for header files.
+dnl
+AC_HEADER_STDC
+AC_CHECK_HEADERS(limits.h)
+
+dnl
+dnl  Checks for typedefs, structures, and compiler characteristics.
+dnl
+AC_C_CONST
+AC_C_INLINE
+AC_TYPE_SIZE_T
+AC_STRUCT_ST_BLKSIZE
+AC_CACHE_CHECK(for sig_atomic_t in signal.h,
+    ac_cv_have_sig_atomic_t,
+    [AC_TRY_LINK([#include <signal.h>],sig_atomic_t x;,
+       ac_cv_have_sig_atomic_t=yes,
+       ac_cv_have_sig_atomic_t=no)])
+if test "$ac_cv_have_sig_atomic_t" = "no"
+then
+    AC_CHECK_TYPE(sig_atomic_t,int)
+fi
+
+AC_CHECK_SIZEOF(size_t)
+AC_CHECK_SIZEOF(unsigned int)
+
+dnl
+dnl  Checks for library functions.
+dnl 
+dnl AC_CHECK_FUNC(memmove,,LIBOBJS="$LIBOBJS memmove.o")
+dnl AC_CHECK_FUNC(strerror,,LIBOBJS="$LIBOBJS strerror.o")
+dnl AC_CHECK_FUNC(strtoul,,LIBOBJS="$LIBOBJS strtoul.o")
+
+AC_CHECK_FUNC(setlocale,[AC_DEFINE(SP_HAVE_LOCALE)])
+AC_CHECK_FUNC(towupper,[AC_DEFINE(SP_HAVE_WCHAR)])
+AC_CHECK_FUNC(gettext,[AC_DEFINE(SP_HAVE_GETTEXT)],
+  [AC_CHECK_LIB(intl,gettext,[AC_DEFINE(SP_HAVE_GETTEXT) LIBS="$LIBS -lintl"])])
+
+dnl
+dnl Check for thread support.
+AC_CHECK_LIB(threads,cthread_fork,LIB_THREADS="-lthreads",LIB_THREADS="")
+AC_SUBST(LIB_THREADS)
+
+dnl
+dnl Check if type of size_t is unsigned int
+dnl
+OJ_SIZE_T_IS_UINT
+
+dnl
+dnl the following tests require c++, not c; note that if you switch this
+dnl earlier, AC_C_CONST will fail, at least
+dnl
+AC_LANG_CPLUSPLUS
+
+AC_CACHE_CHECK(support for bool,
+    ac_cv_typedef_bool,
+    [AC_TRY_LINK(,bool x; x=(false | true);,
+               ac_cv_typedef_bool=yes,
+       ac_cv_typedef_bool=no)])
+if test "$ac_cv_typedef_bool" = "yes"
+then
+    AC_DEFINE(SP_HAVE_BOOL)
+fi
+
+dnl 
+dnl  ANSI templates
+dnl
+AC_CACHE_CHECK(for ANSI template instantiation,
+               ac_cv_c_template_ansi,
+               [AC_TRY_LINK([
+class foo {
+};
+
+template<class T> class test {
+public:
+ T *data();};
+template class test<foo>;
+],,ac_cv_c_template_ansi=yes,
+   ac_cv_c_template_ansi=no)])
+if test "$ac_cv_c_template_ansi" = "yes"
+ then
+  AC_DEFINE(SP_ANSI_CLASS_INST)
+fi
+
+dnl
+dnl  HTTP support
+dnl
+AC_MSG_CHECKING(whether to include support for http)
+AC_ARG_ENABLE(http,
+[  --enable-http          include support for http],
+    [if test $enableval
+    then
+        AC_MSG_RESULT(yes)
+       AC_DEFINE(SP_HAVE_SOCKET)
+       AC_CHECK_LIB(nsl,main,LIBS="$LIBS -lnsl")
+       AC_CHECK_LIB(socket,main,LIBS="$LIBS -lsocket")
+       AC_MSG_CHECKING(h_errno in netdb.h)
+       AC_EGREP_HEADER(h_errno,netdb.h,
+           [AC_MSG_RESULT(yes)],
+           [AC_DEFINE(SP_DECLARE_H_ERRNO)
+           AC_MSG_RESULT(no)])
+    else
+        AC_MSG_RESULT(no)
+    fi],
+    [AC_MSG_RESULT(no)])
+
+dnl
+dnl  optional backends
+dnl
+smr_SWITCH(mif, support for FrameMaker MIF output, on, JADE_MIF, DUMMY)
+smr_SWITCH(html, support for HTML+CSS output, on, JADE_HTML, DUMMY)
+
+
+dnl 
+dnl  Other options
+dnl
+AC_DEFINE(SP_MULTI_BYTE)
+AC_MSG_CHECKING(for default catalog)
+AC_ARG_ENABLE(default-catalog,
+[  --enable-default-catalog=pathlist
+                          provide one or more default catalog files or
+                          sysids, e.g. /usr/local/lib/sgml/catalog],
+              [if test $enableval
+               then
+                AC_MSG_RESULT($enableval)
+                AC_DEFINE_UNQUOTED(SGML_CATALOG_FILES_DEFAULT,"$enableval")
+               else
+                AC_MSG_RESULT(none)
+              fi],
+              [AC_MSG_RESULT(none)])
+AC_MSG_CHECKING(for default search path)
+AC_ARG_ENABLE(default-search-path,
+[  --enable-default-search-path=pathlist
+                          provide a default value for SGML_SEARCH_PATH],
+    [if test $enableval
+    then
+        AC_MSG_RESULT($enableval)
+       AC_DEFINE_UNQUOTED(SGML_SEARCH_PATH_DEFAULT,"$enableval")
+    else
+        AC_MSG_RESULT(none)
+    fi],
+    [AC_MSG_RESULT(none)])
+
+dnl AC_SUBST(LIBOBJS)
+
+AC_PROG_LIBTOOL
+AC_SUBST(LIBTOOL_DEPS)
+
+dnl
+dnl Darwin/Mac OS X requires some extra flags for libtool
+dnl
+AC_SUBST(LINKFLAGS)
+
+AC_OUTPUT(Makefile Makefile.lib Makefile.prog Makefile.comm include/config.h)
+
diff --git a/config/install-sh b/config/install-sh
new file mode 100755 (executable)
index 0000000..e9de238
--- /dev/null
@@ -0,0 +1,251 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission.  M.I.T. makes no representations about the
+# suitability of this software for any purpose.  It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.  It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+    case $1 in
+       -c) instcmd="$cpprog"
+           shift
+           continue;;
+
+       -d) dir_arg=true
+           shift
+           continue;;
+
+       -m) chmodcmd="$chmodprog $2"
+           shift
+           shift
+           continue;;
+
+       -o) chowncmd="$chownprog $2"
+           shift
+           shift
+           continue;;
+
+       -g) chgrpcmd="$chgrpprog $2"
+           shift
+           shift
+           continue;;
+
+       -s) stripcmd="$stripprog"
+           shift
+           continue;;
+
+       -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+           shift
+           continue;;
+
+       -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+           shift
+           continue;;
+
+       *)  if [ x"$src" = x ]
+           then
+               src=$1
+           else
+               # this colon is to work around a 386BSD /bin/sh bug
+               :
+               dst=$1
+           fi
+           shift
+           continue;;
+    esac
+done
+
+if [ x"$src" = x ]
+then
+       echo "install:  no input file specified"
+       exit 1
+else
+       true
+fi
+
+if [ x"$dir_arg" != x ]; then
+       dst=$src
+       src=""
+       
+       if [ -d $dst ]; then
+               instcmd=:
+               chmodcmd=""
+       else
+               instcmd=mkdir
+       fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad 
+# if $src (and thus $dsttmp) contains '*'.
+
+       if [ -f $src -o -d $src ]
+       then
+               true
+       else
+               echo "install:  $src does not exist"
+               exit 1
+       fi
+       
+       if [ x"$dst" = x ]
+       then
+               echo "install:  no destination specified"
+               exit 1
+       else
+               true
+       fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+       if [ -d $dst ]
+       then
+               dst="$dst"/`basename $src`
+       else
+               true
+       fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+#  this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='   
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+       pathcomp="${pathcomp}${1}"
+       shift
+
+       if [ ! -d "${pathcomp}" ] ;
+        then
+               $mkdirprog "${pathcomp}"
+       else
+               true
+       fi
+
+       pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+       $doit $instcmd $dst &&
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+       if [ x"$transformarg" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               dstfile=`basename $dst $transformbasename | 
+                       sed $transformarg`$transformbasename
+       fi
+
+# don't allow the sed command to completely eliminate the filename
+
+       if [ x"$dstfile" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               true
+       fi
+
+# Make a temp file name in the proper directory.
+
+       dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+       $doit $instcmd $src $dsttmp &&
+
+       trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing.  If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+       $doit $rmcmd -f $dstdir/$dstfile &&
+       $doit $mvcmd $dsttmp $dstdir/$dstfile 
+
+fi &&
+
+
+exit 0
diff --git a/config/ltmain.sh b/config/ltmain.sh
new file mode 100644 (file)
index 0000000..2393e14
--- /dev/null
@@ -0,0 +1,4946 @@
+# ltmain.sh - Provide generalized library-building support services.
+# NOTE: Changing this file will not affect anything until you rerun configure.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Check that we have a working $echo.
+if test "X$1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X$1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
+  # Yippee, $echo works!
+  :
+else
+  # Restart under the correct shell, and then maybe $echo will work.
+  exec $SHELL "$0" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<EOF
+$*
+EOF
+  exit 0
+fi
+
+# The name of this program.
+progname=`$echo "$0" | sed 's%^.*/%%'`
+modename="$progname"
+
+# Constants.
+PROGRAM=ltmain.sh
+PACKAGE=libtool
+VERSION=1.4
+TIMESTAMP=" (1.920 2001/04/24 23:26:18)"
+
+default_mode=
+help="Try \`$progname --help' for more information."
+magic="%%%MAGIC variable%%%"
+mkdir="mkdir"
+mv="mv -f"
+rm="rm -f"
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e 1s/^X//'
+sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g'
+SP2NL='tr \040 \012'
+NL2SP='tr \015\012 \040\040'
+
+# NLS nuisances.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+# We save the old values to restore during execute mode.
+if test "${LC_ALL+set}" = set; then
+  save_LC_ALL="$LC_ALL"; LC_ALL=C; export LC_ALL
+fi
+if test "${LANG+set}" = set; then
+  save_LANG="$LANG"; LANG=C; export LANG
+fi
+
+if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+  echo "$modename: not configured to build any kind of library" 1>&2
+  echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
+  exit 1
+fi
+
+# Global variables.
+mode=$default_mode
+nonopt=
+prev=
+prevopt=
+run=
+show="$echo"
+show_help=
+execute_dlfiles=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+
+# Parse our command line options once, thoroughly.
+while test $# -gt 0
+do
+  arg="$1"
+  shift
+
+  case $arg in
+  -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;;
+  *) optarg= ;;
+  esac
+
+  # If the previous option needs an argument, assign it.
+  if test -n "$prev"; then
+    case $prev in
+    execute_dlfiles)
+      execute_dlfiles="$execute_dlfiles $arg"
+      ;;
+    *)
+      eval "$prev=\$arg"
+      ;;
+    esac
+
+    prev=
+    prevopt=
+    continue
+  fi
+
+  # Have we seen a non-optional argument yet?
+  case $arg in
+  --help)
+    show_help=yes
+    ;;
+
+  --version)
+    echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP"
+    exit 0
+    ;;
+
+  --config)
+    sed -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $0
+    exit 0
+    ;;
+
+  --debug)
+    echo "$progname: enabling shell trace mode"
+    set -x
+    ;;
+
+  --dry-run | -n)
+    run=:
+    ;;
+
+  --features)
+    echo "host: $host"
+    if test "$build_libtool_libs" = yes; then
+      echo "enable shared libraries"
+    else
+      echo "disable shared libraries"
+    fi
+    if test "$build_old_libs" = yes; then
+      echo "enable static libraries"
+    else
+      echo "disable static libraries"
+    fi
+    exit 0
+    ;;
+
+  --finish) mode="finish" ;;
+
+  --mode) prevopt="--mode" prev=mode ;;
+  --mode=*) mode="$optarg" ;;
+
+  --quiet | --silent)
+    show=:
+    ;;
+
+  -dlopen)
+    prevopt="-dlopen"
+    prev=execute_dlfiles
+    ;;
+
+  -*)
+    $echo "$modename: unrecognized option \`$arg'" 1>&2
+    $echo "$help" 1>&2
+    exit 1
+    ;;
+
+  *)
+    nonopt="$arg"
+    break
+    ;;
+  esac
+done
+
+if test -n "$prevopt"; then
+  $echo "$modename: option \`$prevopt' requires an argument" 1>&2
+  $echo "$help" 1>&2
+  exit 1
+fi
+
+if test -z "$show_help"; then
+
+  # Infer the operation mode.
+  if test -z "$mode"; then
+    case $nonopt in
+    *cc | *++ | gcc* | *-gcc*)
+      mode=link
+      for arg
+      do
+       case $arg in
+       -c)
+          mode=compile
+          break
+          ;;
+       esac
+      done
+      ;;
+    *db | *dbx | *strace | *truss)
+      mode=execute
+      ;;
+    *install*|cp|mv)
+      mode=install
+      ;;
+    *rm)
+      mode=uninstall
+      ;;
+    *)
+      # If we have no mode, but dlfiles were specified, then do execute mode.
+      test -n "$execute_dlfiles" && mode=execute
+
+      # Just use the default operation mode.
+      if test -z "$mode"; then
+       if test -n "$nonopt"; then
+         $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2
+       else
+         $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2
+       fi
+      fi
+      ;;
+    esac
+  fi
+
+  # Only execute mode is allowed to have -dlopen flags.
+  if test -n "$execute_dlfiles" && test "$mode" != execute; then
+    $echo "$modename: unrecognized option \`-dlopen'" 1>&2
+    $echo "$help" 1>&2
+    exit 1
+  fi
+
+  # Change the help message to a mode-specific one.
+  generic_help="$help"
+  help="Try \`$modename --help --mode=$mode' for more information."
+
+  # These modes are in order of execution frequency so that they run quickly.
+  case $mode in
+  # libtool compile mode
+  compile)
+    modename="$modename: compile"
+    # Get the compilation command and the source file.
+    base_compile=
+    prev=
+    lastarg=
+    srcfile="$nonopt"
+    suppress_output=
+
+    user_target=no
+    for arg
+    do
+      case $prev in
+      "") ;;
+      xcompiler)
+       # Aesthetically quote the previous argument.
+       prev=
+       lastarg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+
+       case $arg in
+       # Double-quote args containing other shell metacharacters.
+       # Many Bourne shells cannot handle close brackets correctly
+       # in scan sets, so we specify it separately.
+       *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \   ]*|*]*|"")
+         arg="\"$arg\""
+         ;;
+       esac
+
+       # Add the previous argument to base_compile.
+       if test -z "$base_compile"; then
+         base_compile="$lastarg"
+       else
+         base_compile="$base_compile $lastarg"
+       fi
+       continue
+       ;;
+      esac
+
+      # Accept any command-line options.
+      case $arg in
+      -o)
+       if test "$user_target" != "no"; then
+         $echo "$modename: you cannot specify \`-o' more than once" 1>&2
+         exit 1
+       fi
+       user_target=next
+       ;;
+
+      -static)
+       build_old_libs=yes
+       continue
+       ;;
+
+      -prefer-pic)
+       pic_mode=yes
+       continue
+       ;;
+
+      -prefer-non-pic)
+       pic_mode=no
+       continue
+       ;;
+
+      -Xcompiler)
+       prev=xcompiler
+       continue
+       ;;
+
+      -Wc,*)
+       args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"`
+       lastarg=
+       IFS="${IFS=     }"; save_ifs="$IFS"; IFS=','
+       for arg in $args; do
+         IFS="$save_ifs"
+
+         # Double-quote args containing other shell metacharacters.
+         # Many Bourne shells cannot handle close brackets correctly
+         # in scan sets, so we specify it separately.
+         case $arg in
+           *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \       ]*|*]*|"")
+           arg="\"$arg\""
+           ;;
+         esac
+         lastarg="$lastarg $arg"
+       done
+       IFS="$save_ifs"
+       lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"`
+
+       # Add the arguments to base_compile.
+       if test -z "$base_compile"; then
+         base_compile="$lastarg"
+       else
+         base_compile="$base_compile $lastarg"
+       fi
+       continue
+       ;;
+      esac
+
+      case $user_target in
+      next)
+       # The next one is the -o target name
+       user_target=yes
+       continue
+       ;;
+      yes)
+       # We got the output file
+       user_target=set
+       libobj="$arg"
+       continue
+       ;;
+      esac
+
+      # Accept the current argument as the source file.
+      lastarg="$srcfile"
+      srcfile="$arg"
+
+      # Aesthetically quote the previous argument.
+
+      # Backslashify any backslashes, double quotes, and dollar signs.
+      # These are the only characters that are still specially
+      # interpreted inside of double-quoted scrings.
+      lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"`
+
+      # Double-quote args containing other shell metacharacters.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      case $lastarg in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \    ]*|*]*|"")
+       lastarg="\"$lastarg\""
+       ;;
+      esac
+
+      # Add the previous argument to base_compile.
+      if test -z "$base_compile"; then
+       base_compile="$lastarg"
+      else
+       base_compile="$base_compile $lastarg"
+      fi
+    done
+
+    case $user_target in
+    set)
+      ;;
+    no)
+      # Get the name of the library object.
+      libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'`
+      ;;
+    *)
+      $echo "$modename: you must specify a target with \`-o'" 1>&2
+      exit 1
+      ;;
+    esac
+
+    # Recognize several different file suffixes.
+    # If the user specifies -o file.o, it is replaced with file.lo
+    xform='[cCFSfmso]'
+    case $libobj in
+    *.ada) xform=ada ;;
+    *.adb) xform=adb ;;
+    *.ads) xform=ads ;;
+    *.asm) xform=asm ;;
+    *.c++) xform=c++ ;;
+    *.cc) xform=cc ;;
+    *.cpp) xform=cpp ;;
+    *.cxx) xform=cxx ;;
+    *.f90) xform=f90 ;;
+    *.for) xform=for ;;
+    esac
+
+    libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"`
+
+    case $libobj in
+    *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;;
+    *)
+      $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2
+      exit 1
+      ;;
+    esac
+
+    if test -z "$base_compile"; then
+      $echo "$modename: you must specify a compilation command" 1>&2
+      $echo "$help" 1>&2
+      exit 1
+    fi
+
+    # Delete any leftover library objects.
+    if test "$build_old_libs" = yes; then
+      removelist="$obj $libobj"
+    else
+      removelist="$libobj"
+    fi
+
+    $run $rm $removelist
+    trap "$run $rm $removelist; exit 1" 1 2 15
+
+    # On Cygwin there's no "real" PIC flag so we must build both object types
+    case $host_os in
+    cygwin* | mingw* | pw32* | os2*)
+      pic_mode=default
+      ;;
+    esac
+    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+      # non-PIC code in shared libraries is not supported
+      pic_mode=default
+    fi
+
+    # Calculate the filename of the output object if compiler does
+    # not support -o with -c
+    if test "$compiler_c_o" = no; then
+      output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
+      lockfile="$output_obj.lock"
+      removelist="$removelist $output_obj $lockfile"
+      trap "$run $rm $removelist; exit 1" 1 2 15
+    else
+      need_locks=no
+      lockfile=
+    fi
+
+    # Lock this critical section if it is needed
+    # We use this script file to make the link, it avoids creating a new file
+    if test "$need_locks" = yes; then
+      until $run ln "$0" "$lockfile" 2>/dev/null; do
+       $show "Waiting for $lockfile to be removed"
+       sleep 2
+      done
+    elif test "$need_locks" = warn; then
+      if test -f "$lockfile"; then
+       echo "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+       $run $rm $removelist
+       exit 1
+      fi
+      echo $srcfile > "$lockfile"
+    fi
+
+    if test -n "$fix_srcfile_path"; then
+      eval srcfile=\"$fix_srcfile_path\"
+    fi
+
+    # Only build a PIC object if we are building libtool libraries.
+    if test "$build_libtool_libs" = yes; then
+      # Without this assignment, base_compile gets emptied.
+      fbsd_hideous_sh_bug=$base_compile
+
+      if test "$pic_mode" != no; then
+       # All platforms use -DPIC, to notify preprocessed assembler code.
+       command="$base_compile $srcfile $pic_flag -DPIC"
+      else
+       # Don't build PIC code
+       command="$base_compile $srcfile"
+      fi
+      if test "$build_old_libs" = yes; then
+       lo_libobj="$libobj"
+       dir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'`
+       if test "X$dir" = "X$libobj"; then
+         dir="$objdir"
+       else
+         dir="$dir/$objdir"
+       fi
+       libobj="$dir/"`$echo "X$libobj" | $Xsed -e 's%^.*/%%'`
+
+       if test -d "$dir"; then
+         $show "$rm $libobj"
+         $run $rm $libobj
+       else
+         $show "$mkdir $dir"
+         $run $mkdir $dir
+         status=$?
+         if test $status -ne 0 && test ! -d $dir; then
+           exit $status
+         fi
+       fi
+      fi
+      if test "$compiler_o_lo" = yes; then
+       output_obj="$libobj"
+       command="$command -o $output_obj"
+      elif test "$compiler_c_o" = yes; then
+       output_obj="$obj"
+       command="$command -o $output_obj"
+      fi
+
+      $run $rm "$output_obj"
+      $show "$command"
+      if $run eval "$command"; then :
+      else
+       test -n "$output_obj" && $run $rm $removelist
+       exit 1
+      fi
+
+      if test "$need_locks" = warn &&
+        test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then
+       echo "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+       $run $rm $removelist
+       exit 1
+      fi
+
+      # Just move the object if needed, then go on to compile the next one
+      if test x"$output_obj" != x"$libobj"; then
+       $show "$mv $output_obj $libobj"
+       if $run $mv $output_obj $libobj; then :
+       else
+         error=$?
+         $run $rm $removelist
+         exit $error
+       fi
+      fi
+
+      # If we have no pic_flag, then copy the object into place and finish.
+      if (test -z "$pic_flag" || test "$pic_mode" != default) &&
+        test "$build_old_libs" = yes; then
+       # Rename the .lo from within objdir to obj
+       if test -f $obj; then
+         $show $rm $obj
+         $run $rm $obj
+       fi
+
+       $show "$mv $libobj $obj"
+       if $run $mv $libobj $obj; then :
+       else
+         error=$?
+         $run $rm $removelist
+         exit $error
+       fi
+
+       xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
+       if test "X$xdir" = "X$obj"; then
+         xdir="."
+       else
+         xdir="$xdir"
+       fi
+       baseobj=`$echo "X$obj" | $Xsed -e "s%.*/%%"`
+       libobj=`$echo "X$baseobj" | $Xsed -e "$o2lo"`
+       # Now arrange that obj and lo_libobj become the same file
+       $show "(cd $xdir && $LN_S $baseobj $libobj)"
+       if $run eval '(cd $xdir && $LN_S $baseobj $libobj)'; then
+         exit 0
+       else
+         error=$?
+         $run $rm $removelist
+         exit $error
+       fi
+      fi
+
+      # Allow error messages only from the first compilation.
+      suppress_output=' >/dev/null 2>&1'
+    fi
+
+    # Only build a position-dependent object if we build old libraries.
+    if test "$build_old_libs" = yes; then
+      if test "$pic_mode" != yes; then
+       # Don't build PIC code
+       command="$base_compile $srcfile"
+      else
+       # All platforms use -DPIC, to notify preprocessed assembler code.
+       command="$base_compile $srcfile $pic_flag -DPIC"
+      fi
+      if test "$compiler_c_o" = yes; then
+       command="$command -o $obj"
+       output_obj="$obj"
+      fi
+
+      # Suppress compiler output if we already did a PIC compilation.
+      command="$command$suppress_output"
+      $run $rm "$output_obj"
+      $show "$command"
+      if $run eval "$command"; then :
+      else
+       $run $rm $removelist
+       exit 1
+      fi
+
+      if test "$need_locks" = warn &&
+        test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then
+       echo "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+       $run $rm $removelist
+       exit 1
+      fi
+
+      # Just move the object if needed
+      if test x"$output_obj" != x"$obj"; then
+       $show "$mv $output_obj $obj"
+       if $run $mv $output_obj $obj; then :
+       else
+         error=$?
+         $run $rm $removelist
+         exit $error
+       fi
+      fi
+
+      # Create an invalid libtool object if no PIC, so that we do not
+      # accidentally link it into a program.
+      if test "$build_libtool_libs" != yes; then
+       $show "echo timestamp > $libobj"
+       $run eval "echo timestamp > \$libobj" || exit $?
+      else
+       # Move the .lo from within objdir
+       $show "$mv $libobj $lo_libobj"
+       if $run $mv $libobj $lo_libobj; then :
+       else
+         error=$?
+         $run $rm $removelist
+         exit $error
+       fi
+      fi
+    fi
+
+    # Unlock the critical section if it was locked
+    if test "$need_locks" != no; then
+      $run $rm "$lockfile"
+    fi
+
+    exit 0
+    ;;
+
+  # libtool link mode
+  link | relink)
+    modename="$modename: link"
+    case $host in
+    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+      # It is impossible to link a dll without this setting, and
+      # we shouldn't force the makefile maintainer to figure out
+      # which system we are compiling for in order to pass an extra
+      # flag for every libtool invokation.
+      # allow_undefined=no
+
+      # FIXME: Unfortunately, there are problems with the above when trying
+      # to make a dll which has undefined symbols, in which case not
+      # even a static library is built.  For now, we need to specify
+      # -no-undefined on the libtool link line when we can be certain
+      # that all symbols are satisfied, otherwise we get a static library.
+      allow_undefined=yes
+      ;;
+    *)
+      allow_undefined=yes
+      ;;
+    esac
+    libtool_args="$nonopt"
+    compile_command="$nonopt"
+    finalize_command="$nonopt"
+
+    compile_rpath=
+    finalize_rpath=
+    compile_shlibpath=
+    finalize_shlibpath=
+    convenience=
+    old_convenience=
+    deplibs=
+    old_deplibs=
+    compiler_flags=
+    linker_flags=
+    dllsearchpath=
+    lib_search_path=`pwd`
+
+    avoid_version=no
+    dlfiles=
+    dlprefiles=
+    dlself=no
+    export_dynamic=no
+    export_symbols=
+    export_symbols_regex=
+    generated=
+    libobjs=
+    ltlibs=
+    module=no
+    no_install=no
+    objs=
+    prefer_static_libs=no
+    preload=no
+    prev=
+    prevarg=
+    release=
+    rpath=
+    xrpath=
+    perm_rpath=
+    temp_rpath=
+    thread_safe=no
+    vinfo=
+
+    # We need to know -static, to get the right output filenames.
+    for arg
+    do
+      case $arg in
+      -all-static | -static)
+       if test "X$arg" = "X-all-static"; then
+         if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+           $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2
+         fi
+         if test -n "$link_static_flag"; then
+           dlopen_self=$dlopen_self_static
+         fi
+       else
+         if test -z "$pic_flag" && test -n "$link_static_flag"; then
+           dlopen_self=$dlopen_self_static
+         fi
+       fi
+       build_libtool_libs=no
+       build_old_libs=yes
+       prefer_static_libs=yes
+       break
+       ;;
+      esac
+    done
+
+    # See if our shared archives depend on static archives.
+    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+    # Go through the arguments, transforming them on the way.
+    while test $# -gt 0; do
+      arg="$1"
+      shift
+      case $arg in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \    ]*|*]*|"")
+       qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test
+       ;;
+      *) qarg=$arg ;;
+      esac
+      libtool_args="$libtool_args $qarg"
+
+      # If the previous option needs an argument, assign it.
+      if test -n "$prev"; then
+       case $prev in
+       output)
+         compile_command="$compile_command @OUTPUT@"
+         finalize_command="$finalize_command @OUTPUT@"
+         ;;
+       esac
+
+       case $prev in
+       dlfiles|dlprefiles)
+         if test "$preload" = no; then
+           # Add the symbol object into the linking commands.
+           compile_command="$compile_command @SYMFILE@"
+           finalize_command="$finalize_command @SYMFILE@"
+           preload=yes
+         fi
+         case $arg in
+         *.la | *.lo) ;;  # We handle these cases below.
+         force)
+           if test "$dlself" = no; then
+             dlself=needless
+             export_dynamic=yes
+           fi
+           prev=
+           continue
+           ;;
+         self)
+           if test "$prev" = dlprefiles; then
+             dlself=yes
+           elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+             dlself=yes
+           else
+             dlself=needless
+             export_dynamic=yes
+           fi
+           prev=
+           continue
+           ;;
+         *)
+           if test "$prev" = dlfiles; then
+             dlfiles="$dlfiles $arg"
+           else
+             dlprefiles="$dlprefiles $arg"
+           fi
+           prev=
+           continue
+           ;;
+         esac
+         ;;
+       expsyms)
+         export_symbols="$arg"
+         if test ! -f "$arg"; then
+           $echo "$modename: symbol file \`$arg' does not exist"
+           exit 1
+         fi
+         prev=
+         continue
+         ;;
+       expsyms_regex)
+         export_symbols_regex="$arg"
+         prev=
+         continue
+         ;;
+       release)
+         release="-$arg"
+         prev=
+         continue
+         ;;
+       rpath | xrpath)
+         # We need an absolute path.
+         case $arg in
+         [\\/]* | [A-Za-z]:[\\/]*) ;;
+         *)
+           $echo "$modename: only absolute run-paths are allowed" 1>&2
+           exit 1
+           ;;
+         esac
+         if test "$prev" = rpath; then
+           case "$rpath " in
+           *" $arg "*) ;;
+           *) rpath="$rpath $arg" ;;
+           esac
+         else
+           case "$xrpath " in
+           *" $arg "*) ;;
+           *) xrpath="$xrpath $arg" ;;
+           esac
+         fi
+         prev=
+         continue
+         ;;
+       xcompiler)
+         compiler_flags="$compiler_flags $qarg"
+         prev=
+         compile_command="$compile_command $qarg"
+         finalize_command="$finalize_command $qarg"
+         continue
+         ;;
+       xlinker)
+         linker_flags="$linker_flags $qarg"
+         compiler_flags="$compiler_flags $wl$qarg"
+         prev=
+         compile_command="$compile_command $wl$qarg"
+         finalize_command="$finalize_command $wl$qarg"
+         continue
+         ;;
+       *)
+         eval "$prev=\"\$arg\""
+         prev=
+         continue
+         ;;
+       esac
+      fi # test -n $prev
+
+      prevarg="$arg"
+
+      case $arg in
+      -all-static)
+       if test -n "$link_static_flag"; then
+         compile_command="$compile_command $link_static_flag"
+         finalize_command="$finalize_command $link_static_flag"
+       fi
+       continue
+       ;;
+
+      -allow-undefined)
+       # FIXME: remove this flag sometime in the future.
+       $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2
+       continue
+       ;;
+
+      -avoid-version)
+       avoid_version=yes
+       continue
+       ;;
+
+      -dlopen)
+       prev=dlfiles
+       continue
+       ;;
+
+      -dlpreopen)
+       prev=dlprefiles
+       continue
+       ;;
+
+      -export-dynamic)
+       export_dynamic=yes
+       continue
+       ;;
+
+      -export-symbols | -export-symbols-regex)
+       if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+         $echo "$modename: more than one -exported-symbols argument is not allowed"
+         exit 1
+       fi
+       if test "X$arg" = "X-export-symbols"; then
+         prev=expsyms
+       else
+         prev=expsyms_regex
+       fi
+       continue
+       ;;
+
+      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+      # so, if we see these flags be careful not to treat them like -L
+      -L[A-Z][A-Z]*:*)
+       case $with_gcc/$host in
+       no/*-*-irix*)
+         compile_command="$compile_command $arg"
+         finalize_command="$finalize_command $arg"
+         ;;
+       esac
+       continue
+       ;;
+
+      -L*)
+       dir=`$echo "X$arg" | $Xsed -e 's/^-L//'`
+       # We need an absolute path.
+       case $dir in
+       [\\/]* | [A-Za-z]:[\\/]*) ;;
+       *)
+         absdir=`cd "$dir" && pwd`
+         if test -z "$absdir"; then
+           $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2
+           exit 1
+         fi
+         dir="$absdir"
+         ;;
+       esac
+       case "$deplibs " in
+       *" -L$dir "*) ;;
+       *)
+         deplibs="$deplibs -L$dir"
+         lib_search_path="$lib_search_path $dir"
+         ;;
+       esac
+       case $host in
+       *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+         case :$dllsearchpath: in
+         *":$dir:"*) ;;
+         *) dllsearchpath="$dllsearchpath:$dir";;
+         esac
+         ;;
+       esac
+       continue
+       ;;
+
+      -l*)
+       if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+         case $host in
+         *-*-cygwin* | *-*-pw32* | *-*-beos*)
+           # These systems don't actually have a C or math library (as such)
+           continue
+           ;;
+         *-*-mingw* | *-*-os2*)
+           # These systems don't actually have a C library (as such)
+           test "X$arg" = "X-lc" && continue
+           ;;
+         esac
+       fi
+       deplibs="$deplibs $arg"
+       continue
+       ;;
+
+      -module)
+       module=yes
+       continue
+       ;;
+
+      -no-fast-install)
+       fast_install=no
+       continue
+       ;;
+
+      -no-install)
+       case $host in
+       *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+         # The PATH hackery in wrapper scripts is required on Windows
+         # in order for the loader to find any dlls it needs.
+         $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2
+         $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2
+         fast_install=no
+         ;;
+       *) no_install=yes ;;
+       esac
+       continue
+       ;;
+
+      -no-undefined)
+       allow_undefined=no
+       continue
+       ;;
+
+      -o) prev=output ;;
+
+      -release)
+       prev=release
+       continue
+       ;;
+
+      -rpath)
+       prev=rpath
+       continue
+       ;;
+
+      -R)
+       prev=xrpath
+       continue
+       ;;
+
+      -R*)
+       dir=`$echo "X$arg" | $Xsed -e 's/^-R//'`
+       # We need an absolute path.
+       case $dir in
+       [\\/]* | [A-Za-z]:[\\/]*) ;;
+       *)
+         $echo "$modename: only absolute run-paths are allowed" 1>&2
+         exit 1
+         ;;
+       esac
+       case "$xrpath " in
+       *" $dir "*) ;;
+       *) xrpath="$xrpath $dir" ;;
+       esac
+       continue
+       ;;
+
+      -static)
+       # The effects of -static are defined in a previous loop.
+       # We used to do the same as -all-static on platforms that
+       # didn't have a PIC flag, but the assumption that the effects
+       # would be equivalent was wrong.  It would break on at least
+       # Digital Unix and AIX.
+       continue
+       ;;
+
+      -thread-safe)
+       thread_safe=yes
+       continue
+       ;;
+
+      -version-info)
+       prev=vinfo
+       continue
+       ;;
+
+      -Wc,*)
+       args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'`
+       arg=
+       IFS="${IFS=     }"; save_ifs="$IFS"; IFS=','
+       for flag in $args; do
+         IFS="$save_ifs"
+         case $flag in
+           *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \       ]*|*]*|"")
+           flag="\"$flag\""
+           ;;
+         esac
+         arg="$arg $wl$flag"
+         compiler_flags="$compiler_flags $flag"
+       done
+       IFS="$save_ifs"
+       arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+       ;;
+
+      -Wl,*)
+       args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'`
+       arg=
+       IFS="${IFS=     }"; save_ifs="$IFS"; IFS=','
+       for flag in $args; do
+         IFS="$save_ifs"
+         case $flag in
+           *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \       ]*|*]*|"")
+           flag="\"$flag\""
+           ;;
+         esac
+         arg="$arg $wl$flag"
+         compiler_flags="$compiler_flags $wl$flag"
+         linker_flags="$linker_flags $flag"
+       done
+       IFS="$save_ifs"
+       arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+       ;;
+
+      -Xcompiler)
+       prev=xcompiler
+       continue
+       ;;
+
+      -Xlinker)
+       prev=xlinker
+       continue
+       ;;
+
+      # Some other compiler flag.
+      -* | +*)
+       # Unknown arguments in both finalize_command and compile_command need
+       # to be aesthetically quoted because they are evaled later.
+       arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+       case $arg in
+       *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \   ]*|*]*|"")
+         arg="\"$arg\""
+         ;;
+       esac
+       ;;
+
+      *.lo | *.$objext)
+       # A library or standard object.
+       if test "$prev" = dlfiles; then
+         # This file was specified with -dlopen.
+         if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+           dlfiles="$dlfiles $arg"
+           prev=
+           continue
+         else
+           # If libtool objects are unsupported, then we need to preload.
+           prev=dlprefiles
+         fi
+       fi
+
+       if test "$prev" = dlprefiles; then
+         # Preload the old-style object.
+         dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"`
+         prev=
+       else
+         case $arg in
+         *.lo) libobjs="$libobjs $arg" ;;
+         *) objs="$objs $arg" ;;
+         esac
+       fi
+       ;;
+
+      *.$libext)
+       # An archive.
+       deplibs="$deplibs $arg"
+       old_deplibs="$old_deplibs $arg"
+       continue
+       ;;
+
+      *.la)
+       # A libtool-controlled library.
+
+       if test "$prev" = dlfiles; then
+         # This library was specified with -dlopen.
+         dlfiles="$dlfiles $arg"
+         prev=
+       elif test "$prev" = dlprefiles; then
+         # The library was specified with -dlpreopen.
+         dlprefiles="$dlprefiles $arg"
+         prev=
+       else
+         deplibs="$deplibs $arg"
+       fi
+       continue
+       ;;
+
+      # Some other compiler argument.
+      *)
+       # Unknown arguments in both finalize_command and compile_command need
+       # to be aesthetically quoted because they are evaled later.
+       arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+       case $arg in
+       *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \   ]*|*]*|"")
+         arg="\"$arg\""
+         ;;
+       esac
+       ;;
+      esac # arg
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+       compile_command="$compile_command $arg"
+       finalize_command="$finalize_command $arg"
+      fi
+    done # argument parsing loop
+
+    if test -n "$prev"; then
+      $echo "$modename: the \`$prevarg' option requires an argument" 1>&2
+      $echo "$help" 1>&2
+      exit 1
+    fi
+
+    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+      eval arg=\"$export_dynamic_flag_spec\"
+      compile_command="$compile_command $arg"
+      finalize_command="$finalize_command $arg"
+    fi
+
+    # calculate the name of the file, without its directory
+    outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'`
+    libobjs_save="$libobjs"
+
+    if test -n "$shlibpath_var"; then
+      # get the directories listed in $shlibpath_var
+      eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
+    else
+      shlib_search_path=
+    fi
+    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+    output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
+    if test "X$output_objdir" = "X$output"; then
+      output_objdir="$objdir"
+    else
+      output_objdir="$output_objdir/$objdir"
+    fi
+    # Create the object directory.
+    if test ! -d $output_objdir; then
+      $show "$mkdir $output_objdir"
+      $run $mkdir $output_objdir
+      status=$?
+      if test $status -ne 0 && test ! -d $output_objdir; then
+       exit $status
+      fi
+    fi
+
+    # Determine the type of output
+    case $output in
+    "")
+      $echo "$modename: you must specify an output file" 1>&2
+      $echo "$help" 1>&2
+      exit 1
+      ;;
+    *.$libext) linkmode=oldlib ;;
+    *.lo | *.$objext) linkmode=obj ;;
+    *.la) linkmode=lib ;;
+    *) linkmode=prog ;; # Anything else should be a program.
+    esac
+
+    specialdeplibs=
+    libs=
+    # Find all interdependent deplibs by searching for libraries
+    # that are linked more than once (e.g. -la -lb -la)
+    for deplib in $deplibs; do
+      case "$libs " in
+      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+      esac
+      libs="$libs $deplib"
+    done
+    deplibs=
+    newdependency_libs=
+    newlib_search_path=
+    need_relink=no # whether we're linking any uninstalled libtool libraries
+    notinst_deplibs= # not-installed libtool libraries
+    notinst_path= # paths that contain not-installed libtool libraries
+    case $linkmode in
+    lib)
+       passes="conv link"
+       for file in $dlfiles $dlprefiles; do
+         case $file in
+         *.la) ;;
+         *)
+           $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2
+           exit 1
+           ;;
+         esac
+       done
+       ;;
+    prog)
+       compile_deplibs=
+       finalize_deplibs=
+       alldeplibs=no
+       newdlfiles=
+       newdlprefiles=
+       passes="conv scan dlopen dlpreopen link"
+       ;;
+    *)  passes="conv"
+       ;;
+    esac
+    for pass in $passes; do
+      if test "$linkmode" = prog; then
+       # Determine which files to process
+       case $pass in
+       dlopen)
+         libs="$dlfiles"
+         save_deplibs="$deplibs" # Collect dlpreopened libraries
+         deplibs=
+         ;;
+       dlpreopen) libs="$dlprefiles" ;;
+       link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
+       esac
+      fi
+      for deplib in $libs; do
+       lib=
+       found=no
+       case $deplib in
+       -l*)
+         if test "$linkmode" = oldlib && test "$linkmode" = obj; then
+           $echo "$modename: warning: \`-l' is ignored for archives/objects: $deplib" 1>&2
+           continue
+         fi
+         if test "$pass" = conv; then
+           deplibs="$deplib $deplibs"
+           continue
+         fi
+         name=`$echo "X$deplib" | $Xsed -e 's/^-l//'`
+         for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do
+           # Search the libtool library
+           lib="$searchdir/lib${name}.la"
+           if test -f "$lib"; then
+             found=yes
+             break
+           fi
+         done
+         if test "$found" != yes; then
+           # deplib doesn't seem to be a libtool library
+           if test "$linkmode,$pass" = "prog,link"; then
+             compile_deplibs="$deplib $compile_deplibs"
+             finalize_deplibs="$deplib $finalize_deplibs"
+           else
+             deplibs="$deplib $deplibs"
+             test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+           fi
+           continue
+         fi
+         ;; # -l
+       -L*)
+         case $linkmode in
+         lib)
+           deplibs="$deplib $deplibs"
+           test "$pass" = conv && continue
+           newdependency_libs="$deplib $newdependency_libs"
+           newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+           ;;
+         prog)
+           if test "$pass" = conv; then
+             deplibs="$deplib $deplibs"
+             continue
+           fi
+           if test "$pass" = scan; then
+             deplibs="$deplib $deplibs"
+             newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+           else
+             compile_deplibs="$deplib $compile_deplibs"
+             finalize_deplibs="$deplib $finalize_deplibs"
+           fi
+           ;;
+         *)
+           $echo "$modename: warning: \`-L' is ignored for archives/objects: $deplib" 1>&2
+           ;;
+         esac # linkmode
+         continue
+         ;; # -L
+       -R*)
+         if test "$pass" = link; then
+           dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'`
+           # Make sure the xrpath contains only unique directories.
+           case "$xrpath " in
+           *" $dir "*) ;;
+           *) xrpath="$xrpath $dir" ;;
+           esac
+         fi
+         deplibs="$deplib $deplibs"
+         continue
+         ;;
+       *.la) lib="$deplib" ;;
+       *.$libext)
+         if test "$pass" = conv; then
+           deplibs="$deplib $deplibs"
+           continue
+         fi
+         case $linkmode in
+         lib)
+           if test "$deplibs_check_method" != pass_all; then
+             echo
+             echo "*** Warning: This library needs some functionality provided by $deplib."
+             echo "*** I have the capability to make that library automatically link in when"
+             echo "*** you link to this library.  But I can only do this if you have a"
+             echo "*** shared version of the library, which you do not appear to have."
+           else
+             echo
+             echo "*** Warning: Linking the shared library $output against the"
+             echo "*** static library $deplib is not portable!"
+             deplibs="$deplib $deplibs"
+           fi
+           continue
+           ;;
+         prog)
+           if test "$pass" != link; then
+             deplibs="$deplib $deplibs"
+           else
+             compile_deplibs="$deplib $compile_deplibs"
+             finalize_deplibs="$deplib $finalize_deplibs"
+           fi
+           continue
+           ;;
+         esac # linkmode
+         ;; # *.$libext
+       *.lo | *.$objext)
+         if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+           # If there is no dlopen support or we're linking statically,
+           # we need to preload.
+           newdlprefiles="$newdlprefiles $deplib"
+           compile_deplibs="$deplib $compile_deplibs"
+           finalize_deplibs="$deplib $finalize_deplibs"
+         else
+           newdlfiles="$newdlfiles $deplib"
+         fi
+         continue
+         ;;
+       %DEPLIBS%)
+         alldeplibs=yes
+         continue
+         ;;
+       esac # case $deplib
+       if test $found = yes || test -f "$lib"; then :
+       else
+         $echo "$modename: cannot find the library \`$lib'" 1>&2
+         exit 1
+       fi
+
+       # Check to see that this really is a libtool archive.
+       if (sed -e '2q' $lib | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+       else
+         $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+         exit 1
+       fi
+
+       ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
+       test "X$ladir" = "X$lib" && ladir="."
+
+       dlname=
+       dlopen=
+       dlpreopen=
+       libdir=
+       library_names=
+       old_library=
+       # If the library was installed with an old release of libtool,
+       # it will not redefine variable installed.
+       installed=yes
+
+       # Read the .la file
+       case $lib in
+       */* | *\\*) . $lib ;;
+       *) . ./$lib ;;
+       esac
+
+       if test "$linkmode,$pass" = "lib,link" ||
+          test "$linkmode,$pass" = "prog,scan" ||
+          { test "$linkmode" = oldlib && test "$linkmode" = obj; }; then
+          # Add dl[pre]opened files of deplib
+         test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
+         test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
+       fi
+
+       if test "$pass" = conv; then
+         # Only check for convenience libraries
+         deplibs="$lib $deplibs"
+         if test -z "$libdir"; then
+           if test -z "$old_library"; then
+             $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+             exit 1
+           fi
+           # It is a libtool convenience library, so add in its objects.
+           convenience="$convenience $ladir/$objdir/$old_library"
+           old_convenience="$old_convenience $ladir/$objdir/$old_library"
+           tmp_libs=
+           for deplib in $dependency_libs; do
+             deplibs="$deplib $deplibs"
+             case "$tmp_libs " in
+             *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+             esac
+             tmp_libs="$tmp_libs $deplib"
+           done
+         elif test "$linkmode" != prog && test "$linkmode" != lib; then
+           $echo "$modename: \`$lib' is not a convenience library" 1>&2
+           exit 1
+         fi
+         continue
+       fi # $pass = conv
+
+       # Get the name of the library we link against.
+       linklib=
+       for l in $old_library $library_names; do
+         linklib="$l"
+       done
+       if test -z "$linklib"; then
+         $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+         exit 1
+       fi
+
+       # This library was specified with -dlopen.
+       if test "$pass" = dlopen; then
+         if test -z "$libdir"; then
+           $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2
+           exit 1
+         fi
+         if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+           # If there is no dlname, no dlopen support or we're linking
+           # statically, we need to preload.
+           dlprefiles="$dlprefiles $lib"
+         else
+           newdlfiles="$newdlfiles $lib"
+         fi
+         continue
+       fi # $pass = dlopen
+
+       # We need an absolute path.
+       case $ladir in
+       [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+       *)
+         abs_ladir=`cd "$ladir" && pwd`
+         if test -z "$abs_ladir"; then
+           $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2
+           $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
+           abs_ladir="$ladir"
+         fi
+         ;;
+       esac
+       laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+
+       # Find the relevant object directory and library name.
+       if test "X$installed" = Xyes; then
+         if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+           $echo "$modename: warning: library \`$lib' was moved." 1>&2
+           dir="$ladir"
+           absdir="$abs_ladir"
+           libdir="$abs_ladir"
+         else
+           dir="$libdir"
+           absdir="$libdir"
+         fi
+       else
+         dir="$ladir/$objdir"
+         absdir="$abs_ladir/$objdir"
+         # Remove this search path later
+         notinst_path="$notinst_path $abs_ladir"
+       fi # $installed = yes
+       name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+
+       # This library was specified with -dlpreopen.
+       if test "$pass" = dlpreopen; then
+         if test -z "$libdir"; then
+           $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2
+           exit 1
+         fi
+         # Prefer using a static library (so that no silly _DYNAMIC symbols
+         # are required to link).
+         if test -n "$old_library"; then
+           newdlprefiles="$newdlprefiles $dir/$old_library"
+         # Otherwise, use the dlname, so that lt_dlopen finds it.
+         elif test -n "$dlname"; then
+           newdlprefiles="$newdlprefiles $dir/$dlname"
+         else
+           newdlprefiles="$newdlprefiles $dir/$linklib"
+         fi
+       fi # $pass = dlpreopen
+
+       if test -z "$libdir"; then
+         # Link the convenience library
+         if test "$linkmode" = lib; then
+           deplibs="$dir/$old_library $deplibs"
+         elif test "$linkmode,$pass" = "prog,link"; then
+           compile_deplibs="$dir/$old_library $compile_deplibs"
+           finalize_deplibs="$dir/$old_library $finalize_deplibs"
+         else
+           deplibs="$lib $deplibs"
+         fi
+         continue
+       fi
+
+       if test "$linkmode" = prog && test "$pass" != link; then
+         newlib_search_path="$newlib_search_path $ladir"
+         deplibs="$lib $deplibs"
+
+         linkalldeplibs=no
+         if test "$link_all_deplibs" != no || test -z "$library_names" ||
+            test "$build_libtool_libs" = no; then
+           linkalldeplibs=yes
+         fi
+
+         tmp_libs=
+         for deplib in $dependency_libs; do
+           case $deplib in
+           -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test
+           esac
+           # Need to link against all dependency_libs?
+           if test $linkalldeplibs = yes; then
+             deplibs="$deplib $deplibs"
+           else
+             # Need to hardcode shared library paths
+             # or/and link against static libraries
+             newdependency_libs="$deplib $newdependency_libs"
+           fi
+           case "$tmp_libs " in
+           *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+           esac
+           tmp_libs="$tmp_libs $deplib"
+         done # for deplib
+         continue
+       fi # $linkmode = prog...
+
+       link_static=no # Whether the deplib will be linked statically
+       if test -n "$library_names" &&
+          { test "$prefer_static_libs" = no || test -z "$old_library"; }; then
+         # Link against this shared library
+
+         if test "$linkmode,$pass" = "prog,link" ||
+          { test "$linkmode" = lib && test "$hardcode_into_libs" = yes; }; then
+           # Hardcode the library path.
+           # Skip directories that are in the system default run-time
+           # search path.
+           case " $sys_lib_dlsearch_path " in
+           *" $absdir "*) ;;
+           *)
+             case "$compile_rpath " in
+             *" $absdir "*) ;;
+             *) compile_rpath="$compile_rpath $absdir"
+             esac
+             ;;
+           esac
+           case " $sys_lib_dlsearch_path " in
+           *" $libdir "*) ;;
+           *)
+             case "$finalize_rpath " in
+             *" $libdir "*) ;;
+             *) finalize_rpath="$finalize_rpath $libdir"
+             esac
+             ;;
+           esac
+           if test "$linkmode" = prog; then
+             # We need to hardcode the library path
+             if test -n "$shlibpath_var"; then
+               # Make sure the rpath contains only unique directories.
+               case "$temp_rpath " in
+               *" $dir "*) ;;
+               *" $absdir "*) ;;
+               *) temp_rpath="$temp_rpath $dir" ;;
+               esac
+             fi
+           fi
+         fi # $linkmode,$pass = prog,link...
+
+         if test "$alldeplibs" = yes &&
+            { test "$deplibs_check_method" = pass_all ||
+              { test "$build_libtool_libs" = yes &&
+                test -n "$library_names"; }; }; then
+           # We only need to search for static libraries
+           continue
+         fi
+
+         if test "$installed" = no; then
+           notinst_deplibs="$notinst_deplibs $lib"
+           need_relink=yes
+         fi
+
+         if test -n "$old_archive_from_expsyms_cmds"; then
+           # figure out the soname
+           set dummy $library_names
+           realname="$2"
+           shift; shift
+           libname=`eval \\$echo \"$libname_spec\"`
+           # use dlname if we got it. it's perfectly good, no?
+           if test -n "$dlname"; then
+             soname="$dlname"
+           elif test -n "$soname_spec"; then
+             # bleh windows
+             case $host in
+             *cygwin*)
+               major=`expr $current - $age`
+               versuffix="-$major"
+               ;;
+             esac
+             eval soname=\"$soname_spec\"
+           else
+             soname="$realname"
+           fi
+
+           # Make a new name for the extract_expsyms_cmds to use
+           soroot="$soname"
+           soname=`echo $soroot | sed -e 's/^.*\///'`
+           newlib="libimp-`echo $soname | sed 's/^lib//;s/\.dll$//'`.a"
+
+           # If the library has no export list, then create one now
+           if test -f "$output_objdir/$soname-def"; then :
+           else
+             $show "extracting exported symbol list from \`$soname'"
+             IFS="${IFS=       }"; save_ifs="$IFS"; IFS='~'
+             eval cmds=\"$extract_expsyms_cmds\"
+             for cmd in $cmds; do
+               IFS="$save_ifs"
+               $show "$cmd"
+               $run eval "$cmd" || exit $?
+             done
+             IFS="$save_ifs"
+           fi
+
+           # Create $newlib
+           if test -f "$output_objdir/$newlib"; then :; else
+             $show "generating import library for \`$soname'"
+             IFS="${IFS=       }"; save_ifs="$IFS"; IFS='~'
+             eval cmds=\"$old_archive_from_expsyms_cmds\"
+             for cmd in $cmds; do
+               IFS="$save_ifs"
+               $show "$cmd"
+               $run eval "$cmd" || exit $?
+             done
+             IFS="$save_ifs"
+           fi
+           # make sure the library variables are pointing to the new library
+           dir=$output_objdir
+           linklib=$newlib
+         fi # test -n $old_archive_from_expsyms_cmds
+
+         if test "$linkmode" = prog || test "$mode" != relink; then
+           add_shlibpath=
+           add_dir=
+           add=
+           lib_linked=yes
+           case $hardcode_action in
+           immediate | unsupported)
+             if test "$hardcode_direct" = no; then
+               add="$dir/$linklib"
+             elif test "$hardcode_minus_L" = no; then
+               case $host in
+               *-*-sunos*) add_shlibpath="$dir" ;;
+               esac
+               add_dir="-L$dir"
+               add="-l$name"
+             elif test "$hardcode_shlibpath_var" = no; then
+               add_shlibpath="$dir"
+               add="-l$name"
+             else
+               lib_linked=no
+             fi
+             ;;
+           relink)
+             if test "$hardcode_direct" = yes; then
+               add="$dir/$linklib"
+             elif test "$hardcode_minus_L" = yes; then
+               add_dir="-L$dir"
+               add="-l$name"
+             elif test "$hardcode_shlibpath_var" = yes; then
+               add_shlibpath="$dir"
+               add="-l$name"
+             else
+               lib_linked=no
+             fi
+             ;;
+           *) lib_linked=no ;;
+           esac
+
+           if test "$lib_linked" != yes; then
+             $echo "$modename: configuration error: unsupported hardcode properties"
+             exit 1
+           fi
+
+           if test -n "$add_shlibpath"; then
+             case :$compile_shlibpath: in
+             *":$add_shlibpath:"*) ;;
+             *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
+             esac
+           fi
+           if test "$linkmode" = prog; then
+             test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+             test -n "$add" && compile_deplibs="$add $compile_deplibs"
+           else
+             test -n "$add_dir" && deplibs="$add_dir $deplibs"
+             test -n "$add" && deplibs="$add $deplibs"
+             if test "$hardcode_direct" != yes && \
+                test "$hardcode_minus_L" != yes && \
+                test "$hardcode_shlibpath_var" = yes; then
+               case :$finalize_shlibpath: in
+               *":$libdir:"*) ;;
+               *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+               esac
+             fi
+           fi
+         fi
+
+         if test "$linkmode" = prog || test "$mode" = relink; then
+           add_shlibpath=
+           add_dir=
+           add=
+           # Finalize command for both is simple: just hardcode it.
+           if test "$hardcode_direct" = yes; then
+             add="$libdir/$linklib"
+           elif test "$hardcode_minus_L" = yes; then
+             add_dir="-L$libdir"
+             add="-l$name"
+           elif test "$hardcode_shlibpath_var" = yes; then
+             case :$finalize_shlibpath: in
+             *":$libdir:"*) ;;
+             *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+             esac
+             add="-l$name"
+           else
+             # We cannot seem to hardcode it, guess we'll fake it.
+             add_dir="-L$libdir"
+             add="-l$name"
+           fi
+
+           if test "$linkmode" = prog; then
+             test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+             test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+           else
+             test -n "$add_dir" && deplibs="$add_dir $deplibs"
+             test -n "$add" && deplibs="$add $deplibs"
+           fi
+         fi
+       elif test "$linkmode" = prog; then
+         if test "$alldeplibs" = yes &&
+            { test "$deplibs_check_method" = pass_all ||
+              { test "$build_libtool_libs" = yes &&
+                test -n "$library_names"; }; }; then
+           # We only need to search for static libraries
+           continue
+         fi
+
+         # Try to link the static library
+         # Here we assume that one of hardcode_direct or hardcode_minus_L
+         # is not unsupported.  This is valid on all known static and
+         # shared platforms.
+         if test "$hardcode_direct" != unsupported; then
+           test -n "$old_library" && linklib="$old_library"
+           compile_deplibs="$dir/$linklib $compile_deplibs"
+           finalize_deplibs="$dir/$linklib $finalize_deplibs"
+         else
+           compile_deplibs="-l$name -L$dir $compile_deplibs"
+           finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+         fi
+       elif test "$build_libtool_libs" = yes; then
+         # Not a shared library
+         if test "$deplibs_check_method" != pass_all; then
+           # We're trying link a shared library against a static one
+           # but the system doesn't support it.
+
+           # Just print a warning and add the library to dependency_libs so
+           # that the program can be linked against the static library.
+           echo
+           echo "*** Warning: This library needs some functionality provided by $lib."
+           echo "*** I have the capability to make that library automatically link in when"
+           echo "*** you link to this library.  But I can only do this if you have a"
+           echo "*** shared version of the library, which you do not appear to have."
+           if test "$module" = yes; then
+             echo "*** Therefore, libtool will create a static module, that should work "
+             echo "*** as long as the dlopening application is linked with the -dlopen flag."
+             if test -z "$global_symbol_pipe"; then
+               echo
+               echo "*** However, this would only work if libtool was able to extract symbol"
+               echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+               echo "*** not find such a program.  So, this module is probably useless."
+               echo "*** \`nm' from GNU binutils and a full rebuild may help."
+             fi
+             if test "$build_old_libs" = no; then
+               build_libtool_libs=module
+               build_old_libs=yes
+             else
+               build_libtool_libs=no
+             fi
+           fi
+         else
+           convenience="$convenience $dir/$old_library"
+           old_convenience="$old_convenience $dir/$old_library"
+           deplibs="$dir/$old_library $deplibs"
+           link_static=yes
+         fi
+       fi # link shared/static library?
+
+       if test "$linkmode" = lib; then
+         if test -n "$dependency_libs" &&
+            { test "$hardcode_into_libs" != yes || test $build_old_libs = yes ||
+              test $link_static = yes; }; then
+           # Extract -R from dependency_libs
+           temp_deplibs=
+           for libdir in $dependency_libs; do
+             case $libdir in
+             -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'`
+                  case " $xrpath " in
+                  *" $temp_xrpath "*) ;;
+                  *) xrpath="$xrpath $temp_xrpath";;
+                  esac;;
+             *) temp_deplibs="$temp_deplibs $libdir";;
+             esac
+           done
+           dependency_libs="$temp_deplibs"
+         fi
+
+         newlib_search_path="$newlib_search_path $absdir"
+         # Link against this library
+         test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+         # ... and its dependency_libs
+         tmp_libs=
+         for deplib in $dependency_libs; do
+           newdependency_libs="$deplib $newdependency_libs"
+           case "$tmp_libs " in
+           *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+           esac
+           tmp_libs="$tmp_libs $deplib"
+         done
+
+         if test "$link_all_deplibs" != no; then
+           # Add the search paths of all dependency libraries
+           for deplib in $dependency_libs; do
+             case $deplib in
+             -L*) path="$deplib" ;;
+             *.la)
+               dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'`
+               test "X$dir" = "X$deplib" && dir="."
+               # We need an absolute path.
+               case $dir in
+               [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+               *)
+                 absdir=`cd "$dir" && pwd`
+                 if test -z "$absdir"; then
+                   $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
+                   absdir="$dir"
+                 fi
+                 ;;
+               esac
+               if grep "^installed=no" $deplib > /dev/null; then
+                 path="-L$absdir/$objdir"
+               else
+                 eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+                 if test -z "$libdir"; then
+                   $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+                   exit 1
+                 fi
+                 if test "$absdir" != "$libdir"; then
+                   $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2
+                 fi
+                 path="-L$absdir"
+               fi
+               ;;
+             *) continue ;;
+             esac
+             case " $deplibs " in
+             *" $path "*) ;;
+             *) deplibs="$deplibs $path" ;;
+             esac
+           done
+         fi # link_all_deplibs != no
+       fi # linkmode = lib
+      done # for deplib in $libs
+      if test "$pass" = dlpreopen; then
+       # Link the dlpreopened libraries before other libraries
+       for deplib in $save_deplibs; do
+         deplibs="$deplib $deplibs"
+       done
+      fi
+      if test "$pass" != dlopen; then
+       test "$pass" != scan && dependency_libs="$newdependency_libs"
+       if test "$pass" != conv; then
+         # Make sure lib_search_path contains only unique directories.
+         lib_search_path=
+         for dir in $newlib_search_path; do
+           case "$lib_search_path " in
+           *" $dir "*) ;;
+           *) lib_search_path="$lib_search_path $dir" ;;
+           esac
+         done
+         newlib_search_path=
+       fi
+
+       if test "$linkmode,$pass" != "prog,link"; then
+         vars="deplibs"
+       else
+         vars="compile_deplibs finalize_deplibs"
+       fi
+       for var in $vars dependency_libs; do
+         # Add libraries to $var in reverse order
+         eval tmp_libs=\"\$$var\"
+         new_libs=
+         for deplib in $tmp_libs; do
+           case $deplib in
+           -L*) new_libs="$deplib $new_libs" ;;
+           *)
+             case " $specialdeplibs " in
+             *" $deplib "*) new_libs="$deplib $new_libs" ;;
+             *)
+               case " $new_libs " in
+               *" $deplib "*) ;;
+               *) new_libs="$deplib $new_libs" ;;
+               esac
+               ;;
+             esac
+             ;;
+           esac
+         done
+         tmp_libs=
+         for deplib in $new_libs; do
+           case $deplib in
+           -L*)
+             case " $tmp_libs " in
+             *" $deplib "*) ;;
+             *) tmp_libs="$tmp_libs $deplib" ;;
+             esac
+             ;;
+           *) tmp_libs="$tmp_libs $deplib" ;;
+           esac
+         done
+         eval $var=\"$tmp_libs\"
+       done # for var
+      fi
+      if test "$pass" = "conv" &&
+       { test "$linkmode" = "lib" || test "$linkmode" = "prog"; }; then
+       libs="$deplibs" # reset libs
+       deplibs=
+      fi
+    done # for pass
+    if test "$linkmode" = prog; then
+      dlfiles="$newdlfiles"
+      dlprefiles="$newdlprefiles"
+    fi
+
+    case $linkmode in
+    oldlib)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+       $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$rpath"; then
+       $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$xrpath"; then
+       $echo "$modename: warning: \`-R' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$vinfo"; then
+       $echo "$modename: warning: \`-version-info' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$release"; then
+       $echo "$modename: warning: \`-release' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+       $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2
+      fi
+
+      # Now set the variables for building old libraries.
+      build_libtool_libs=no
+      oldlibs="$output"
+      objs="$objs$old_deplibs"
+      ;;
+
+    lib)
+      # Make sure we only generate libraries of the form `libNAME.la'.
+      case $outputname in
+      lib*)
+       name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+       eval libname=\"$libname_spec\"
+       ;;
+      *)
+       if test "$module" = no; then
+         $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2
+         $echo "$help" 1>&2
+         exit 1
+       fi
+       if test "$need_lib_prefix" != no; then
+         # Add the "lib" prefix for modules if required
+         name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+         eval libname=\"$libname_spec\"
+       else
+         libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+       fi
+       ;;
+      esac
+
+      if test -n "$objs"; then
+       if test "$deplibs_check_method" != pass_all; then
+         $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1
+         exit 1
+       else
+         echo
+         echo "*** Warning: Linking the shared library $output against the non-libtool"
+         echo "*** objects $objs is not portable!"
+         libobjs="$libobjs $objs"
+       fi
+      fi
+
+      if test "$dlself" != no; then
+       $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2
+      fi
+
+      set dummy $rpath
+      if test $# -gt 2; then
+       $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2
+      fi
+      install_libdir="$2"
+
+      oldlibs=
+      if test -z "$rpath"; then
+       if test "$build_libtool_libs" = yes; then
+         # Building a libtool convenience library.
+         libext=al
+         oldlibs="$output_objdir/$libname.$libext $oldlibs"
+         build_libtool_libs=convenience
+         build_old_libs=yes
+       fi
+
+       if test -n "$vinfo"; then
+         $echo "$modename: warning: \`-version-info' is ignored for convenience libraries" 1>&2
+       fi
+
+       if test -n "$release"; then
+         $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2
+       fi
+      else
+
+       # Parse the version information argument.
+       IFS="${IFS=     }"; save_ifs="$IFS"; IFS=':'
+       set dummy $vinfo 0 0 0
+       IFS="$save_ifs"
+
+       if test -n "$8"; then
+         $echo "$modename: too many parameters to \`-version-info'" 1>&2
+         $echo "$help" 1>&2
+         exit 1
+       fi
+
+       current="$2"
+       revision="$3"
+       age="$4"
+
+       # Check that each of the things are valid numbers.
+       case $current in
+       0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;;
+       *)
+         $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2
+         $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+         exit 1
+         ;;
+       esac
+
+       case $revision in
+       0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;;
+       *)
+         $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2
+         $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+         exit 1
+         ;;
+       esac
+
+       case $age in
+       0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;;
+       *)
+         $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2
+         $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+         exit 1
+         ;;
+       esac
+
+       if test $age -gt $current; then
+         $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2
+         $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+         exit 1
+       fi
+
+       # Calculate the version variables.
+       major=
+       versuffix=
+       verstring=
+       case $version_type in
+       none) ;;
+
+       darwin)
+         # Like Linux, but with the current version available in
+         # verstring for coding it into the library header
+         major=.`expr $current - $age`
+         versuffix="$major.$age.$revision"
+         # Darwin ld doesn't like 0 for these options...
+         minor_current=`expr $current + 1`
+         verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+         ;;
+
+       freebsd-aout)
+         major=".$current"
+         versuffix=".$current.$revision";
+         ;;
+
+       freebsd-elf)
+         major=".$current"
+         versuffix=".$current";
+         ;;
+
+       irix)
+         major=`expr $current - $age + 1`
+         verstring="sgi$major.$revision"
+
+         # Add in all the interfaces that we are compatible with.
+         loop=$revision
+         while test $loop != 0; do
+           iface=`expr $revision - $loop`
+           loop=`expr $loop - 1`
+           verstring="sgi$major.$iface:$verstring"
+         done
+
+         # Before this point, $major must not contain `.'.
+         major=.$major
+         versuffix="$major.$revision"
+         ;;
+
+       linux)
+         major=.`expr $current - $age`
+         versuffix="$major.$age.$revision"
+         ;;
+
+       osf)
+         major=`expr $current - $age`
+         versuffix=".$current.$age.$revision"
+         verstring="$current.$age.$revision"
+
+         # Add in all the interfaces that we are compatible with.
+         loop=$age
+         while test $loop != 0; do
+           iface=`expr $current - $loop`
+           loop=`expr $loop - 1`
+           verstring="$verstring:${iface}.0"
+         done
+
+         # Make executables depend on our current version.
+         verstring="$verstring:${current}.0"
+         ;;
+
+       sunos)
+         major=".$current"
+         versuffix=".$current.$revision"
+         ;;
+
+       windows)
+         # Use '-' rather than '.', since we only want one
+         # extension on DOS 8.3 filesystems.
+         major=`expr $current - $age`
+         versuffix="-$major"
+         ;;
+
+       *)
+         $echo "$modename: unknown library version type \`$version_type'" 1>&2
+         echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
+         exit 1
+         ;;
+       esac
+
+       # Clear the version info if we defaulted, and they specified a release.
+       if test -z "$vinfo" && test -n "$release"; then
+         major=
+         verstring="0.0"
+         if test "$need_version" = no; then
+           versuffix=
+         else
+           versuffix=".0.0"
+         fi
+       fi
+
+       # Remove version info from name if versioning should be avoided
+       if test "$avoid_version" = yes && test "$need_version" = no; then
+         major=
+         versuffix=
+         verstring=""
+       fi
+
+       # Check to see if the archive will have undefined symbols.
+       if test "$allow_undefined" = yes; then
+         if test "$allow_undefined_flag" = unsupported; then
+           $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2
+           build_libtool_libs=no
+           build_old_libs=yes
+         fi
+       else
+         # Don't allow undefined symbols.
+         allow_undefined_flag="$no_undefined_flag"
+       fi
+      fi
+
+      if test "$mode" != relink; then
+       # Remove our outputs.
+       $show "${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*"
+       $run ${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*
+      fi
+
+      # Now set the variables for building old libraries.
+      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+       oldlibs="$oldlibs $output_objdir/$libname.$libext"
+
+       # Transform .lo files to .o files.
+       oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
+      fi
+
+      # Eliminate all temporary directories.
+      for path in $notinst_path; do
+       lib_search_path=`echo "$lib_search_path " | sed -e 's% $path % %g'`
+       deplibs=`echo "$deplibs " | sed -e 's% -L$path % %g'`
+       dependency_libs=`echo "$dependency_libs " | sed -e 's% -L$path % %g'`
+      done
+
+      if test -n "$xrpath"; then
+       # If the user specified any rpath flags, then add them.
+       temp_xrpath=
+       for libdir in $xrpath; do
+         temp_xrpath="$temp_xrpath -R$libdir"
+         case "$finalize_rpath " in
+         *" $libdir "*) ;;
+         *) finalize_rpath="$finalize_rpath $libdir" ;;
+         esac
+       done
+       if test $hardcode_into_libs != yes || test $build_old_libs = yes; then
+         dependency_libs="$temp_xrpath $dependency_libs"
+       fi
+      fi
+
+      # Make sure dlfiles contains only unique files that won't be dlpreopened
+      old_dlfiles="$dlfiles"
+      dlfiles=
+      for lib in $old_dlfiles; do
+       case " $dlprefiles $dlfiles " in
+       *" $lib "*) ;;
+       *) dlfiles="$dlfiles $lib" ;;
+       esac
+      done
+
+      # Make sure dlprefiles contains only unique files
+      old_dlprefiles="$dlprefiles"
+      dlprefiles=
+      for lib in $old_dlprefiles; do
+       case "$dlprefiles " in
+       *" $lib "*) ;;
+       *) dlprefiles="$dlprefiles $lib" ;;
+       esac
+      done
+
+      if test "$build_libtool_libs" = yes; then
+       if test -n "$rpath"; then
+         case $host in
+         *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*)
+           # these systems don't actually have a c library (as such)!
+           ;;
+         *-*-rhapsody* | *-*-darwin1.[012])
+           # Rhapsody C library is in the System framework
+           deplibs="$deplibs -framework System"
+           ;;
+         *-*-netbsd*)
+           # Don't link with libc until the a.out ld.so is fixed.
+           ;;
+         *)
+           # Add libc to deplibs on all other systems if necessary.
+           if test "$build_libtool_need_lc" = "yes"; then
+             deplibs="$deplibs -lc"
+           fi
+           ;;
+         esac
+       fi
+
+       # Transform deplibs into only deplibs that can be linked in shared.
+       name_save=$name
+       libname_save=$libname
+       release_save=$release
+       versuffix_save=$versuffix
+       major_save=$major
+       # I'm not sure if I'm treating the release correctly.  I think
+       # release should show up in the -l (ie -lgmp5) so we don't want to
+       # add it in twice.  Is that correct?
+       release=""
+       versuffix=""
+       major=""
+       newdeplibs=
+       droppeddeps=no
+       case $deplibs_check_method in
+       pass_all)
+         # Don't check for shared/static.  Everything works.
+         # This might be a little naive.  We might want to check
+         # whether the library exists or not.  But this is on
+         # osf3 & osf4 and I'm not really sure... Just
+         # implementing what was already the behaviour.
+         newdeplibs=$deplibs
+         ;;
+       test_compile)
+         # This code stresses the "libraries are programs" paradigm to its
+         # limits. Maybe even breaks it.  We compile a program, linking it
+         # against the deplibs as a proxy for the library.  Then we can check
+         # whether they linked in statically or dynamically with ldd.
+         $rm conftest.c
+         cat > conftest.c <<EOF
+         int main() { return 0; }
+EOF
+         $rm conftest
+         $CC -o conftest conftest.c $deplibs
+         if test $? -eq 0 ; then
+           ldd_output=`ldd conftest`
+           for i in $deplibs; do
+             name="`expr $i : '-l\(.*\)'`"
+             # If $name is empty we are operating on a -L argument.
+             if test -n "$name" && test "$name" != "0"; then
+               libname=`eval \\$echo \"$libname_spec\"`
+               deplib_matches=`eval \\$echo \"$library_names_spec\"`
+               set dummy $deplib_matches
+               deplib_match=$2
+               if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+                 newdeplibs="$newdeplibs $i"
+               else
+                 droppeddeps=yes
+                 echo
+                 echo "*** Warning: This library needs some functionality provided by $i."
+                 echo "*** I have the capability to make that library automatically link in when"
+                 echo "*** you link to this library.  But I can only do this if you have a"
+                 echo "*** shared version of the library, which you do not appear to have."
+               fi
+             else
+               newdeplibs="$newdeplibs $i"
+             fi
+           done
+         else
+           # Error occured in the first compile.  Let's try to salvage the situation:
+           # Compile a seperate program for each library.
+           for i in $deplibs; do
+             name="`expr $i : '-l\(.*\)'`"
+            # If $name is empty we are operating on a -L argument.
+             if test -n "$name" && test "$name" != "0"; then
+               $rm conftest
+               $CC -o conftest conftest.c $i
+               # Did it work?
+               if test $? -eq 0 ; then
+                 ldd_output=`ldd conftest`
+                 libname=`eval \\$echo \"$libname_spec\"`
+                 deplib_matches=`eval \\$echo \"$library_names_spec\"`
+                 set dummy $deplib_matches
+                 deplib_match=$2
+                 if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+                   newdeplibs="$newdeplibs $i"
+                 else
+                   droppeddeps=yes
+                   echo
+                   echo "*** Warning: This library needs some functionality provided by $i."
+                   echo "*** I have the capability to make that library automatically link in when"
+                   echo "*** you link to this library.  But I can only do this if you have a"
+                   echo "*** shared version of the library, which you do not appear to have."
+                 fi
+               else
+                 droppeddeps=yes
+                 echo
+                 echo "*** Warning!  Library $i is needed by this library but I was not able to"
+                 echo "***  make it link in!  You will probably need to install it or some"
+                 echo "*** library that it depends on before this library will be fully"
+                 echo "*** functional.  Installing it before continuing would be even better."
+               fi
+             else
+               newdeplibs="$newdeplibs $i"
+             fi
+           done
+         fi
+         ;;
+       file_magic*)
+         set dummy $deplibs_check_method
+         file_magic_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+         for a_deplib in $deplibs; do
+           name="`expr $a_deplib : '-l\(.*\)'`"
+           # If $name is empty we are operating on a -L argument.
+           if test -n "$name" && test "$name" != "0"; then
+             libname=`eval \\$echo \"$libname_spec\"`
+             for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+                   potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+                   for potent_lib in $potential_libs; do
+                     # Follow soft links.
+                     if ls -lLd "$potent_lib" 2>/dev/null \
+                        | grep " -> " >/dev/null; then
+                       continue
+                     fi
+                     # The statement above tries to avoid entering an
+                     # endless loop below, in case of cyclic links.
+                     # We might still enter an endless loop, since a link
+                     # loop can be closed while we follow links,
+                     # but so what?
+                     potlib="$potent_lib"
+                     while test -h "$potlib" 2>/dev/null; do
+                       potliblink=`ls -ld $potlib | sed 's/.* -> //'`
+                       case $potliblink in
+                       [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+                       *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
+                       esac
+                     done
+                     if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \
+                        | sed 10q \
+                        | egrep "$file_magic_regex" > /dev/null; then
+                       newdeplibs="$newdeplibs $a_deplib"
+                       a_deplib=""
+                       break 2
+                     fi
+                   done
+             done
+             if test -n "$a_deplib" ; then
+               droppeddeps=yes
+               echo
+               echo "*** Warning: This library needs some functionality provided by $a_deplib."
+               echo "*** I have the capability to make that library automatically link in when"
+               echo "*** you link to this library.  But I can only do this if you have a"
+               echo "*** shared version of the library, which you do not appear to have."
+             fi
+           else
+             # Add a -L argument.
+             newdeplibs="$newdeplibs $a_deplib"
+           fi
+         done # Gone through all deplibs.
+         ;;
+       match_pattern*)
+         set dummy $deplibs_check_method
+         match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+         for a_deplib in $deplibs; do
+           name="`expr $a_deplib : '-l\(.*\)'`"
+           # If $name is empty we are operating on a -L argument.
+           if test -n "$name" && test "$name" != "0"; then
+             libname=`eval \\$echo \"$libname_spec\"`
+             for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+               potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+               for potent_lib in $potential_libs; do
+                 if eval echo \"$potent_lib\" 2>/dev/null \
+                     | sed 10q \
+                     | egrep "$match_pattern_regex" > /dev/null; then
+                   newdeplibs="$newdeplibs $a_deplib"
+                   a_deplib=""
+                   break 2
+                 fi
+               done
+             done
+             if test -n "$a_deplib" ; then
+               droppeddeps=yes
+               echo
+               echo "*** Warning: This library needs some functionality provided by $a_deplib."
+               echo "*** I have the capability to make that library automatically link in when"
+               echo "*** you link to this library.  But I can only do this if you have a"
+               echo "*** shared version of the library, which you do not appear to have."
+             fi
+           else
+             # Add a -L argument.
+             newdeplibs="$newdeplibs $a_deplib"
+           fi
+         done # Gone through all deplibs.
+         ;;
+       none | unknown | *)
+         newdeplibs=""
+         if $echo "X $deplibs" | $Xsed -e 's/ -lc$//' \
+              -e 's/ -[LR][^ ]*//g' -e 's/[    ]//g' |
+            grep . >/dev/null; then
+           echo
+           if test "X$deplibs_check_method" = "Xnone"; then
+             echo "*** Warning: inter-library dependencies are not supported in this platform."
+           else
+             echo "*** Warning: inter-library dependencies are not known to be supported."
+           fi
+           echo "*** All declared inter-library dependencies are being dropped."
+           droppeddeps=yes
+         fi
+         ;;
+       esac
+       versuffix=$versuffix_save
+       major=$major_save
+       release=$release_save
+       libname=$libname_save
+       name=$name_save
+
+       case $host in
+       *-*-rhapsody* | *-*-darwin1.[012])
+         # On Rhapsody replace the C library is the System framework
+         newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'`
+         ;;
+       esac
+
+       if test "$droppeddeps" = yes; then
+         if test "$module" = yes; then
+           echo
+           echo "*** Warning: libtool could not satisfy all declared inter-library"
+           echo "*** dependencies of module $libname.  Therefore, libtool will create"
+           echo "*** a static module, that should work as long as the dlopening"
+           echo "*** application is linked with the -dlopen flag."
+           if test -z "$global_symbol_pipe"; then
+             echo
+             echo "*** However, this would only work if libtool was able to extract symbol"
+             echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+             echo "*** not find such a program.  So, this module is probably useless."
+             echo "*** \`nm' from GNU binutils and a full rebuild may help."
+           fi
+           if test "$build_old_libs" = no; then
+             oldlibs="$output_objdir/$libname.$libext"
+             build_libtool_libs=module
+             build_old_libs=yes
+           else
+             build_libtool_libs=no
+           fi
+         else
+           echo "*** The inter-library dependencies that have been dropped here will be"
+           echo "*** automatically added whenever a program is linked with this library"
+           echo "*** or is declared to -dlopen it."
+
+           if test $allow_undefined = no; then
+             echo
+             echo "*** Since this library must not contain undefined symbols,"
+             echo "*** because either the platform does not support them or"
+             echo "*** it was explicitly requested with -no-undefined,"
+             echo "*** libtool will only create a static version of it."
+             if test "$build_old_libs" = no; then
+               oldlibs="$output_objdir/$libname.$libext"
+               build_libtool_libs=module
+               build_old_libs=yes
+             else
+               build_libtool_libs=no
+             fi
+           fi
+         fi
+       fi
+       # Done checking deplibs!
+       deplibs=$newdeplibs
+      fi
+
+      # All the library-specific variables (install_libdir is set above).
+      library_names=
+      old_library=
+      dlname=
+
+      # Test again, we may have decided not to build it any more
+      if test "$build_libtool_libs" = yes; then
+       if test "$hardcode_into_libs" = yes; then
+         # Hardcode the library paths
+         hardcode_libdirs=
+         dep_rpath=
+         rpath="$finalize_rpath"
+         test "$mode" != relink && rpath="$compile_rpath$rpath"
+         for libdir in $rpath; do
+           if test -n "$hardcode_libdir_flag_spec"; then
+             if test -n "$hardcode_libdir_separator"; then
+               if test -z "$hardcode_libdirs"; then
+                 hardcode_libdirs="$libdir"
+               else
+                 # Just accumulate the unique libdirs.
+                 case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+                 *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+                   ;;
+                 *)
+                   hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+                   ;;
+                 esac
+               fi
+             else
+               eval flag=\"$hardcode_libdir_flag_spec\"
+               dep_rpath="$dep_rpath $flag"
+             fi
+           elif test -n "$runpath_var"; then
+             case "$perm_rpath " in
+             *" $libdir "*) ;;
+             *) perm_rpath="$perm_rpath $libdir" ;;
+             esac
+           fi
+         done
+         # Substitute the hardcoded libdirs into the rpath.
+         if test -n "$hardcode_libdir_separator" &&
+            test -n "$hardcode_libdirs"; then
+           libdir="$hardcode_libdirs"
+           eval dep_rpath=\"$hardcode_libdir_flag_spec\"
+         fi
+         if test -n "$runpath_var" && test -n "$perm_rpath"; then
+           # We should set the runpath_var.
+           rpath=
+           for dir in $perm_rpath; do
+             rpath="$rpath$dir:"
+           done
+           eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+         fi
+         test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+       fi
+
+       shlibpath="$finalize_shlibpath"
+       test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+       if test -n "$shlibpath"; then
+         eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+       fi
+
+       # Get the real and link names of the library.
+       eval library_names=\"$library_names_spec\"
+       set dummy $library_names
+       realname="$2"
+       shift; shift
+
+       if test -n "$soname_spec"; then
+         eval soname=\"$soname_spec\"
+       else
+         soname="$realname"
+       fi
+       test -z "$dlname" && dlname=$soname
+
+       lib="$output_objdir/$realname"
+       for link
+       do
+         linknames="$linknames $link"
+       done
+
+       # Ensure that we have .o objects for linkers which dislike .lo
+       # (e.g. aix) in case we are running --disable-static
+       for obj in $libobjs; do
+         xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
+         if test "X$xdir" = "X$obj"; then
+           xdir="."
+         else
+           xdir="$xdir"
+         fi
+         baseobj=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
+         oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"`
+         if test ! -f $xdir/$oldobj; then
+           $show "(cd $xdir && ${LN_S} $baseobj $oldobj)"
+           $run eval '(cd $xdir && ${LN_S} $baseobj $oldobj)' || exit $?
+         fi
+       done
+
+       # Use standard objects if they are pic
+       test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+
+       # Prepare the list of exported symbols
+       if test -z "$export_symbols"; then
+         if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+           $show "generating symbol list for \`$libname.la'"
+           export_symbols="$output_objdir/$libname.exp"
+           $run $rm $export_symbols
+           eval cmds=\"$export_symbols_cmds\"
+           IFS="${IFS=         }"; save_ifs="$IFS"; IFS='~'
+           for cmd in $cmds; do
+             IFS="$save_ifs"
+             $show "$cmd"
+             $run eval "$cmd" || exit $?
+           done
+           IFS="$save_ifs"
+           if test -n "$export_symbols_regex"; then
+             $show "egrep -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\""
+             $run eval 'egrep -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+             $show "$mv \"${export_symbols}T\" \"$export_symbols\""
+             $run eval '$mv "${export_symbols}T" "$export_symbols"'
+           fi
+         fi
+       fi
+
+       if test -n "$export_symbols" && test -n "$include_expsyms"; then
+         $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"'
+       fi
+
+       if test -n "$convenience"; then
+         if test -n "$whole_archive_flag_spec"; then
+           eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+         else
+           gentop="$output_objdir/${outputname}x"
+           $show "${rm}r $gentop"
+           $run ${rm}r "$gentop"
+           $show "mkdir $gentop"
+           $run mkdir "$gentop"
+           status=$?
+           if test $status -ne 0 && test ! -d "$gentop"; then
+             exit $status
+           fi
+           generated="$generated $gentop"
+
+           for xlib in $convenience; do
+             # Extract the objects.
+             case $xlib in
+             [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
+             *) xabs=`pwd`"/$xlib" ;;
+             esac
+             xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
+             xdir="$gentop/$xlib"
+
+             $show "${rm}r $xdir"
+             $run ${rm}r "$xdir"
+             $show "mkdir $xdir"
+             $run mkdir "$xdir"
+             status=$?
+             if test $status -ne 0 && test ! -d "$xdir"; then
+               exit $status
+             fi
+             $show "(cd $xdir && $AR x $xabs)"
+             $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
+
+             libobjs="$libobjs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP`
+           done
+         fi
+       fi
+
+       if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+         eval flag=\"$thread_safe_flag_spec\"
+         linker_flags="$linker_flags $flag"
+       fi
+
+       # Make a backup of the uninstalled library when relinking
+       if test "$mode" = relink; then
+         $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $?
+       fi
+
+       # Do each of the archive commands.
+       if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+         eval cmds=\"$archive_expsym_cmds\"
+       else
+         eval cmds=\"$archive_cmds\"
+       fi
+       IFS="${IFS=     }"; save_ifs="$IFS"; IFS='~'
+       for cmd in $cmds; do
+         IFS="$save_ifs"
+         $show "$cmd"
+         $run eval "$cmd" || exit $?
+       done
+       IFS="$save_ifs"
+
+       # Restore the uninstalled library and exit
+       if test "$mode" = relink; then
+         $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $?
+         exit 0
+       fi
+
+       # Create links to the real library.
+       for linkname in $linknames; do
+         if test "$realname" != "$linkname"; then
+           $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)"
+           $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $?
+         fi
+       done
+
+       # If -module or -export-dynamic was specified, set the dlname.
+       if test "$module" = yes || test "$export_dynamic" = yes; then
+         # On all known operating systems, these are identical.
+         dlname="$soname"
+       fi
+      fi
+      ;;
+
+    obj)
+      if test -n "$deplibs"; then
+       $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2
+      fi
+
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+       $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$rpath"; then
+       $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$xrpath"; then
+       $echo "$modename: warning: \`-R' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$vinfo"; then
+       $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$release"; then
+       $echo "$modename: warning: \`-release' is ignored for objects" 1>&2
+      fi
+
+      case $output in
+      *.lo)
+       if test -n "$objs$old_deplibs"; then
+         $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2
+         exit 1
+       fi
+       libobj="$output"
+       obj=`$echo "X$output" | $Xsed -e "$lo2o"`
+       ;;
+      *)
+       libobj=
+       obj="$output"
+       ;;
+      esac
+
+      # Delete the old objects.
+      $run $rm $obj $libobj
+
+      # Objects from convenience libraries.  This assumes
+      # single-version convenience libraries.  Whenever we create
+      # different ones for PIC/non-PIC, this we'll have to duplicate
+      # the extraction.
+      reload_conv_objs=
+      gentop=
+      # reload_cmds runs $LD directly, so let us get rid of
+      # -Wl from whole_archive_flag_spec
+      wl=
+
+      if test -n "$convenience"; then
+       if test -n "$whole_archive_flag_spec"; then
+         eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\"
+       else
+         gentop="$output_objdir/${obj}x"
+         $show "${rm}r $gentop"
+         $run ${rm}r "$gentop"
+         $show "mkdir $gentop"
+         $run mkdir "$gentop"
+         status=$?
+         if test $status -ne 0 && test ! -d "$gentop"; then
+           exit $status
+         fi
+         generated="$generated $gentop"
+
+         for xlib in $convenience; do
+           # Extract the objects.
+           case $xlib in
+           [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
+           *) xabs=`pwd`"/$xlib" ;;
+           esac
+           xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
+           xdir="$gentop/$xlib"
+
+           $show "${rm}r $xdir"
+           $run ${rm}r "$xdir"
+           $show "mkdir $xdir"
+           $run mkdir "$xdir"
+           status=$?
+           if test $status -ne 0 && test ! -d "$xdir"; then
+             exit $status
+           fi
+           $show "(cd $xdir && $AR x $xabs)"
+           $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
+
+           reload_conv_objs="$reload_objs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP`
+         done
+       fi
+      fi
+
+      # Create the old-style object.
+      reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+      output="$obj"
+      eval cmds=\"$reload_cmds\"
+      IFS="${IFS=      }"; save_ifs="$IFS"; IFS='~'
+      for cmd in $cmds; do
+       IFS="$save_ifs"
+       $show "$cmd"
+       $run eval "$cmd" || exit $?
+      done
+      IFS="$save_ifs"
+
+      # Exit if we aren't doing a library object file.
+      if test -z "$libobj"; then
+       if test -n "$gentop"; then
+         $show "${rm}r $gentop"
+         $run ${rm}r $gentop
+       fi
+
+       exit 0
+      fi
+
+      if test "$build_libtool_libs" != yes; then
+       if test -n "$gentop"; then
+         $show "${rm}r $gentop"
+         $run ${rm}r $gentop
+       fi
+
+       # Create an invalid libtool object if no PIC, so that we don't
+       # accidentally link it into a program.
+       $show "echo timestamp > $libobj"
+       $run eval "echo timestamp > $libobj" || exit $?
+       exit 0
+      fi
+
+      if test -n "$pic_flag" || test "$pic_mode" != default; then
+       # Only do commands if we really have different PIC objects.
+       reload_objs="$libobjs $reload_conv_objs"
+       output="$libobj"
+       eval cmds=\"$reload_cmds\"
+       IFS="${IFS=     }"; save_ifs="$IFS"; IFS='~'
+       for cmd in $cmds; do
+         IFS="$save_ifs"
+         $show "$cmd"
+         $run eval "$cmd" || exit $?
+       done
+       IFS="$save_ifs"
+      else
+       # Just create a symlink.
+       $show $rm $libobj
+       $run $rm $libobj
+       xdir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'`
+       if test "X$xdir" = "X$libobj"; then
+         xdir="."
+       else
+         xdir="$xdir"
+       fi
+       baseobj=`$echo "X$libobj" | $Xsed -e 's%^.*/%%'`
+       oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"`
+       $show "(cd $xdir && $LN_S $oldobj $baseobj)"
+       $run eval '(cd $xdir && $LN_S $oldobj $baseobj)' || exit $?
+      fi
+
+      if test -n "$gentop"; then
+       $show "${rm}r $gentop"
+       $run ${rm}r $gentop
+      fi
+
+      exit 0
+      ;;
+
+    prog)
+      case $host in
+       *cygwin*) output=`echo $output | sed -e 's,.exe$,,;s,$,.exe,'` ;;
+      esac
+      if test -n "$vinfo"; then
+       $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2
+      fi
+
+      if test -n "$release"; then
+       $echo "$modename: warning: \`-release' is ignored for programs" 1>&2
+      fi
+
+      if test "$preload" = yes; then
+       if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown &&
+          test "$dlopen_self_static" = unknown; then
+         $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support."
+       fi
+      fi
+
+      case $host in
+      *-*-rhapsody* | *-*-darwin1.[012])
+       # On Rhapsody replace the C library is the System framework
+       compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+       finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+       ;;
+      esac
+
+      compile_command="$compile_command $compile_deplibs"
+      finalize_command="$finalize_command $finalize_deplibs"
+
+      if test -n "$rpath$xrpath"; then
+       # If the user specified any rpath flags, then add them.
+       for libdir in $rpath $xrpath; do
+         # This is the magic to use -rpath.
+         case "$finalize_rpath " in
+         *" $libdir "*) ;;
+         *) finalize_rpath="$finalize_rpath $libdir" ;;
+         esac
+       done
+      fi
+
+      # Now hardcode the library paths
+      rpath=
+      hardcode_libdirs=
+      for libdir in $compile_rpath $finalize_rpath; do
+       if test -n "$hardcode_libdir_flag_spec"; then
+         if test -n "$hardcode_libdir_separator"; then
+           if test -z "$hardcode_libdirs"; then
+             hardcode_libdirs="$libdir"
+           else
+             # Just accumulate the unique libdirs.
+             case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+             *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+               ;;
+             *)
+               hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+               ;;
+             esac
+           fi
+         else
+           eval flag=\"$hardcode_libdir_flag_spec\"
+           rpath="$rpath $flag"
+         fi
+       elif test -n "$runpath_var"; then
+         case "$perm_rpath " in
+         *" $libdir "*) ;;
+         *) perm_rpath="$perm_rpath $libdir" ;;
+         esac
+       fi
+       case $host in
+       *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+         case :$dllsearchpath: in
+         *":$libdir:"*) ;;
+         *) dllsearchpath="$dllsearchpath:$libdir";;
+         esac
+         ;;
+       esac
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+        test -n "$hardcode_libdirs"; then
+       libdir="$hardcode_libdirs"
+       eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      compile_rpath="$rpath"
+
+      rpath=
+      hardcode_libdirs=
+      for libdir in $finalize_rpath; do
+       if test -n "$hardcode_libdir_flag_spec"; then
+         if test -n "$hardcode_libdir_separator"; then
+           if test -z "$hardcode_libdirs"; then
+             hardcode_libdirs="$libdir"
+           else
+             # Just accumulate the unique libdirs.
+             case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+             *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+               ;;
+             *)
+               hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+               ;;
+             esac
+           fi
+         else
+           eval flag=\"$hardcode_libdir_flag_spec\"
+           rpath="$rpath $flag"
+         fi
+       elif test -n "$runpath_var"; then
+         case "$finalize_perm_rpath " in
+         *" $libdir "*) ;;
+         *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
+         esac
+       fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+        test -n "$hardcode_libdirs"; then
+       libdir="$hardcode_libdirs"
+       eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      finalize_rpath="$rpath"
+
+      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+       # Transform all the library objects into standard objects.
+       compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+       finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+      fi
+
+      dlsyms=
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+       if test -n "$NM" && test -n "$global_symbol_pipe"; then
+         dlsyms="${outputname}S.c"
+       else
+         $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2
+       fi
+      fi
+
+      if test -n "$dlsyms"; then
+       case $dlsyms in
+       "") ;;
+       *.c)
+         # Discover the nlist of each of the dlfiles.
+         nlist="$output_objdir/${outputname}.nm"
+
+         $show "$rm $nlist ${nlist}S ${nlist}T"
+         $run $rm "$nlist" "${nlist}S" "${nlist}T"
+
+         # Parse the name list into a source file.
+         $show "creating $output_objdir/$dlsyms"
+
+         test -z "$run" && $echo > "$output_objdir/$dlsyms" "\
+/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */
+/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+/* Prevent the only kind of declaration conflicts we can make. */
+#define lt_preloaded_symbols some_other_symbol
+
+/* External symbol declarations for the compiler. */\
+"
+
+         if test "$dlself" = yes; then
+           $show "generating symbol list for \`$output'"
+
+           test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist"
+
+           # Add our own program objects to the symbol list.
+           progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+           for arg in $progfiles; do
+             $show "extracting global C symbols from \`$arg'"
+             $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+           done
+
+           if test -n "$exclude_expsyms"; then
+             $run eval 'egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+             $run eval '$mv "$nlist"T "$nlist"'
+           fi
+
+           if test -n "$export_symbols_regex"; then
+             $run eval 'egrep -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+             $run eval '$mv "$nlist"T "$nlist"'
+           fi
+
+           # Prepare the list of exported symbols
+           if test -z "$export_symbols"; then
+             export_symbols="$output_objdir/$output.exp"
+             $run $rm $export_symbols
+             $run eval "sed -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+           else
+             $run eval "sed -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"'
+             $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T'
+             $run eval 'mv "$nlist"T "$nlist"'
+           fi
+         fi
+
+         for arg in $dlprefiles; do
+           $show "extracting global C symbols from \`$arg'"
+           name=`echo "$arg" | sed -e 's%^.*/%%'`
+           $run eval 'echo ": $name " >> "$nlist"'
+           $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+         done
+
+         if test -z "$run"; then
+           # Make sure we have at least an empty file.
+           test -f "$nlist" || : > "$nlist"
+
+           if test -n "$exclude_expsyms"; then
+             egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+             $mv "$nlist"T "$nlist"
+           fi
+
+           # Try sorting and uniquifying the output.
+           if grep -v "^: " < "$nlist" | sort +2 | uniq > "$nlist"S; then
+             :
+           else
+             grep -v "^: " < "$nlist" > "$nlist"S
+           fi
+
+           if test -f "$nlist"S; then
+             eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"'
+           else
+             echo '/* NONE */' >> "$output_objdir/$dlsyms"
+           fi
+
+           $echo >> "$output_objdir/$dlsyms" "\
+
+#undef lt_preloaded_symbols
+
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+  const char *name;
+  lt_ptr_t address;
+}
+lt_preloaded_symbols[] =
+{\
+"
+
+           sed -n -e 's/^: \([^ ]*\) $/  {\"\1\", (lt_ptr_t) 0},/p' \
+               -e 's/^. \([^ ]*\) \([^ ]*\)$/  {"\2", (lt_ptr_t) \&\2},/p' \
+                 < "$nlist" >> "$output_objdir/$dlsyms"
+
+           $echo >> "$output_objdir/$dlsyms" "\
+  {0, (lt_ptr_t) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+         fi
+
+         pic_flag_for_symtable=
+         case $host in
+         # compiling the symbol table file with pic_flag works around
+         # a FreeBSD bug that causes programs to crash when -lm is
+         # linked before any other PIC object.  But we must not use
+         # pic_flag when linking with -static.  The problem exists in
+         # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+         *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+           case "$compile_command " in
+           *" -static "*) ;;
+           *) pic_flag_for_symtable=" $pic_flag -DPIC -DFREEBSD_WORKAROUND";;
+           esac;;
+         *-*-hpux*)
+           case "$compile_command " in
+           *" -static "*) ;;
+           *) pic_flag_for_symtable=" $pic_flag -DPIC";;
+           esac
+         esac
+
+         # Now compile the dynamic symbol file.
+         $show "(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")"
+         $run eval '(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $?
+
+         # Clean up the generated files.
+         $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T"
+         $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T"
+
+         # Transform the symbol file into the correct name.
+         compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+         finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+         ;;
+       *)
+         $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2
+         exit 1
+         ;;
+       esac
+      else
+       # We keep going just in case the user didn't refer to
+       # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
+       # really was required.
+
+       # Nullify the symbol file.
+       compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
+       finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
+      fi
+
+      if test $need_relink = no || test "$build_libtool_libs" != yes; then
+       # Replace the output file specification.
+       compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+       link_command="$compile_command$compile_rpath"
+
+       # We have no uninstalled library dependencies, so finalize right now.
+       $show "$link_command"
+       $run eval "$link_command"
+       status=$?
+
+       # Delete the generated files.
+       if test -n "$dlsyms"; then
+         $show "$rm $output_objdir/${outputname}S.${objext}"
+         $run $rm "$output_objdir/${outputname}S.${objext}"
+       fi
+
+       exit $status
+      fi
+
+      if test -n "$shlibpath_var"; then
+       # We should set the shlibpath_var
+       rpath=
+       for dir in $temp_rpath; do
+         case $dir in
+         [\\/]* | [A-Za-z]:[\\/]*)
+           # Absolute path.
+           rpath="$rpath$dir:"
+           ;;
+         *)
+           # Relative path: add a thisdir entry.
+           rpath="$rpath\$thisdir/$dir:"
+           ;;
+         esac
+       done
+       temp_rpath="$rpath"
+      fi
+
+      if test -n "$compile_shlibpath$finalize_shlibpath"; then
+       compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+      fi
+      if test -n "$finalize_shlibpath"; then
+       finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+      fi
+
+      compile_var=
+      finalize_var=
+      if test -n "$runpath_var"; then
+       if test -n "$perm_rpath"; then
+         # We should set the runpath_var.
+         rpath=
+         for dir in $perm_rpath; do
+           rpath="$rpath$dir:"
+         done
+         compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+       fi
+       if test -n "$finalize_perm_rpath"; then
+         # We should set the runpath_var.
+         rpath=
+         for dir in $finalize_perm_rpath; do
+           rpath="$rpath$dir:"
+         done
+         finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+       fi
+      fi
+
+      if test "$no_install" = yes; then
+       # We don't need to create a wrapper script.
+       link_command="$compile_var$compile_command$compile_rpath"
+       # Replace the output file specification.
+       link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+       # Delete the old output file.
+       $run $rm $output
+       # Link the executable and exit
+       $show "$link_command"
+       $run eval "$link_command" || exit $?
+       exit 0
+      fi
+
+      if test "$hardcode_action" = relink; then
+       # Fast installation is not supported
+       link_command="$compile_var$compile_command$compile_rpath"
+       relink_command="$finalize_var$finalize_command$finalize_rpath"
+
+       $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2
+       $echo "$modename: \`$output' will be relinked during installation" 1>&2
+      else
+       if test "$fast_install" != no; then
+         link_command="$finalize_var$compile_command$finalize_rpath"
+         if test "$fast_install" = yes; then
+           relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
+         else
+           # fast_install is set to needless
+           relink_command=
+         fi
+       else
+         link_command="$compile_var$compile_command$compile_rpath"
+         relink_command="$finalize_var$finalize_command$finalize_rpath"
+       fi
+      fi
+
+      # Replace the output file specification.
+      link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+      # Delete the old output files.
+      $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+      $show "$link_command"
+      $run eval "$link_command" || exit $?
+
+      # Now create the wrapper script.
+      $show "creating $output"
+
+      # Quote the relink command for shipping.
+      if test -n "$relink_command"; then
+       # Preserve any variables that may affect compiler behavior
+       for var in $variables_saved_for_relink; do
+         if eval test -z \"\${$var+set}\"; then
+           relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
+         elif eval var_value=\$$var; test -z "$var_value"; then
+           relink_command="$var=; export $var; $relink_command"
+         else
+           var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+           relink_command="$var=\"$var_value\"; export $var; $relink_command"
+         fi
+       done
+       relink_command="cd `pwd`; $relink_command"
+       relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+      fi
+
+      # Quote $echo for shipping.
+      if test "X$echo" = "X$SHELL $0 --fallback-echo"; then
+       case $0 in
+       [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $0 --fallback-echo";;
+       *) qecho="$SHELL `pwd`/$0 --fallback-echo";;
+       esac
+       qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"`
+      else
+       qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"`
+      fi
+
+      # Only actually do things if our run command is non-null.
+      if test -z "$run"; then
+       # win32 will think the script is a binary if it has
+       # a .exe suffix, so we strip it off here.
+       case $output in
+         *.exe) output=`echo $output|sed 's,.exe$,,'` ;;
+       esac
+       # test for cygwin because mv fails w/o .exe extensions
+       case $host in
+         *cygwin*) exeext=.exe ;;
+         *) exeext= ;;
+       esac
+       $rm $output
+       trap "$rm $output; exit 1" 1 2 15
+
+       $echo > $output "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e 1s/^X//'
+sed_quote_subst='$sed_quote_subst'
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test \"\${CDPATH+set}\" = set; then CDPATH=:; export CDPATH; fi
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+  # install mode needs the following variable:
+  notinst_deplibs='$notinst_deplibs'
+else
+  # When we are sourced in execute mode, \$file and \$echo are already set.
+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
+    echo=\"$qecho\"
+    file=\"\$0\"
+    # Make sure echo works.
+    if test \"X\$1\" = X--no-reexec; then
+      # Discard the --no-reexec flag, and continue.
+      shift
+    elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then
+      # Yippee, \$echo works!
+      :
+    else
+      # Restart under the correct shell, and then maybe \$echo will work.
+      exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
+    fi
+  fi\
+"
+       $echo >> $output "\
+
+  # Find the directory that this script lives in.
+  thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
+  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+  # Follow symbolic links until we get to the real thisdir.
+  file=\`ls -ld \"\$file\" | sed -n 's/.*-> //p'\`
+  while test -n \"\$file\"; do
+    destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
+
+    # If there was a directory component, then change thisdir.
+    if test \"x\$destdir\" != \"x\$file\"; then
+      case \"\$destdir\" in
+      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+      *) thisdir=\"\$thisdir/\$destdir\" ;;
+      esac
+    fi
+
+    file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | sed -n 's/.*-> //p'\`
+  done
+
+  # Try to get the absolute directory name.
+  absdir=\`cd \"\$thisdir\" && pwd\`
+  test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+       if test "$fast_install" = yes; then
+         echo >> $output "\
+  program=lt-'$outputname'$exeext
+  progdir=\"\$thisdir/$objdir\"
+
+  if test ! -f \"\$progdir/\$program\" || \\
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | sed 1q\`; \\
+       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+    file=\"\$\$-\$program\"
+
+    if test ! -d \"\$progdir\"; then
+      $mkdir \"\$progdir\"
+    else
+      $rm \"\$progdir/\$file\"
+    fi"
+
+         echo >> $output "\
+
+    # relink executable if necessary
+    if test -n \"\$relink_command\"; then
+      if (eval \$relink_command); then :
+      else
+       $rm \"\$progdir/\$file\"
+       exit 1
+      fi
+    fi
+
+    $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+    { $rm \"\$progdir/\$program\";
+      $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+    $rm \"\$progdir/\$file\"
+  fi"
+       else
+         echo >> $output "\
+  program='$outputname'
+  progdir=\"\$thisdir/$objdir\"
+"
+       fi
+
+       echo >> $output "\
+
+  if test -f \"\$progdir/\$program\"; then"
+
+       # Export our shlibpath_var if we have one.
+       if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+         $echo >> $output "\
+    # Add our own library path to $shlibpath_var
+    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+    # Some systems cannot cope with colon-terminated $shlibpath_var
+    # The second colon is a workaround for a bug in BeOS R4 sed
+    $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
+
+    export $shlibpath_var
+"
+       fi
+
+       # fixup the dll searchpath if we need to.
+       if test -n "$dllsearchpath"; then
+         $echo >> $output "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
+       fi
+
+       $echo >> $output "\
+    if test \"\$libtool_execute_magic\" != \"$magic\"; then
+      # Run the actual program with our arguments.
+"
+       case $host in
+       # win32 systems need to use the prog path for dll
+       # lookup to work
+       *-*-cygwin* | *-*-pw32*)
+         $echo >> $output "\
+      exec \$progdir/\$program \${1+\"\$@\"}
+"
+         ;;
+
+       # Backslashes separate directories on plain windows
+       *-*-mingw | *-*-os2*)
+         $echo >> $output "\
+      exec \$progdir\\\\\$program \${1+\"\$@\"}
+"
+         ;;
+
+       *)
+         $echo >> $output "\
+      # Export the path to the program.
+      PATH=\"\$progdir:\$PATH\"
+      export PATH
+
+      exec \$program \${1+\"\$@\"}
+"
+         ;;
+       esac
+       $echo >> $output "\
+      \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\"
+      exit 1
+    fi
+  else
+    # The program doesn't exist.
+    \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2
+    \$echo \"This script is just a wrapper for \$program.\" 1>&2
+    echo \"See the $PACKAGE documentation for more information.\" 1>&2
+    exit 1
+  fi
+fi\
+"
+       chmod +x $output
+      fi
+      exit 0
+      ;;
+    esac
+
+    # See if we need to build an old-fashioned archive.
+    for oldlib in $oldlibs; do
+
+      if test "$build_libtool_libs" = convenience; then
+       oldobjs="$libobjs_save"
+       addlibs="$convenience"
+       build_libtool_libs=no
+      else
+       if test "$build_libtool_libs" = module; then
+         oldobjs="$libobjs_save"
+         build_libtool_libs=no
+       else
+         oldobjs="$objs$old_deplibs "`$echo "X$libobjs_save" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`
+       fi
+       addlibs="$old_convenience"
+      fi
+
+      if test -n "$addlibs"; then
+       gentop="$output_objdir/${outputname}x"
+       $show "${rm}r $gentop"
+       $run ${rm}r "$gentop"
+       $show "mkdir $gentop"
+       $run mkdir "$gentop"
+       status=$?
+       if test $status -ne 0 && test ! -d "$gentop"; then
+         exit $status
+       fi
+       generated="$generated $gentop"
+
+       # Add in members from convenience archives.
+       for xlib in $addlibs; do
+         # Extract the objects.
+         case $xlib in
+         [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
+         *) xabs=`pwd`"/$xlib" ;;
+         esac
+         xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
+         xdir="$gentop/$xlib"
+
+         $show "${rm}r $xdir"
+         $run ${rm}r "$xdir"
+         $show "mkdir $xdir"
+         $run mkdir "$xdir"
+         status=$?
+         if test $status -ne 0 && test ! -d "$xdir"; then
+           exit $status
+         fi
+         $show "(cd $xdir && $AR x $xabs)"
+         $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
+
+         oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP`
+       done
+      fi
+
+      # Do each command in the archive commands.
+      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+       eval cmds=\"$old_archive_from_new_cmds\"
+      else
+       # Ensure that we have .o objects in place in case we decided
+       # not to build a shared library, and have fallen back to building
+       # static libs even though --disable-static was passed!
+       for oldobj in $oldobjs; do
+         if test ! -f $oldobj; then
+           xdir=`$echo "X$oldobj" | $Xsed -e 's%/[^/]*$%%'`
+           if test "X$xdir" = "X$oldobj"; then
+             xdir="."
+           else
+             xdir="$xdir"
+           fi
+           baseobj=`$echo "X$oldobj" | $Xsed -e 's%^.*/%%'`
+           obj=`$echo "X$baseobj" | $Xsed -e "$o2lo"`
+           $show "(cd $xdir && ${LN_S} $obj $baseobj)"
+           $run eval '(cd $xdir && ${LN_S} $obj $baseobj)' || exit $?
+         fi
+       done
+
+       eval cmds=\"$old_archive_cmds\"
+      fi
+      IFS="${IFS=      }"; save_ifs="$IFS"; IFS='~'
+      for cmd in $cmds; do
+       IFS="$save_ifs"
+       $show "$cmd"
+       $run eval "$cmd" || exit $?
+      done
+      IFS="$save_ifs"
+    done
+
+    if test -n "$generated"; then
+      $show "${rm}r$generated"
+      $run ${rm}r$generated
+    fi
+
+    # Now create the libtool archive.
+    case $output in
+    *.la)
+      old_library=
+      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      $show "creating $output"
+
+      # Preserve any variables that may affect compiler behavior
+      for var in $variables_saved_for_relink; do
+       if eval test -z \"\${$var+set}\"; then
+         relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
+       elif eval var_value=\$$var; test -z "$var_value"; then
+         relink_command="$var=; export $var; $relink_command"
+       else
+         var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+         relink_command="$var=\"$var_value\"; export $var; $relink_command"
+       fi
+      done
+      # Quote the link command for shipping.
+      relink_command="cd `pwd`; $SHELL $0 --mode=relink $libtool_args"
+      relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+
+      # Only create the output if not a dry run.
+      if test -z "$run"; then
+       for installed in no yes; do
+         if test "$installed" = yes; then
+           if test -z "$install_libdir"; then
+             break
+           fi
+           output="$output_objdir/$outputname"i
+           # Replace all uninstalled libtool libraries with the installed ones
+           newdependency_libs=
+           for deplib in $dependency_libs; do
+             case $deplib in
+             *.la)
+               name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'`
+               eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+               if test -z "$libdir"; then
+                 $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+                 exit 1
+               fi
+               newdependency_libs="$newdependency_libs $libdir/$name"
+               ;;
+             *) newdependency_libs="$newdependency_libs $deplib" ;;
+             esac
+           done
+           dependency_libs="$newdependency_libs"
+           newdlfiles=
+           for lib in $dlfiles; do
+             name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+             eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+             if test -z "$libdir"; then
+               $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+               exit 1
+             fi
+             newdlfiles="$newdlfiles $libdir/$name"
+           done
+           dlfiles="$newdlfiles"
+           newdlprefiles=
+           for lib in $dlprefiles; do
+             name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+             eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+             if test -z "$libdir"; then
+               $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+               exit 1
+             fi
+             newdlprefiles="$newdlprefiles $libdir/$name"
+           done
+           dlprefiles="$newdlprefiles"
+         fi
+         $rm $output
+         # place dlname in correct position for cygwin
+         tdlname=$dlname
+         case $host,$output,$installed,$module,$dlname in
+           *cygwin*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
+         esac
+         $echo > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+         if test "$installed" = no && test $need_relink = yes; then
+           $echo >> $output "\
+relink_command=\"$relink_command\""
+         fi
+       done
+      fi
+
+      # Do a symbolic link so that the libtool archive can be found in
+      # LD_LIBRARY_PATH before the program is installed.
+      $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)"
+      $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $?
+      ;;
+    esac
+    exit 0
+    ;;
+
+  # libtool install mode
+  install)
+    modename="$modename: install"
+
+    # There may be an optional sh(1) argument at the beginning of
+    # install_prog (especially on Windows NT).
+    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+       # Allow the use of GNU shtool's install command.
+       $echo "X$nonopt" | $Xsed | grep shtool > /dev/null; then
+      # Aesthetically quote it.
+      arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"`
+      case $arg in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \    ]*|*]*)
+       arg="\"$arg\""
+       ;;
+      esac
+      install_prog="$arg "
+      arg="$1"
+      shift
+    else
+      install_prog=
+      arg="$nonopt"
+    fi
+
+    # The real first argument should be the name of the installation program.
+    # Aesthetically quote it.
+    arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+    case $arg in
+    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \      ]*|*]*)
+      arg="\"$arg\""
+      ;;
+    esac
+    install_prog="$install_prog$arg"
+
+    # We need to accept at least all the BSD install flags.
+    dest=
+    files=
+    opts=
+    prev=
+    install_type=
+    isdir=no
+    stripme=
+    for arg
+    do
+      if test -n "$dest"; then
+       files="$files $dest"
+       dest="$arg"
+       continue
+      fi
+
+      case $arg in
+      -d) isdir=yes ;;
+      -f) prev="-f" ;;
+      -g) prev="-g" ;;
+      -m) prev="-m" ;;
+      -o) prev="-o" ;;
+      -s)
+       stripme=" -s"
+       continue
+       ;;
+      -*) ;;
+
+      *)
+       # If the previous option needed an argument, then skip it.
+       if test -n "$prev"; then
+         prev=
+       else
+         dest="$arg"
+         continue
+       fi
+       ;;
+      esac
+
+      # Aesthetically quote the argument.
+      arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+      case $arg in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \    ]*|*]*)
+       arg="\"$arg\""
+       ;;
+      esac
+      install_prog="$install_prog $arg"
+    done
+
+    if test -z "$install_prog"; then
+      $echo "$modename: you must specify an install program" 1>&2
+      $echo "$help" 1>&2
+      exit 1
+    fi
+
+    if test -n "$prev"; then
+      $echo "$modename: the \`$prev' option requires an argument" 1>&2
+      $echo "$help" 1>&2
+      exit 1
+    fi
+
+    if test -z "$files"; then
+      if test -z "$dest"; then
+       $echo "$modename: no file or destination specified" 1>&2
+      else
+       $echo "$modename: you must specify a destination" 1>&2
+      fi
+      $echo "$help" 1>&2
+      exit 1
+    fi
+
+    # Strip any trailing slash from the destination.
+    dest=`$echo "X$dest" | $Xsed -e 's%/$%%'`
+
+    # Check to see that the destination is a directory.
+    test -d "$dest" && isdir=yes
+    if test "$isdir" = yes; then
+      destdir="$dest"
+      destname=
+    else
+      destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'`
+      test "X$destdir" = "X$dest" && destdir=.
+      destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'`
+
+      # Not a directory, so check to see that there is only one file specified.
+      set dummy $files
+      if test $# -gt 2; then
+       $echo "$modename: \`$dest' is not a directory" 1>&2
+       $echo "$help" 1>&2
+       exit 1
+      fi
+    fi
+    case $destdir in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
+    *)
+      for file in $files; do
+       case $file in
+       *.lo) ;;
+       *)
+         $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2
+         $echo "$help" 1>&2
+         exit 1
+         ;;
+       esac
+      done
+      ;;
+    esac
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    staticlibs=
+    future_libdirs=
+    current_libdirs=
+    for file in $files; do
+
+      # Do each installation.
+      case $file in
+      *.$libext)
+       # Do the static libraries later.
+       staticlibs="$staticlibs $file"
+       ;;
+
+      *.la)
+       # Check to see that this really is a libtool archive.
+       if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+       else
+         $echo "$modename: \`$file' is not a valid libtool archive" 1>&2
+         $echo "$help" 1>&2
+         exit 1
+       fi
+
+       library_names=
+       old_library=
+       relink_command=
+       # If there is no directory component, then add one.
+       case $file in
+       */* | *\\*) . $file ;;
+       *) . ./$file ;;
+       esac
+
+       # Add the libdir to current_libdirs if it is the destination.
+       if test "X$destdir" = "X$libdir"; then
+         case "$current_libdirs " in
+         *" $libdir "*) ;;
+         *) current_libdirs="$current_libdirs $libdir" ;;
+         esac
+       else
+         # Note the libdir as a future libdir.
+         case "$future_libdirs " in
+         *" $libdir "*) ;;
+         *) future_libdirs="$future_libdirs $libdir" ;;
+         esac
+       fi
+
+       dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/
+       test "X$dir" = "X$file/" && dir=
+       dir="$dir$objdir"
+
+       if test -n "$relink_command"; then
+         $echo "$modename: warning: relinking \`$file'" 1>&2
+         $show "$relink_command"
+         if $run eval "$relink_command"; then :
+         else
+           $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+           continue
+         fi
+       fi
+
+       # See the names of the shared library.
+       set dummy $library_names
+       if test -n "$2"; then
+         realname="$2"
+         shift
+         shift
+
+         srcname="$realname"
+         test -n "$relink_command" && srcname="$realname"T
+
+         # Install the shared library and build the symlinks.
+         $show "$install_prog $dir/$srcname $destdir/$realname"
+         $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $?
+         if test -n "$stripme" && test -n "$striplib"; then
+           $show "$striplib $destdir/$realname"
+           $run eval "$striplib $destdir/$realname" || exit $?
+         fi
+
+         if test $# -gt 0; then
+           # Delete the old symlinks, and create new ones.
+           for linkname
+           do
+             if test "$linkname" != "$realname"; then
+               $show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)"
+               $run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)"
+             fi
+           done
+         fi
+
+         # Do each command in the postinstall commands.
+         lib="$destdir/$realname"
+         eval cmds=\"$postinstall_cmds\"
+         IFS="${IFS=   }"; save_ifs="$IFS"; IFS='~'
+         for cmd in $cmds; do
+           IFS="$save_ifs"
+           $show "$cmd"
+           $run eval "$cmd" || exit $?
+         done
+         IFS="$save_ifs"
+       fi
+
+       # Install the pseudo-library for information purposes.
+       name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+       instname="$dir/$name"i
+       $show "$install_prog $instname $destdir/$name"
+       $run eval "$install_prog $instname $destdir/$name" || exit $?
+
+       # Maybe install the static library, too.
+       test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
+       ;;
+
+      *.lo)
+       # Install (i.e. copy) a libtool object.
+
+       # Figure out destination file name, if it wasn't already specified.
+       if test -n "$destname"; then
+         destfile="$destdir/$destname"
+       else
+         destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+         destfile="$destdir/$destfile"
+       fi
+
+       # Deduce the name of the destination old-style object file.
+       case $destfile in
+       *.lo)
+         staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"`
+         ;;
+       *.$objext)
+         staticdest="$destfile"
+         destfile=
+         ;;
+       *)
+         $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2
+         $echo "$help" 1>&2
+         exit 1
+         ;;
+       esac
+
+       # Install the libtool object if requested.
+       if test -n "$destfile"; then
+         $show "$install_prog $file $destfile"
+         $run eval "$install_prog $file $destfile" || exit $?
+       fi
+
+       # Install the old object if enabled.
+       if test "$build_old_libs" = yes; then
+         # Deduce the name of the old-style object file.
+         staticobj=`$echo "X$file" | $Xsed -e "$lo2o"`
+
+         $show "$install_prog $staticobj $staticdest"
+         $run eval "$install_prog \$staticobj \$staticdest" || exit $?
+       fi
+       exit 0
+       ;;
+
+      *)
+       # Figure out destination file name, if it wasn't already specified.
+       if test -n "$destname"; then
+         destfile="$destdir/$destname"
+       else
+         destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+         destfile="$destdir/$destfile"
+       fi
+
+       # Do a test to see if this is really a libtool program.
+       if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+         notinst_deplibs=
+         relink_command=
+
+         # If there is no directory component, then add one.
+         case $file in
+         */* | *\\*) . $file ;;
+         *) . ./$file ;;
+         esac
+
+         # Check the variables that should have been set.
+         if test -z "$notinst_deplibs"; then
+           $echo "$modename: invalid libtool wrapper script \`$file'" 1>&2
+           exit 1
+         fi
+
+         finalize=yes
+         for lib in $notinst_deplibs; do
+           # Check to see that each library is installed.
+           libdir=
+           if test -f "$lib"; then
+             # If there is no directory component, then add one.
+             case $lib in
+             */* | *\\*) . $lib ;;
+             *) . ./$lib ;;
+             esac
+           fi
+           libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
+           if test -n "$libdir" && test ! -f "$libfile"; then
+             $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2
+             finalize=no
+           fi
+         done
+
+         relink_command=
+         # If there is no directory component, then add one.
+         case $file in
+         */* | *\\*) . $file ;;
+         *) . ./$file ;;
+         esac
+
+         outputname=
+         if test "$fast_install" = no && test -n "$relink_command"; then
+           if test "$finalize" = yes && test -z "$run"; then
+             tmpdir="/tmp"
+             test -n "$TMPDIR" && tmpdir="$TMPDIR"
+             tmpdir="$tmpdir/libtool-$$"
+             if $mkdir -p "$tmpdir" && chmod 700 "$tmpdir"; then :
+             else
+               $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2
+               continue
+             fi
+             file=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+             outputname="$tmpdir/$file"
+             # Replace the output file specification.
+             relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
+
+             $show "$relink_command"
+             if $run eval "$relink_command"; then :
+             else
+               $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+               ${rm}r "$tmpdir"
+               continue
+             fi
+             file="$outputname"
+           else
+             $echo "$modename: warning: cannot relink \`$file'" 1>&2
+           fi
+         else
+           # Install the binary that we compiled earlier.
+           file=`$echo "X$file" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
+         fi
+       fi
+
+       # remove .exe since cygwin /usr/bin/install will append another
+       # one anyways
+       case $install_prog,$host in
+       /usr/bin/install*,*cygwin*)
+         case $file:$destfile in
+         *.exe:*.exe)
+           # this is ok
+           ;;
+         *.exe:*)
+           destfile=$destfile.exe
+           ;;
+         *:*.exe)
+           destfile=`echo $destfile | sed -e 's,.exe$,,'`
+           ;;
+         esac
+         ;;
+       esac
+       $show "$install_prog$stripme $file $destfile"
+       $run eval "$install_prog\$stripme \$file \$destfile" || exit $?
+       test -n "$outputname" && ${rm}r "$tmpdir"
+       ;;
+      esac
+    done
+
+    for file in $staticlibs; do
+      name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+
+      # Set up the ranlib parameters.
+      oldlib="$destdir/$name"
+
+      $show "$install_prog $file $oldlib"
+      $run eval "$install_prog \$file \$oldlib" || exit $?
+
+      if test -n "$stripme" && test -n "$striplib"; then
+       $show "$old_striplib $oldlib"
+       $run eval "$old_striplib $oldlib" || exit $?
+      fi
+
+      # Do each command in the postinstall commands.
+      eval cmds=\"$old_postinstall_cmds\"
+      IFS="${IFS=      }"; save_ifs="$IFS"; IFS='~'
+      for cmd in $cmds; do
+       IFS="$save_ifs"
+       $show "$cmd"
+       $run eval "$cmd" || exit $?
+      done
+      IFS="$save_ifs"
+    done
+
+    if test -n "$future_libdirs"; then
+      $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2
+    fi
+
+    if test -n "$current_libdirs"; then
+      # Maybe just do a dry run.
+      test -n "$run" && current_libdirs=" -n$current_libdirs"
+      exec $SHELL $0 --finish$current_libdirs
+      exit 1
+    fi
+
+    exit 0
+    ;;
+
+  # libtool finish mode
+  finish)
+    modename="$modename: finish"
+    libdirs="$nonopt"
+    admincmds=
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      for dir
+      do
+       libdirs="$libdirs $dir"
+      done
+
+      for libdir in $libdirs; do
+       if test -n "$finish_cmds"; then
+         # Do each command in the finish commands.
+         eval cmds=\"$finish_cmds\"
+         IFS="${IFS=   }"; save_ifs="$IFS"; IFS='~'
+         for cmd in $cmds; do
+           IFS="$save_ifs"
+           $show "$cmd"
+           $run eval "$cmd" || admincmds="$admincmds
+       $cmd"
+         done
+         IFS="$save_ifs"
+       fi
+       if test -n "$finish_eval"; then
+         # Do the single finish_eval.
+         eval cmds=\"$finish_eval\"
+         $run eval "$cmds" || admincmds="$admincmds
+       $cmds"
+       fi
+      done
+    fi
+
+    # Exit here if they wanted silent mode.
+    test "$show" = ":" && exit 0
+
+    echo "----------------------------------------------------------------------"
+    echo "Libraries have been installed in:"
+    for libdir in $libdirs; do
+      echo "   $libdir"
+    done
+    echo
+    echo "If you ever happen to want to link against installed libraries"
+    echo "in a given directory, LIBDIR, you must either use libtool, and"
+    echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+    echo "flag during linking and do at least one of the following:"
+    if test -n "$shlibpath_var"; then
+      echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+      echo "     during execution"
+    fi
+    if test -n "$runpath_var"; then
+      echo "   - add LIBDIR to the \`$runpath_var' environment variable"
+      echo "     during linking"
+    fi
+    if test -n "$hardcode_libdir_flag_spec"; then
+      libdir=LIBDIR
+      eval flag=\"$hardcode_libdir_flag_spec\"
+
+      echo "   - use the \`$flag' linker flag"
+    fi
+    if test -n "$admincmds"; then
+      echo "   - have your system administrator run these commands:$admincmds"
+    fi
+    if test -f /etc/ld.so.conf; then
+      echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+    fi
+    echo
+    echo "See any operating system documentation about shared libraries for"
+    echo "more information, such as the ld(1) and ld.so(8) manual pages."
+    echo "----------------------------------------------------------------------"
+    exit 0
+    ;;
+
+  # libtool execute mode
+  execute)
+    modename="$modename: execute"
+
+    # The first argument is the command name.
+    cmd="$nonopt"
+    if test -z "$cmd"; then
+      $echo "$modename: you must specify a COMMAND" 1>&2
+      $echo "$help"
+      exit 1
+    fi
+
+    # Handle -dlopen flags immediately.
+    for file in $execute_dlfiles; do
+      if test ! -f "$file"; then
+       $echo "$modename: \`$file' is not a file" 1>&2
+       $echo "$help" 1>&2
+       exit 1
+      fi
+
+      dir=
+      case $file in
+      *.la)
+       # Check to see that this really is a libtool archive.
+       if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+       else
+         $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+         $echo "$help" 1>&2
+         exit 1
+       fi
+
+       # Read the libtool library.
+       dlname=
+       library_names=
+
+       # If there is no directory component, then add one.
+       case $file in
+       */* | *\\*) . $file ;;
+       *) . ./$file ;;
+       esac
+
+       # Skip this library if it cannot be dlopened.
+       if test -z "$dlname"; then
+         # Warn if it was a shared library.
+         test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'"
+         continue
+       fi
+
+       dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+       test "X$dir" = "X$file" && dir=.
+
+       if test -f "$dir/$objdir/$dlname"; then
+         dir="$dir/$objdir"
+       else
+         $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2
+         exit 1
+       fi
+       ;;
+
+      *.lo)
+       # Just add the directory containing the .lo file.
+       dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+       test "X$dir" = "X$file" && dir=.
+       ;;
+
+      *)
+       $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2
+       continue
+       ;;
+      esac
+
+      # Get the absolute pathname.
+      absdir=`cd "$dir" && pwd`
+      test -n "$absdir" && dir="$absdir"
+
+      # Now add the directory to shlibpath_var.
+      if eval "test -z \"\$$shlibpath_var\""; then
+       eval "$shlibpath_var=\"\$dir\""
+      else
+       eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+      fi
+    done
+
+    # This variable tells wrapper scripts just to set shlibpath_var
+    # rather than running their programs.
+    libtool_execute_magic="$magic"
+
+    # Check if any of the arguments is a wrapper script.
+    args=
+    for file
+    do
+      case $file in
+      -*) ;;
+      *)
+       # Do a test to see if this is really a libtool program.
+       if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+         # If there is no directory component, then add one.
+         case $file in
+         */* | *\\*) . $file ;;
+         *) . ./$file ;;
+         esac
+
+         # Transform arg to wrapped name.
+         file="$progdir/$program"
+       fi
+       ;;
+      esac
+      # Quote arguments (to preserve shell metacharacters).
+      file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"`
+      args="$args \"$file\""
+    done
+
+    if test -z "$run"; then
+      if test -n "$shlibpath_var"; then
+       # Export the shlibpath_var.
+       eval "export $shlibpath_var"
+      fi
+
+      # Restore saved enviroment variables
+      if test "${save_LC_ALL+set}" = set; then
+       LC_ALL="$save_LC_ALL"; export LC_ALL
+      fi
+      if test "${save_LANG+set}" = set; then
+       LANG="$save_LANG"; export LANG
+      fi
+
+      # Now actually exec the command.
+      eval "exec \$cmd$args"
+
+      $echo "$modename: cannot exec \$cmd$args"
+      exit 1
+    else
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+       eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\""
+       $echo "export $shlibpath_var"
+      fi
+      $echo "$cmd$args"
+      exit 0
+    fi
+    ;;
+
+  # libtool clean and uninstall mode
+  clean | uninstall)
+    modename="$modename: $mode"
+    rm="$nonopt"
+    files=
+    rmforce=
+    exit_status=0
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    for arg
+    do
+      case $arg in
+      -f) rm="$rm $arg"; rmforce=yes ;;
+      -*) rm="$rm $arg" ;;
+      *) files="$files $arg" ;;
+      esac
+    done
+
+    if test -z "$rm"; then
+      $echo "$modename: you must specify an RM program" 1>&2
+      $echo "$help" 1>&2
+      exit 1
+    fi
+
+    rmdirs=
+
+    for file in $files; do
+      dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+      if test "X$dir" = "X$file"; then
+       dir=.
+       objdir="$objdir"
+      else
+       objdir="$dir/$objdir"
+      fi
+      name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+      test $mode = uninstall && objdir="$dir"
+
+      # Remember objdir for removal later, being careful to avoid duplicates
+      if test $mode = clean; then
+       case " $rmdirs " in
+         *" $objdir "*) ;;
+         *) rmdirs="$rmdirs $objdir" ;;
+       esac
+      fi
+
+      # Don't error if the file doesn't exist and rm -f was used.
+      if (test -L "$file") >/dev/null 2>&1 \
+        || (test -h "$file") >/dev/null 2>&1 \
+       || test -f "$file"; then
+        :
+      elif test -d "$file"; then
+        exit_status=1
+       continue
+      elif test "$rmforce" = yes; then
+        continue
+      fi
+
+      rmfiles="$file"
+
+      case $name in
+      *.la)
+       # Possibly a libtool archive, so verify it.
+       if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+         . $dir/$name
+
+         # Delete the libtool libraries and symlinks.
+         for n in $library_names; do
+           rmfiles="$rmfiles $objdir/$n"
+         done
+         test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
+         test $mode = clean && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
+
+         if test $mode = uninstall; then
+           if test -n "$library_names"; then
+             # Do each command in the postuninstall commands.
+             eval cmds=\"$postuninstall_cmds\"
+             IFS="${IFS=       }"; save_ifs="$IFS"; IFS='~'
+             for cmd in $cmds; do
+               IFS="$save_ifs"
+               $show "$cmd"
+               $run eval "$cmd"
+               if test $? != 0 && test "$rmforce" != yes; then
+                 exit_status=1
+               fi
+             done
+             IFS="$save_ifs"
+           fi
+
+           if test -n "$old_library"; then
+             # Do each command in the old_postuninstall commands.
+             eval cmds=\"$old_postuninstall_cmds\"
+             IFS="${IFS=       }"; save_ifs="$IFS"; IFS='~'
+             for cmd in $cmds; do
+               IFS="$save_ifs"
+               $show "$cmd"
+               $run eval "$cmd"
+               if test $? != 0 && test "$rmforce" != yes; then
+                 exit_status=1
+               fi
+             done
+             IFS="$save_ifs"
+           fi
+           # FIXME: should reinstall the best remaining shared library.
+         fi
+       fi
+       ;;
+
+      *.lo)
+       if test "$build_old_libs" = yes; then
+         oldobj=`$echo "X$name" | $Xsed -e "$lo2o"`
+         rmfiles="$rmfiles $dir/$oldobj"
+       fi
+       ;;
+
+      *)
+       # Do a test to see if this is a libtool program.
+       if test $mode = clean &&
+          (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+         relink_command=
+         . $dir/$file
+
+         rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
+         if test "$fast_install" = yes && test -n "$relink_command"; then
+           rmfiles="$rmfiles $objdir/lt-$name"
+         fi
+       fi
+       ;;
+      esac
+      $show "$rm $rmfiles"
+      $run $rm $rmfiles || exit_status=1
+    done
+
+    # Try to remove the ${objdir}s in the directories where we deleted files
+    for dir in $rmdirs; do
+      if test -d "$dir"; then
+       $show "rmdir $dir"
+       $run rmdir $dir >/dev/null 2>&1
+      fi
+    done
+
+    exit $exit_status
+    ;;
+
+  "")
+    $echo "$modename: you must specify a MODE" 1>&2
+    $echo "$generic_help" 1>&2
+    exit 1
+    ;;
+  esac
+
+  $echo "$modename: invalid operation mode \`$mode'" 1>&2
+  $echo "$generic_help" 1>&2
+  exit 1
+fi # test -z "$show_help"
+
+# We need to display help for each of the modes.
+case $mode in
+"") $echo \
+"Usage: $modename [OPTION]... [MODE-ARG]...
+
+Provide generalized library-building support services.
+
+    --config          show all configuration variables
+    --debug           enable verbose shell tracing
+-n, --dry-run         display commands without modifying any files
+    --features        display basic configuration information and exit
+    --finish          same as \`--mode=finish'
+    --help            display this help message and exit
+    --mode=MODE       use operation mode MODE [default=inferred from MODE-ARGS]
+    --quiet           same as \`--silent'
+    --silent          don't print informational messages
+    --version         print version information
+
+MODE must be one of the following:
+
+      clean           remove files from the build directory
+      compile         compile a source file into a libtool object
+      execute         automatically set library path, then run a program
+      finish          complete the installation of libtool libraries
+      install         install libraries or executables
+      link            create a library or an executable
+      uninstall       remove libraries from an installed directory
+
+MODE-ARGS vary depending on the MODE.  Try \`$modename --help --mode=MODE' for
+a more detailed description of MODE."
+  exit 0
+  ;;
+
+clean)
+  $echo \
+"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+  ;;
+
+compile)
+  $echo \
+"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -prefer-pic       try to building PIC objects only
+  -prefer-non-pic   try to building non-PIC objects only
+  -static           always build a \`.o' file suitable for static linking
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+  ;;
+
+execute)
+  $echo \
+"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+  -dlopen FILE      add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+  ;;
+
+finish)
+  $echo \
+"Usage: $modename [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges.  Use
+the \`--dry-run' option if you just want to see what would be executed."
+  ;;
+
+install)
+  $echo \
+"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command.  The first component should be
+either the \`install' or \`cp' program.
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+  ;;
+
+link)
+  $echo \
+"Usage: $modename [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+  -all-static       do not do any dynamic linking at all
+  -avoid-version    do not add a version suffix if possible
+  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
+  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+  -export-symbols SYMFILE
+                   try to export only the symbols listed in SYMFILE
+  -export-symbols-regex REGEX
+                   try to export only the symbols matching REGEX
+  -LLIBDIR          search LIBDIR for required installed libraries
+  -lNAME            OUTPUT-FILE requires the installed library libNAME
+  -module           build a library that can dlopened
+  -no-fast-install  disable the fast-install mode
+  -no-install       link a not-installable executable
+  -no-undefined     declare that a library does not refer to external symbols
+  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
+  -release RELEASE  specify package release information
+  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
+  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
+  -static           do not do any dynamic linking of libtool libraries
+  -version-info CURRENT[:REVISION[:AGE]]
+                   specify library version info [each variable defaults to 0]
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename.  Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+  ;;
+
+uninstall)
+  $echo \
+"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+  ;;
+
+*)
+  $echo "$modename: invalid operation mode \`$mode'" 1>&2
+  $echo "$help" 1>&2
+  exit 1
+  ;;
+esac
+
+echo
+$echo "Try \`$modename --help' for more information about other modes."
+
+exit 0
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
diff --git a/config/missing b/config/missing
new file mode 100644 (file)
index 0000000..d46f79f
--- /dev/null
@@ -0,0 +1,198 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+# Copyright (C) 1996, 1997, 2001 Free Software Foundation, Inc.
+# Franc,ois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.in; then
+  configure_ac=configure.ac
+else
+  configure_ac=configure.in
+fi
+
+case "$1" in
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]"
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing - GNU libit 0.0"
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+  aclocal)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`acinclude.m4' or \`$configure_ac'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`$configure_ac'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`acconfig.h' or \`$configure_ac'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' $configure_ac`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case "$f" in
+      *:*) touch_files="$touch_files "`echo "$f" |
+                                      sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $touch_files
+    ;;
+
+  automake)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`$configure_ac'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print |
+          sed 's/\.am$/.in/' |
+          while read f; do touch "$f"; done
+    ;;
+
+  bison|yacc)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+       case "$LASTARG" in
+       *.y)
+           SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+           if [ -f "$SRCFILE" ]; then
+                cp "$SRCFILE" y.tab.c
+           fi
+           SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+           if [ -f "$SRCFILE" ]; then
+                cp "$SRCFILE" y.tab.h
+           fi
+         ;;
+       esac
+    fi
+    if [ ! -f y.tab.h ]; then
+       echo >y.tab.h
+    fi
+    if [ ! -f y.tab.c ]; then
+       echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex|flex)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+       case "$LASTARG" in
+       *.l)
+           SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+           if [ -f "$SRCFILE" ]; then
+                cp "$SRCFILE" lex.yy.c
+           fi
+         ;;
+       esac
+    fi
+    if [ ! -f lex.yy.c ]; then
+       echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  makeinfo)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+    if test -z "$file"; then
+      file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
+    fi
+    touch $file
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and you do not seem to have it handy on your
+         system.  You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequirements for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
diff --git a/config/mkinstalldirs b/config/mkinstalldirs
new file mode 100644 (file)
index 0000000..2b5bbf8
--- /dev/null
@@ -0,0 +1,40 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+# $Id: mkinstalldirs,v 1.1.2.1 2002/01/19 09:16:17 icastle Exp $
+
+errstatus=0
+
+for file
+do
+   set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+   shift
+
+   pathcomp=
+   for d
+   do
+     pathcomp="$pathcomp$d"
+     case "$pathcomp" in
+       -* ) pathcomp=./$pathcomp ;;
+     esac
+
+     if test ! -d "$pathcomp"; then
+        echo "mkdir $pathcomp"
+
+        mkdir "$pathcomp" || lasterr=$?
+
+        if test ! -d "$pathcomp"; then
+         errstatus=$lasterr
+        fi
+     fi
+
+     pathcomp="$pathcomp/"
+   done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
diff --git a/configure b/configure
new file mode 100755 (executable)
index 0000000..c024af6
--- /dev/null
+++ b/configure
@@ -0,0 +1,10661 @@
+#! /bin/sh
+# From configure.in Id: configure.in.
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.53.
+#
+# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
+# Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Find the correct PATH separator.  Usually this is `:', but
+# DJGPP uses `;' like DOS.
+if test "X${PATH_SEPARATOR+set}" != Xset; then
+  UNAME=${UNAME-`uname 2>/dev/null`}
+  case X$UNAME in
+    *-DOS) lt_cv_sys_path_separator=';' ;;
+    *)     lt_cv_sys_path_separator=':' ;;
+  esac
+fi
+
+
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$ECHO in
+X*--fallback-echo)
+  # Remove one level of quotation (which was required for Make).
+  ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','`
+  ;;
+esac
+
+echo=${ECHO-echo}
+if test "X$1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X$1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
+  # Yippee, $echo works!
+  :
+else
+  # Restart under the correct shell.
+  exec $SHELL "$0" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<EOF
+
+EOF
+  exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
+
+if test -z "$ECHO"; then
+if test "X${echo_test_string+set}" != Xset; then
+# find a string as large as possible, as long as the shell can cope with it
+  for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
+    # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+    if (echo_test_string="`eval $cmd`") 2>/dev/null &&
+       echo_test_string="`eval $cmd`" &&
+       (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
+    then
+      break
+    fi
+  done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+   echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+   test "X$echo_testing_string" = "X$echo_test_string"; then
+  :
+else
+  # The Solaris, AIX, and Digital Unix default echo programs unquote
+  # backslashes.  This makes it impossible to quote backslashes using
+  #   echo "$something" | sed 's/\\/\\\\/g'
+  #
+  # So, first we look for a working echo in the user's PATH.
+
+  IFS="${IFS=  }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
+  for dir in $PATH /usr/ucb; do
+    if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+       test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+       echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+       test "X$echo_testing_string" = "X$echo_test_string"; then
+      echo="$dir/echo"
+      break
+    fi
+  done
+  IFS="$save_ifs"
+
+  if test "X$echo" = Xecho; then
+    # We didn't find a better echo, so look for alternatives.
+    if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+       echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
+       test "X$echo_testing_string" = "X$echo_test_string"; then
+      # This shell has a builtin print -r that does the trick.
+      echo='print -r'
+    elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+        test "X$CONFIG_SHELL" != X/bin/ksh; then
+      # If we have ksh, try running configure again with it.
+      ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+      export ORIGINAL_CONFIG_SHELL
+      CONFIG_SHELL=/bin/ksh
+      export CONFIG_SHELL
+      exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"}
+    else
+      # Try using printf.
+      echo='printf %s\n'
+      if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+        echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+        test "X$echo_testing_string" = "X$echo_test_string"; then
+       # Cool, printf works
+       :
+      elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+          test "X$echo_testing_string" = 'X\t' &&
+          echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+          test "X$echo_testing_string" = "X$echo_test_string"; then
+       CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+       export CONFIG_SHELL
+       SHELL="$CONFIG_SHELL"
+       export SHELL
+       echo="$CONFIG_SHELL $0 --fallback-echo"
+      elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+          test "X$echo_testing_string" = 'X\t' &&
+          echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+          test "X$echo_testing_string" = "X$echo_test_string"; then
+       echo="$CONFIG_SHELL $0 --fallback-echo"
+      else
+       # maybe with a smaller string...
+       prev=:
+
+       for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
+         if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
+         then
+           break
+         fi
+         prev="$cmd"
+       done
+
+       if test "$prev" != 'sed 50q "$0"'; then
+         echo_test_string=`eval $prev`
+         export echo_test_string
+         exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"}
+       else
+         # Oops.  We lost completely, so just stick with echo.
+         echo=echo
+       fi
+      fi
+    fi
+  fi
+fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+ECHO=$echo
+if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then
+   ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo"
+fi
+
+
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+
+# NLS nuisances.
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+(set +x; test -n "`(LANG=C; export LANG) 2>&1`") &&
+    { $as_unset LANG || test "${LANG+set}" != set; } ||
+      { LANG=C; export LANG; }
+(set +x; test -n "`(LC_ALL=C; export LC_ALL) 2>&1`") &&
+    { $as_unset LC_ALL || test "${LC_ALL+set}" != set; } ||
+      { LC_ALL=C; export LC_ALL; }
+(set +x; test -n "`(LC_TIME=C; export LC_TIME) 2>&1`") &&
+    { $as_unset LC_TIME || test "${LC_TIME+set}" != set; } ||
+      { LC_TIME=C; export LC_TIME; }
+(set +x; test -n "`(LC_CTYPE=C; export LC_CTYPE) 2>&1`") &&
+    { $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set; } ||
+      { LC_CTYPE=C; export LC_CTYPE; }
+(set +x; test -n "`(LANGUAGE=C; export LANGUAGE) 2>&1`") &&
+    { $as_unset LANGUAGE || test "${LANGUAGE+set}" != set; } ||
+      { LANGUAGE=C; export LANGUAGE; }
+(set +x; test -n "`(LC_COLLATE=C; export LC_COLLATE) 2>&1`") &&
+    { $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set; } ||
+      { LC_COLLATE=C; export LC_COLLATE; }
+(set +x; test -n "`(LC_NUMERIC=C; export LC_NUMERIC) 2>&1`") &&
+    { $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set; } ||
+      { LC_NUMERIC=C; export LC_NUMERIC; }
+(set +x; test -n "`(LC_MESSAGES=C; export LC_MESSAGES) 2>&1`") &&
+    { $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set; } ||
+      { LC_MESSAGES=C; export LC_MESSAGES; }
+
+
+# Name of the executable.
+as_me=`(basename "$0") 2>/dev/null ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)$' \| \
+        .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+         /^X\/\(\/\/\)$/{ s//\1/; q; }
+         /^X\/\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conftest.sh
+  echo  "exit 0"   >>conftest.sh
+  chmod +x conftest.sh
+  if (PATH=".;."; conftest.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conftest.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+        case $as_dir in
+        /*)
+          if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+            CONFIG_SHELL=$as_dir/$as_base
+            export CONFIG_SHELL
+            exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+          fi;;
+        esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='     ' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS="  $as_nl"
+
+# CDPATH.
+$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=$PATH_SEPARATOR; export CDPATH; }
+
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete.  It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_unique_file="dsssl"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+#  include <stdint.h>
+# endif
+#endif
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_option in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    eval "enable_$ac_feature=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_$ac_feature='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_$ac_package='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/-/_/g'`
+    eval "with_$ac_package=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+    eval "$ac_envvar='$ac_optarg'"
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+              localstatedir libdir includedir oldincludedir infodir mandir
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+         X"$0" : 'X\(//\)[^/]' \| \
+         X"$0" : 'X\(//\)$' \| \
+         X"$0" : 'X\(/\)' \| \
+         .     : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+         /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+         /^X\(\/\/\)$/{ s//\1/; q; }
+         /^X\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+   { (exit 1); exit 1; }; }
+  else
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+  fi
+fi
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CXX_set=${CXX+set}
+ac_env_CXX_value=$CXX
+ac_cv_env_CXX_set=${CXX+set}
+ac_cv_env_CXX_value=$CXX
+ac_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_env_CXXFLAGS_value=$CXXFLAGS
+ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_cv_env_CXXFLAGS_value=$CXXFLAGS
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+ac_env_CXXCPP_set=${CXXCPP+set}
+ac_env_CXXCPP_value=$CXXCPP
+ac_cv_env_CXXCPP_set=${CXXCPP+set}
+ac_cv_env_CXXCPP_value=$CXXCPP
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+  cat <<_ACEOF
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --infodir=DIR          info documentation [PREFIX/info]
+  --mandir=DIR           man documentation [PREFIX/man]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-spincludedir=pathlist
+       location of OpenSP include files
+  --enable-splibdir=pathlist
+       location of OpenSP library
+  --enable-http          include support for http
+  --disable-mif    disable support for FrameMaker MIF output
+  --disable-html    disable support for HTML+CSS output
+  --enable-default-catalog=pathlist
+                          provide one or more default catalog files or
+                          sysids, e.g. /usr/local/lib/sgml/catalog
+  --enable-default-search-path=pathlist
+                          provide a default value for SGML_SEARCH_PATH
+  --enable-shared=PKGS  build shared libraries default=yes
+  --enable-static=PKGS  build static libraries default=yes
+  --enable-fast-install=PKGS  optimize for fast installation default=yes
+  --disable-libtool-lock  avoid locking (might break parallel builds)
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-gnu-ld           assume the C compiler uses GNU ld default=no
+  --with-pic              try to use only PIC/non-PIC objects default=use both
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
+              headers in a nonstandard directory <include dir>
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+  CPP         C preprocessor
+  CXXCPP      C++ preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  ac_popdir=`pwd`
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d $ac_dir || continue
+    ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
+# absolute.
+ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
+ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd`
+ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
+ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
+
+    cd $ac_dir
+    # Check for guested configure; otherwise get Cygnus style configure.
+    if test -f $ac_srcdir/configure.gnu; then
+      echo
+      $SHELL $ac_srcdir/configure.gnu  --help=recursive
+    elif test -f $ac_srcdir/configure; then
+      echo
+      $SHELL $ac_srcdir/configure  --help=recursive
+    elif test -f $ac_srcdir/configure.ac ||
+           test -f $ac_srcdir/configure.in; then
+      echo
+      $ac_configure --help
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi
+    cd $ac_popdir
+  done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+  cat <<\_ACEOF
+
+Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
+Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.53.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell meta-characters.
+ac_configure_args=
+ac_sep=
+for ac_arg
+do
+  case $ac_arg in
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n ) continue ;;
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    continue ;;
+  *" "*|*"     "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+    ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+  esac
+  case " $ac_configure_args " in
+    *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+    *) ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+       ac_sep=" " ;;
+  esac
+  # Get rid of the leading space.
+done
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+{
+  (set) 2>&1 |
+    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      sed -n \
+        "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+      ;;
+    *)
+      sed -n \
+        "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+}
+    echo
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      sed "/^$/d" confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core core.* *.core &&
+  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+     ' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . $cache_file;;
+      *)                      . ./$cache_file;;
+    esac
+  fi
+else
+  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+               sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+  eval ac_new_val="\$ac_env_${ac_var}_value"
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+        { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+        { echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+        { echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+        ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *" "*|*"   "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_aux_dir=
+for ac_dir in config $srcdir/config; do
+  if test -f $ac_dir/install-sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f $ac_dir/install.sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f $ac_dir/shtool; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in config $srcdir/config" >&5
+echo "$as_me: error: cannot find install-sh or install.sh in config $srcdir/config" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+          if test $ac_prog = install &&
+            grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+            # AIX install.  It has an incompatible calling convention.
+            :
+          elif test $ac_prog = install &&
+            grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+            # program-specific install script used by HP pwplus--don't use.
+            :
+          else
+            ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+            break 3
+          fi
+        fi
+      done
+    done
+    ;;
+esac
+done
+
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL=$ac_install_sh
+  fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
+# Just in case
+sleep 1
+echo timestamp > conftestfile
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftestfile`
+   fi
+   if test "$*" != "X $srcdir/configure conftestfile" \
+      && test "$*" != "X conftestfile $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      { { echo "$as_me:$LINENO: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&2;}
+   { (exit 1); exit 1; }; }
+   fi
+
+   test "$2" = conftestfile
+   )
+then
+   # Ok.
+   :
+else
+   { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+rm -f conftest*
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+test "$program_prefix" != NONE &&
+  program_transform_name="s,^,$program_prefix,;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+# Double any \ or $.  echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm conftest.sed
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \${MAKE}... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.make <<\_ACEOF
+all:
+       @echo 'ac_maketemp="${MAKE}"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+  eval ac_cv_prog_make_${ac_make}_set=yes
+else
+  eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  SET_MAKE=
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+PACKAGE=openjade
+
+VERSION=1.3.2
+
+if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+  { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+
+
+missing_dir=`cd $ac_aux_dir && pwd`
+echo "$as_me:$LINENO: checking for working aclocal" >&5
+echo $ECHO_N "checking for working aclocal... $ECHO_C" >&6
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (aclocal --version) < /dev/null > /dev/null 2>&1; then
+   ACLOCAL=aclocal
+   echo "$as_me:$LINENO: result: found" >&5
+echo "${ECHO_T}found" >&6
+else
+   ACLOCAL="$missing_dir/missing aclocal"
+   echo "$as_me:$LINENO: result: missing" >&5
+echo "${ECHO_T}missing" >&6
+fi
+
+echo "$as_me:$LINENO: checking for working autoconf" >&5
+echo $ECHO_N "checking for working autoconf... $ECHO_C" >&6
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (autoconf --version) < /dev/null > /dev/null 2>&1; then
+   AUTOCONF=autoconf
+   echo "$as_me:$LINENO: result: found" >&5
+echo "${ECHO_T}found" >&6
+else
+   AUTOCONF="$missing_dir/missing autoconf"
+   echo "$as_me:$LINENO: result: missing" >&5
+echo "${ECHO_T}missing" >&6
+fi
+
+echo "$as_me:$LINENO: checking for working automake" >&5
+echo $ECHO_N "checking for working automake... $ECHO_C" >&6
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (automake --version) < /dev/null > /dev/null 2>&1; then
+   AUTOMAKE=automake
+   echo "$as_me:$LINENO: result: found" >&5
+echo "${ECHO_T}found" >&6
+else
+   AUTOMAKE="$missing_dir/missing automake"
+   echo "$as_me:$LINENO: result: missing" >&5
+echo "${ECHO_T}missing" >&6
+fi
+
+echo "$as_me:$LINENO: checking for working autoheader" >&5
+echo $ECHO_N "checking for working autoheader... $ECHO_C" >&6
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (autoheader --version) < /dev/null > /dev/null 2>&1; then
+   AUTOHEADER=autoheader
+   echo "$as_me:$LINENO: result: found" >&5
+echo "${ECHO_T}found" >&6
+else
+   AUTOHEADER="$missing_dir/missing autoheader"
+   echo "$as_me:$LINENO: result: missing" >&5
+echo "${ECHO_T}missing" >&6
+fi
+
+echo "$as_me:$LINENO: checking for working makeinfo" >&5
+echo $ECHO_N "checking for working makeinfo... $ECHO_C" >&6
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (makeinfo --version) < /dev/null > /dev/null 2>&1; then
+   MAKEINFO=makeinfo
+   echo "$as_me:$LINENO: result: found" >&5
+echo "${ECHO_T}found" >&6
+else
+   MAKEINFO="$missing_dir/missing makeinfo"
+   echo "$as_me:$LINENO: result: missing" >&5
+echo "${ECHO_T}missing" >&6
+fi
+
+
+TOP=`pwd`
+
+echo "$as_me:$LINENO: checking location of OpenSP include files" >&5
+echo $ECHO_N "checking location of OpenSP include files... $ECHO_C" >&6
+# Check whether --enable-spincludedir or --disable-spincludedir was given.
+if test "${enable_spincludedir+set}" = set; then
+  enableval="$enable_spincludedir"
+  if test $enableval
+        then
+           echo "$as_me:$LINENO: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6
+           SPINCLUDEDIR="$enableval"
+        else
+           for d in ${prefix}/include/OpenSP /usr/local/include/OpenSP \
+             /usr/include/OpenSP; do
+            as_ac_File=`echo "ac_cv_file_$d" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $d" >&5
+echo $ECHO_N "checking for $d... $ECHO_C" >&6
+if eval "test \"\${$as_ac_File+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  test "$cross_compiling" = yes &&
+  { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5
+echo "$as_me: error: cannot check for file existence when cross compiling" >&2;}
+   { (exit 1); exit 1; }; }
+if test -r "$d"; then
+  eval "$as_ac_File=yes"
+else
+  eval "$as_ac_File=no"
+fi
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_File'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_File'}'`" >&6
+if test `eval echo '${'$as_ac_File'}'` = yes; then
+  SPINCLUDEDIR="$d"; break
+fi
+
+          done
+         fi
+else
+  for d in ${prefix}/include/OpenSP /usr/local/include/OpenSP \
+           /usr/include/OpenSP; do
+          as_ac_File=`echo "ac_cv_file_$d" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $d" >&5
+echo $ECHO_N "checking for $d... $ECHO_C" >&6
+if eval "test \"\${$as_ac_File+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  test "$cross_compiling" = yes &&
+  { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5
+echo "$as_me: error: cannot check for file existence when cross compiling" >&2;}
+   { (exit 1); exit 1; }; }
+if test -r "$d"; then
+  eval "$as_ac_File=yes"
+else
+  eval "$as_ac_File=no"
+fi
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_File'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_File'}'`" >&6
+if test `eval echo '${'$as_ac_File'}'` = yes; then
+  SPINCLUDEDIR="$d"; break
+fi
+
+        done
+fi;
+if test x${SPINCLUDEDIR} = x; then
+  { { echo "$as_me:$LINENO: error: \"OpenSP include files do not exist\"" >&5
+echo "$as_me: error: \"OpenSP include files do not exist\"" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+
+case "${SPINCLUDEDIR}" in
+  ${prefix}/include/OpenSP) osplibdir=${prefix}/lib ;;
+  /usr/local/include/OpenSP) osplibdir=/usr/local/lib ;;
+  *) osplibdir=/usr/lib ;;
+esac
+# On PPC64 libosp is to be found in /usr/lib64; thus
+# fall back to this directory
+test -d ${osplibdir}64 && osplibdir=${osplibdir}64
+echo "$as_me:$LINENO: checking location of OpenSP Library" >&5
+echo $ECHO_N "checking location of OpenSP Library... $ECHO_C" >&6
+# Check whether --enable-splibdir or --disable-splibdir was given.
+if test "${enable_splibdir+set}" = set; then
+  enableval="$enable_splibdir"
+  if test $enableval
+        then
+           echo "$as_me:$LINENO: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6
+           SPLIBDIR="$enableval"
+        else
+          echo "$as_me:$LINENO: result: $osplibdir" >&5
+echo "${ECHO_T}$osplibdir" >&6
+          SPLIBDIR=$osplibdir
+         fi
+else
+   echo "$as_me:$LINENO: result: $osplibdir" >&5
+echo "${ECHO_T}$osplibdir" >&6
+          SPLIBDIR=$osplibdir
+fi;
+unset osplibdir
+
+
+
+
+# Make sure we can run config.sub.
+$ac_config_sub sun4 >/dev/null 2>&1 ||
+  { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
+echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+   { (exit 1); exit 1; }; }
+
+echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6
+if test "${ac_cv_build+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_build_alias=$build_alias
+test -z "$ac_cv_build_alias" &&
+  ac_cv_build_alias=`$ac_config_guess`
+test -z "$ac_cv_build_alias" &&
+  { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+   { (exit 1); exit 1; }; }
+ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
+  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6
+build=$ac_cv_build
+build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6
+if test "${ac_cv_host+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_host_alias=$host_alias
+test -z "$ac_cv_host_alias" &&
+  ac_cv_host_alias=$ac_cv_build_alias
+ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
+  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6
+host=$ac_cv_host
+host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+
+if test "$CXXFLAGS" = ""; then
+  CXXFLAGS="-O2"
+fi
+
+echo 'saving distribution makefiles...'
+test ! -f Makefile.dist && test -f Makefile && cp Makefile Makefile.dist
+test ! -f Makefile.lib.dist && test -f Makefile.lib && cp Makefile.lib Makefile.lib.dist
+test ! -f Makefile.prog.dist && test -f Makefile.prog && cp Makefile.prog Makefile.prog.dist
+test ! -f Makefile.comm.dist && test -f Makefile.comm && cp Makefile.comm Makefile.comm.dist
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    set dummy "$as_dir/$ac_word" ${1+"$@"}
+    shift
+    ac_cv_prog_CC="$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CC" && break
+done
+
+  CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH" >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH" >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+     "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:$LINENO: checking for C compiler default output" >&5
+echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+  (eval $ac_link_default) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Find the output, starting from the most likely.  This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+for ac_file in `ls a_out.exe a.exe conftest.exe 2>/dev/null;
+                ls a.out conftest 2>/dev/null;
+                ls a.* conftest.* 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.o | *.obj | *.xcoff | *.tds | *.d | *.pdb | *.xSYM ) ;;
+    a.out ) # We found the default executable, but exeext='' is most
+            # certainly right.
+            break;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+          # FIXME: I believe we export ac_cv_exeext for Libtool --akim.
+          export ac_cv_exeext
+          break;;
+    * ) break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables" >&5
+echo "$as_me: error: C compiler cannot create executables" >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+       cross_compiling=yes
+    else
+       { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in `(ls conftest.exe; ls conftest; ls conftest.*) 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.o | *.obj | *.xcoff | *.tds | *.d | *.pdb ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+          export ac_cv_exeext
+          break;;
+    * ) break;;
+  esac
+done
+else
+  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link" >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile" >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_compiler_gnu=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+# Some people use a C++ compiler to compile C.  Since we use `exit',
+# in C++ we need to declare it.  In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+  choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  for ac_declaration in \
+   ''\
+   '#include <stdlib.h>' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+$ac_declaration
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+continue
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_declaration
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo $ac_declaration      >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+          if test $ac_prog = install &&
+            grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+            # AIX install.  It has an incompatible calling convention.
+            :
+          elif test $ac_prog = install &&
+            grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+            # program-specific install script used by HP pwplus--don't use.
+            :
+          else
+            ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+            break 3
+          fi
+        fi
+      done
+    done
+    ;;
+esac
+done
+
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL=$ac_install_sh
+  fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo "$as_me:$LINENO: checking whether ln -s works" >&5
+echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+  echo "$as_me:$LINENO: result: no, using $LN_S" >&5
+echo "${ECHO_T}no, using $LN_S" >&6
+fi
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  echo "$as_me:$LINENO: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+echo "${ECHO_T}$ac_ct_CXX" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CXX" && break
+done
+test -n "$ac_ct_CXX" || ac_ct_CXX="g++"
+
+  CXX=$ac_ct_CXX
+fi
+
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+     "checking for C++ compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_compiler_gnu=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6
+GXX=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+CXXFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cxx_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cxx_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_prog_cxx_g=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+for ac_declaration in \
+   ''\
+   '#include <stdlib.h>' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+$ac_declaration
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+continue
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_declaration
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo $ac_declaration      >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+for ac_prog in perl
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_PERL+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $PERL in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PERL="$PERL" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  ;;
+esac
+fi
+PERL=$ac_cv_path_PERL
+
+if test -n "$PERL"; then
+  echo "$as_me:$LINENO: result: $PERL" >&5
+echo "${ECHO_T}$PERL" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$PERL" && break
+done
+test -n "$PERL" || PERL="perl"
+
+test "$INSTALL" = "./config/install-sh -c" && INSTALL=`pwd`"/config/install-sh -c"
+
+
+case "${host}" in
+  *-*-darwin*)
+    LINKFLAGS="-no-undefined"
+    ;;
+  *)
+    if test "$GXX"
+    then
+       echo "$as_me:$LINENO: checking whether GNU C++ supports automatic template instantiation" >&5
+echo $ECHO_N "checking whether GNU C++ supports automatic template instantiation... $ECHO_C" >&6
+if test "${ac_cv_c_gnu_automatic_templates+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <assert.h>
+                     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  egrep -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  egrep -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <assert.h>
+                     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  egrep -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  egrep -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check" >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 8)
+  yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "yes" >/dev/null 2>&1; then
+  ac_cv_c_gnu_automatic_templates=yes
+else
+  ac_cv_c_gnu_automatic_templates=no
+fi
+rm -f conftest*
+
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_gnu_automatic_templates" >&5
+echo "${ECHO_T}$ac_cv_c_gnu_automatic_templates" >&6
+        if test "$ac_cv_c_gnu_automatic_templates" = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define SP_DEFINE_TEMPLATES 1
+_ACEOF
+
+        else
+
+cat >>confdefs.h <<\_ACEOF
+#define SP_MANUAL_INST 1
+_ACEOF
+
+            CXXFLAGS="$CXXFLAGS -fno-implicit-templates"
+        fi
+    fi
+    ;;
+esac
+
+echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+if test "${ac_cv_header_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  egrep -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_cv_header_stdc=yes
+else
+  echo "$as_me: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  ac_cv_header_stdc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "memchr" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "free" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then
+  :
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <ctype.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \
+                     || ('j' <= (c) && (c) <= 'r') \
+                     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+        || toupper (i) != TOUPPER (i))
+      exit(2);
+  exit (0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+
+
+
+
+
+
+
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+                  inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+eval "$as_ac_Header=no"
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+for ac_header in limits.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+  # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_header_compiler=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  egrep -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc in
+  yes:no )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
+  no:yes )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX                  -qlanglvl=ansi
+# Ultrix and OSF/1     -std1
+# HP-UX 10.20 and later        -Ae
+# HP-UX older versions -Aa -D_HPUX_SOURCE
+# SVR4                 -Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+  x|xno)
+    echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+  *)
+    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+    CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
+echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6
+if test "${ac_cv_c_const+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+/* FIXME: Include the comments suggested by Paul. */
+#ifndef __cplusplus
+  /* Ultrix mips cc rejects this.  */
+  typedef int charset[2];
+  const charset x;
+  /* SunOS 4.1.1 cc rejects this.  */
+  char const *const *ccp;
+  char **p;
+  /* NEC SVR4.0.2 mips cc rejects this.  */
+  struct point {int x, y;};
+  static struct point const zero = {0,0};
+  /* AIX XL C 1.02.0.0 rejects this.
+     It does not let you subtract one const X* pointer from another in
+     an arm of an if-expression whose if-part is not a constant
+     expression */
+  const char *g = "string";
+  ccp = &g + (g ? g-g : 0);
+  /* HPUX 7.0 cc rejects these. */
+  ++ccp;
+  p = (char**) ccp;
+  ccp = (char const *const *) p;
+  { /* SCO 3.2v4 cc rejects this.  */
+    char *t;
+    char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+    *t++ = 0;
+  }
+  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+    int x[] = {25, 17};
+    const int *foo = &x[0];
+    ++foo;
+  }
+  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+    typedef const int *iptr;
+    iptr p = 0;
+    ++p;
+  }
+  { /* AIX XL C 1.02.0.0 rejects this saying
+       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+    struct s { int j; const int *ap[3]; };
+    struct s *b; b->j = 5;
+  }
+  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+    const int foo = 10;
+  }
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_c_const=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_c_const=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
+echo "${ECHO_T}$ac_cv_c_const" >&6
+if test $ac_cv_c_const = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define const
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for inline" >&5
+echo $ECHO_N "checking for inline... $ECHO_C" >&6
+if test "${ac_cv_c_inline+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#ifndef __cplusplus
+static $ac_kw int static_foo () {return 0; }
+$ac_kw int foo () {return 0; }
+#endif
+
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_c_inline=$ac_kw; break
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+done
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5
+echo "${ECHO_T}$ac_cv_c_inline" >&6
+case $ac_cv_c_inline in
+  inline | yes) ;;
+  no)
+cat >>confdefs.h <<\_ACEOF
+#define inline
+_ACEOF
+ ;;
+  *)  cat >>confdefs.h <<_ACEOF
+#define inline $ac_cv_c_inline
+_ACEOF
+ ;;
+esac
+
+echo "$as_me:$LINENO: checking for size_t" >&5
+echo $ECHO_N "checking for size_t... $ECHO_C" >&6
+if test "${ac_cv_type_size_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+if ((size_t *) 0)
+  return 0;
+if (sizeof (size_t))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_size_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_type_size_t=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5
+echo "${ECHO_T}$ac_cv_type_size_t" >&6
+if test $ac_cv_type_size_t = yes; then
+  :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned
+_ACEOF
+
+fi
+
+
+echo "$as_me:$LINENO: checking for struct stat.st_blksize" >&5
+echo $ECHO_N "checking for struct stat.st_blksize... $ECHO_C" >&6
+if test "${ac_cv_member_struct_stat_st_blksize+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+static struct stat ac_aggr;
+if (ac_aggr.st_blksize)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_member_struct_stat_st_blksize=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_member_struct_stat_st_blksize=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_member_struct_stat_st_blksize" >&5
+echo "${ECHO_T}$ac_cv_member_struct_stat_st_blksize" >&6
+if test $ac_cv_member_struct_stat_st_blksize = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_STAT_ST_BLKSIZE 1
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ST_BLKSIZE 1
+_ACEOF
+
+fi
+
+
+echo "$as_me:$LINENO: checking for sig_atomic_t in signal.h" >&5
+echo $ECHO_N "checking for sig_atomic_t in signal.h... $ECHO_C" >&6
+if test "${ac_cv_have_sig_atomic_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <signal.h>
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+sig_atomic_t x;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_have_sig_atomic_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_have_sig_atomic_t=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_sig_atomic_t" >&5
+echo "${ECHO_T}$ac_cv_have_sig_atomic_t" >&6
+if test "$ac_cv_have_sig_atomic_t" = "no"
+then
+    echo "$as_me:$LINENO: checking for sig_atomic_t" >&5
+echo $ECHO_N "checking for sig_atomic_t... $ECHO_C" >&6
+if test "${ac_cv_type_sig_atomic_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+if ((sig_atomic_t *) 0)
+  return 0;
+if (sizeof (sig_atomic_t))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_sig_atomic_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_type_sig_atomic_t=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_sig_atomic_t" >&5
+echo "${ECHO_T}$ac_cv_type_sig_atomic_t" >&6
+if test $ac_cv_type_sig_atomic_t = yes; then
+  :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define sig_atomic_t int
+_ACEOF
+
+fi
+
+fi
+
+echo "$as_me:$LINENO: checking for size_t" >&5
+echo $ECHO_N "checking for size_t... $ECHO_C" >&6
+if test "${ac_cv_type_size_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+if ((size_t *) 0)
+  return 0;
+if (sizeof (size_t))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_size_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_type_size_t=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5
+echo "${ECHO_T}$ac_cv_type_size_t" >&6
+
+echo "$as_me:$LINENO: checking size of size_t" >&5
+echo $ECHO_N "checking size of size_t... $ECHO_C" >&6
+if test "${ac_cv_sizeof_size_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$ac_cv_type_size_t" = yes; then
+  # The cast to unsigned long works around a bug in the HP C Compiler
+  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+  # This bug is HP SR number 8606223364.
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (size_t))) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (size_t))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_lo=`expr $ac_mid + 1`
+                    if test $ac_lo -le $ac_mid; then
+                      ac_lo= ac_hi=
+                      break
+                    fi
+                    ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (size_t))) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (size_t))) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_hi=`expr '(' $ac_mid ')' - 1`
+                       if test $ac_mid -le $ac_hi; then
+                         ac_lo= ac_hi=
+                         break
+                       fi
+                       ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_lo= ac_hi=
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (size_t))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_size_t=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (size_t), 77" >&5
+echo "$as_me: error: cannot compute sizeof (size_t), 77" >&2;}
+   { (exit 1); exit 1; }; } ;;
+esac
+else
+  if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling" >&5
+echo "$as_me: error: cannot run test program while cross compiling" >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+long longval () { return (long) (sizeof (size_t)); }
+unsigned long ulongval () { return (long) (sizeof (size_t)); }
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    exit (1);
+  if (((long) (sizeof (size_t))) < 0)
+    {
+      long i = longval ();
+      if (i != ((long) (sizeof (size_t))))
+       exit (1);
+      fprintf (f, "%ld\n", i);
+    }
+  else
+    {
+      unsigned long i = ulongval ();
+      if (i != ((long) (sizeof (size_t))))
+       exit (1);
+      fprintf (f, "%lu\n", i);
+    }
+  exit (ferror (f) || fclose (f) != 0);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_sizeof_size_t=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (size_t), 77" >&5
+echo "$as_me: error: cannot compute sizeof (size_t), 77" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+  ac_cv_sizeof_size_t=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_size_t" >&5
+echo "${ECHO_T}$ac_cv_sizeof_size_t" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_SIZE_T $ac_cv_sizeof_size_t
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for unsigned int" >&5
+echo $ECHO_N "checking for unsigned int... $ECHO_C" >&6
+if test "${ac_cv_type_unsigned_int+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+if ((unsigned int *) 0)
+  return 0;
+if (sizeof (unsigned int))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_unsigned_int=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_type_unsigned_int=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_unsigned_int" >&5
+echo "${ECHO_T}$ac_cv_type_unsigned_int" >&6
+
+echo "$as_me:$LINENO: checking size of unsigned int" >&5
+echo $ECHO_N "checking size of unsigned int... $ECHO_C" >&6
+if test "${ac_cv_sizeof_unsigned_int+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$ac_cv_type_unsigned_int" = yes; then
+  # The cast to unsigned long works around a bug in the HP C Compiler
+  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+  # This bug is HP SR number 8606223364.
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned int))) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned int))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_lo=`expr $ac_mid + 1`
+                    if test $ac_lo -le $ac_mid; then
+                      ac_lo= ac_hi=
+                      break
+                    fi
+                    ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned int))) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned int))) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_hi=`expr '(' $ac_mid ')' - 1`
+                       if test $ac_mid -le $ac_hi; then
+                         ac_lo= ac_hi=
+                         break
+                       fi
+                       ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_lo= ac_hi=
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned int))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_unsigned_int=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned int), 77" >&5
+echo "$as_me: error: cannot compute sizeof (unsigned int), 77" >&2;}
+   { (exit 1); exit 1; }; } ;;
+esac
+else
+  if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling" >&5
+echo "$as_me: error: cannot run test program while cross compiling" >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+long longval () { return (long) (sizeof (unsigned int)); }
+unsigned long ulongval () { return (long) (sizeof (unsigned int)); }
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    exit (1);
+  if (((long) (sizeof (unsigned int))) < 0)
+    {
+      long i = longval ();
+      if (i != ((long) (sizeof (unsigned int))))
+       exit (1);
+      fprintf (f, "%ld\n", i);
+    }
+  else
+    {
+      unsigned long i = ulongval ();
+      if (i != ((long) (sizeof (unsigned int))))
+       exit (1);
+      fprintf (f, "%lu\n", i);
+    }
+  exit (ferror (f) || fclose (f) != 0);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_sizeof_unsigned_int=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned int), 77" >&5
+echo "$as_me: error: cannot compute sizeof (unsigned int), 77" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+  ac_cv_sizeof_unsigned_int=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_unsigned_int" >&5
+echo "${ECHO_T}$ac_cv_sizeof_unsigned_int" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED_INT $ac_cv_sizeof_unsigned_int
+_ACEOF
+
+
+
+
+echo "$as_me:$LINENO: checking for setlocale" >&5
+echo $ECHO_N "checking for setlocale... $ECHO_C" >&6
+if test "${ac_cv_func_setlocale+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char setlocale (); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char setlocale ();
+char (*f) ();
+
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_setlocale) || defined (__stub___setlocale)
+choke me
+#else
+f = setlocale;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_setlocale=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_func_setlocale=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_setlocale" >&5
+echo "${ECHO_T}$ac_cv_func_setlocale" >&6
+if test $ac_cv_func_setlocale = yes; then
+  cat >>confdefs.h <<\_ACEOF
+#define SP_HAVE_LOCALE 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for towupper" >&5
+echo $ECHO_N "checking for towupper... $ECHO_C" >&6
+if test "${ac_cv_func_towupper+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char towupper (); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char towupper ();
+char (*f) ();
+
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_towupper) || defined (__stub___towupper)
+choke me
+#else
+f = towupper;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_towupper=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_func_towupper=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_towupper" >&5
+echo "${ECHO_T}$ac_cv_func_towupper" >&6
+if test $ac_cv_func_towupper = yes; then
+  cat >>confdefs.h <<\_ACEOF
+#define SP_HAVE_WCHAR 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for gettext" >&5
+echo $ECHO_N "checking for gettext... $ECHO_C" >&6
+if test "${ac_cv_func_gettext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char gettext (); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char gettext ();
+char (*f) ();
+
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_gettext) || defined (__stub___gettext)
+choke me
+#else
+f = gettext;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_gettext=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_func_gettext=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_gettext" >&5
+echo "${ECHO_T}$ac_cv_func_gettext" >&6
+if test $ac_cv_func_gettext = yes; then
+  cat >>confdefs.h <<\_ACEOF
+#define SP_HAVE_GETTEXT 1
+_ACEOF
+
+else
+  echo "$as_me:$LINENO: checking for gettext in -lintl" >&5
+echo $ECHO_N "checking for gettext in -lintl... $ECHO_C" >&6
+if test "${ac_cv_lib_intl_gettext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lintl  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char gettext ();
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+gettext ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_intl_gettext=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_lib_intl_gettext=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_intl_gettext" >&5
+echo "${ECHO_T}$ac_cv_lib_intl_gettext" >&6
+if test $ac_cv_lib_intl_gettext = yes; then
+  cat >>confdefs.h <<\_ACEOF
+#define SP_HAVE_GETTEXT 1
+_ACEOF
+ LIBS="$LIBS -lintl"
+fi
+
+fi
+
+
+echo "$as_me:$LINENO: checking for cthread_fork in -lthreads" >&5
+echo $ECHO_N "checking for cthread_fork in -lthreads... $ECHO_C" >&6
+if test "${ac_cv_lib_threads_cthread_fork+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lthreads  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char cthread_fork ();
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+cthread_fork ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_threads_cthread_fork=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_lib_threads_cthread_fork=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_threads_cthread_fork" >&5
+echo "${ECHO_T}$ac_cv_lib_threads_cthread_fork" >&6
+if test $ac_cv_lib_threads_cthread_fork = yes; then
+  LIB_THREADS="-lthreads"
+else
+  LIB_THREADS=""
+fi
+
+
+
+
+
+
+       echo "$as_me:$LINENO: checking whether size_t is unsigned int" >&5
+echo $ECHO_N "checking whether size_t is unsigned int... $ECHO_C" >&6
+       ac_cv_size_t_is_uint=no
+
+
+       ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+       cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <unistd.h>
+
+                       template<class T> class foo { };
+
+
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+                       foo<size_t> x;
+                       foo<unsigned int> y;
+                       x = y;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_size_t_is_uint=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+       ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+       echo "$as_me:$LINENO: result: $ac_cv_size_t_is_uint" >&5
+echo "${ECHO_T}$ac_cv_size_t_is_uint" >&6
+       test "$ac_cv_size_t_is_uint" = "yes" && cat >>confdefs.h <<\_ACEOF
+#define SIZE_T_IS_UINT 1
+_ACEOF
+
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+echo "$as_me:$LINENO: checking support for bool" >&5
+echo $ECHO_N "checking support for bool... $ECHO_C" >&6
+if test "${ac_cv_typedef_bool+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+bool x; x=(false | true);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_typedef_bool=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_typedef_bool=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_typedef_bool" >&5
+echo "${ECHO_T}$ac_cv_typedef_bool" >&6
+if test "$ac_cv_typedef_bool" = "yes"
+then
+    cat >>confdefs.h <<\_ACEOF
+#define SP_HAVE_BOOL 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for ANSI template instantiation" >&5
+echo $ECHO_N "checking for ANSI template instantiation... $ECHO_C" >&6
+if test "${ac_cv_c_template_ansi+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+class foo {
+};
+
+template<class T> class test {
+public:
+ T *data();};
+template class test<foo>;
+
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_c_template_ansi=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_c_template_ansi=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_template_ansi" >&5
+echo "${ECHO_T}$ac_cv_c_template_ansi" >&6
+if test "$ac_cv_c_template_ansi" = "yes"
+ then
+  cat >>confdefs.h <<\_ACEOF
+#define SP_ANSI_CLASS_INST 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking whether to include support for http" >&5
+echo $ECHO_N "checking whether to include support for http... $ECHO_C" >&6
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
+echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6
+if test -z "$CXXCPP"; then
+  if test "${ac_cv_prog_CXXCPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CXXCPP needs to be expanded
+    for CXXCPP in "$CXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <assert.h>
+                     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  egrep -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  egrep -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+  CXXCPP=$ac_cv_prog_CXXCPP
+else
+  ac_cv_prog_CXXCPP=$CXXCPP
+fi
+echo "$as_me:$LINENO: result: $CXXCPP" >&5
+echo "${ECHO_T}$CXXCPP" >&6
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <assert.h>
+                     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  egrep -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  egrep -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check" >&5
+echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+# Check whether --enable-http or --disable-http was given.
+if test "${enable_http+set}" = set; then
+  enableval="$enable_http"
+  if test $enableval
+    then
+        echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+       cat >>confdefs.h <<\_ACEOF
+#define SP_HAVE_SOCKET 1
+_ACEOF
+
+       echo "$as_me:$LINENO: checking for main in -lnsl" >&5
+echo $ECHO_N "checking for main in -lnsl... $ECHO_C" >&6
+if test "${ac_cv_lib_nsl_main+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnsl  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+main ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_nsl_main=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_lib_nsl_main=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_main" >&5
+echo "${ECHO_T}$ac_cv_lib_nsl_main" >&6
+if test $ac_cv_lib_nsl_main = yes; then
+  LIBS="$LIBS -lnsl"
+fi
+
+       echo "$as_me:$LINENO: checking for main in -lsocket" >&5
+echo $ECHO_N "checking for main in -lsocket... $ECHO_C" >&6
+if test "${ac_cv_lib_socket_main+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsocket  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+main ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_socket_main=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_lib_socket_main=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_socket_main" >&5
+echo "${ECHO_T}$ac_cv_lib_socket_main" >&6
+if test $ac_cv_lib_socket_main = yes; then
+  LIBS="$LIBS -lsocket"
+fi
+
+       echo "$as_me:$LINENO: checking h_errno in netdb.h" >&5
+echo $ECHO_N "checking h_errno in netdb.h... $ECHO_C" >&6
+       cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <netdb.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "h_errno" >/dev/null 2>&1; then
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+  cat >>confdefs.h <<\_ACEOF
+#define SP_DECLARE_H_ERRNO 1
+_ACEOF
+
+           echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+rm -f conftest*
+
+    else
+        echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+    fi
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi;
+
+
+    echo "$as_me:$LINENO: checking whether to enable support for FrameMaker MIF output" >&5
+echo $ECHO_N "checking whether to enable support for FrameMaker MIF output... $ECHO_C" >&6
+    # Check whether --enable-mif or --disable-mif was given.
+if test "${enable_mif+set}" = set; then
+  enableval="$enable_mif"
+   if test "$enableval" = yes; then
+            echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+            cat >>confdefs.h <<\_ACEOF
+#define JADE_MIF 1
+_ACEOF
+
+        else
+            echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+            cat >>confdefs.h <<\_ACEOF
+#define DUMMY 1
+_ACEOF
+
+        fi
+else
+   echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+             cat >>confdefs.h <<\_ACEOF
+#define JADE_MIF 1
+_ACEOF
+
+fi;
+
+    echo "$as_me:$LINENO: checking whether to enable support for HTML+CSS output" >&5
+echo $ECHO_N "checking whether to enable support for HTML+CSS output... $ECHO_C" >&6
+    # Check whether --enable-html or --disable-html was given.
+if test "${enable_html+set}" = set; then
+  enableval="$enable_html"
+   if test "$enableval" = yes; then
+            echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+            cat >>confdefs.h <<\_ACEOF
+#define JADE_HTML 1
+_ACEOF
+
+        else
+            echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+            cat >>confdefs.h <<\_ACEOF
+#define DUMMY 1
+_ACEOF
+
+        fi
+else
+   echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+             cat >>confdefs.h <<\_ACEOF
+#define JADE_HTML 1
+_ACEOF
+
+fi;
+
+
+cat >>confdefs.h <<\_ACEOF
+#define SP_MULTI_BYTE 1
+_ACEOF
+
+echo "$as_me:$LINENO: checking for default catalog" >&5
+echo $ECHO_N "checking for default catalog... $ECHO_C" >&6
+# Check whether --enable-default-catalog or --disable-default-catalog was given.
+if test "${enable_default_catalog+set}" = set; then
+  enableval="$enable_default_catalog"
+  if test $enableval
+               then
+                echo "$as_me:$LINENO: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6
+                cat >>confdefs.h <<_ACEOF
+#define SGML_CATALOG_FILES_DEFAULT "$enableval"
+_ACEOF
+
+               else
+                echo "$as_me:$LINENO: result: none" >&5
+echo "${ECHO_T}none" >&6
+              fi
+else
+  echo "$as_me:$LINENO: result: none" >&5
+echo "${ECHO_T}none" >&6
+fi;
+echo "$as_me:$LINENO: checking for default search path" >&5
+echo $ECHO_N "checking for default search path... $ECHO_C" >&6
+# Check whether --enable-default-search-path or --disable-default-search-path was given.
+if test "${enable_default_search_path+set}" = set; then
+  enableval="$enable_default_search_path"
+  if test $enableval
+    then
+        echo "$as_me:$LINENO: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6
+       cat >>confdefs.h <<_ACEOF
+#define SGML_SEARCH_PATH_DEFAULT "$enableval"
+_ACEOF
+
+    else
+        echo "$as_me:$LINENO: result: none" >&5
+echo "${ECHO_T}none" >&6
+    fi
+else
+  echo "$as_me:$LINENO: result: none" >&5
+echo "${ECHO_T}none" >&6
+fi;
+
+
+# Check whether --enable-shared or --disable-shared was given.
+if test "${enable_shared+set}" = set; then
+  enableval="$enable_shared"
+  p=${PACKAGE-default}
+case $enableval in
+yes) enable_shared=yes ;;
+no) enable_shared=no ;;
+*)
+  enable_shared=no
+  # Look at the argument we got.  We use all the common list separators.
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+  for pkg in $enableval; do
+    if test "X$pkg" = "X$p"; then
+      enable_shared=yes
+    fi
+  done
+  IFS="$ac_save_ifs"
+  ;;
+esac
+else
+  enable_shared=yes
+fi;
+# Check whether --enable-static or --disable-static was given.
+if test "${enable_static+set}" = set; then
+  enableval="$enable_static"
+  p=${PACKAGE-default}
+case $enableval in
+yes) enable_static=yes ;;
+no) enable_static=no ;;
+*)
+  enable_static=no
+  # Look at the argument we got.  We use all the common list separators.
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+  for pkg in $enableval; do
+    if test "X$pkg" = "X$p"; then
+      enable_static=yes
+    fi
+  done
+  IFS="$ac_save_ifs"
+  ;;
+esac
+else
+  enable_static=yes
+fi;
+# Check whether --enable-fast-install or --disable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then
+  enableval="$enable_fast_install"
+  p=${PACKAGE-default}
+case $enableval in
+yes) enable_fast_install=yes ;;
+no) enable_fast_install=no ;;
+*)
+  enable_fast_install=no
+  # Look at the argument we got.  We use all the common list separators.
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+  for pkg in $enableval; do
+    if test "X$pkg" = "X$p"; then
+      enable_fast_install=yes
+    fi
+  done
+  IFS="$ac_save_ifs"
+  ;;
+esac
+else
+  enable_fast_install=yes
+fi;
+
+# Check whether --with-gnu-ld or --without-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+  withval="$with_gnu_ld"
+  test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi;
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  echo "$as_me:$LINENO: checking for ld used by GCC" >&5
+echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | [A-Za-z]:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the path of ld
+      ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+       ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
+else
+  echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
+fi
+if test "${lt_cv_path_LD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$LD"; then
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some GNU ld's only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      if "$lt_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+       test "$with_gnu_ld" != no && break
+      else
+       test "$with_gnu_ld" != yes && break
+      fi
+    fi
+  done
+  IFS="$ac_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+   { (exit 1); exit 1; }; }
+echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
+if test "${lt_cv_prog_gnu_ld+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
+  lt_cv_prog_gnu_ld=yes
+else
+  lt_cv_prog_gnu_ld=no
+fi
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5
+echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6
+if test "${lt_cv_ld_reload_flag+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_ld_reload_flag='-r'
+fi
+echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5
+echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6
+reload_flag=$lt_cv_ld_reload_flag
+test -n "$reload_flag" && reload_flag=" $reload_flag"
+
+echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5
+echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6
+if test "${lt_cv_path_NM+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+  for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do
+    test -z "$ac_dir" && ac_dir=.
+    tmp_nm=$ac_dir/${ac_tool_prefix}nm
+    if test -f $tmp_nm || test -f $tmp_nm$ac_exeext ; then
+      # Check to see if the nm accepts a BSD-compat flag.
+      # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+      #   nm: unknown option "B" ignored
+      # Tru64's nm complains that /dev/null is an invalid object file
+      if ($tmp_nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep '(/dev/null|Invalid file or object type)' >/dev/null; then
+       lt_cv_path_NM="$tmp_nm -B"
+       break
+      elif ($tmp_nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+       lt_cv_path_NM="$tmp_nm -p"
+       break
+      else
+       lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+       continue # so that we can try to find one that supports BSD flags
+      fi
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
+fi
+fi
+
+NM="$lt_cv_path_NM"
+echo "$as_me:$LINENO: result: $NM" >&5
+echo "${ECHO_T}$NM" >&6
+
+echo "$as_me:$LINENO: checking how to recognise dependant libraries" >&5
+echo $ECHO_N "checking how to recognise dependant libraries... $ECHO_C" >&6
+if test "${lt_cv_deplibs_check_method+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# ['file_magic [regex]'] -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given egrep regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix4* | aix5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi4*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin* | mingw* | pw32*)
+  lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method='file_magic Mach-O dynamically linked shared library'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  case "$host_os" in
+  rhapsody* | darwin1.012)
+    lt_cv_file_magic_test_file=`echo /System/Library/Frameworks/System.framework/Versions/*/System | head -1`
+    ;;
+  *) # Darwin 1.3 on
+    lt_cv_file_magic_test_file='/usr/lib/libSystem.dylib'
+    ;;
+  esac
+  ;;
+
+freebsd*)
+  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[3-9]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20*|hpux11*)
+  lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libc.sl
+  ;;
+
+irix5* | irix6*)
+  case $host_os in
+  irix5*)
+    # this will be overridden with pass_all, but let us keep it just in case
+    lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1"
+    ;;
+  *)
+    case $LD in
+    *-32|*"-32 ") libmagic=32-bit;;
+    *-n32|*"-n32 ") libmagic=N32;;
+    *-64|*"-64 ") libmagic=64-bit;;
+    *) libmagic=never-match;;
+    esac
+    # this will be overridden with pass_all, but let us keep it just in case
+    lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[1234] dynamic lib MIPS - version 1"
+    ;;
+  esac
+  lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*`
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be Linux ELF.
+linux-gnu*)
+  case $host_cpu in
+  alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | s390* )
+    lt_cv_deplibs_check_method=pass_all ;;
+  *)
+    # glibc up to 2.1.1 does not perform some relocations on ARM
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;;
+  esac
+  lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
+  ;;
+
+netbsd*)
+  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+osf3* | osf4* | osf5*)
+  # this will be overridden with pass_all, but let us keep it just in case
+  lt_cv_deplibs_check_method='file_magic COFF format alpha shared library'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sco3.2v5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  lt_cv_file_magic_test_file=/lib/libc.so
+  ;;
+
+sysv5uw[78]* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  esac
+  ;;
+esac
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5
+echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+
+
+
+
+
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+echo "$as_me:$LINENO: checking command to parse $NM output" >&5
+echo $ECHO_N "checking command to parse $NM output... $ECHO_C" >&6
+if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Transform the above into a raw symbol and a C symbol.
+symxfrm='\1 \2\3 \3'
+
+# Transform an extracted symbol line into a proper C declaration
+lt_cv_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'"
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[BCDT]'
+  ;;
+cygwin* | mingw* | pw32*)
+  symcode='[ABCDGISTW]'
+  ;;
+hpux*) # Its linker distinguishes data from code symbols
+  lt_cv_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+  ;;
+irix*)
+  symcode='[BCDEGRST]'
+  ;;
+solaris* | sysv5*)
+  symcode='[BDT]'
+  ;;
+sysv4)
+  symcode='[DFNSTU]'
+  ;;
+esac
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $host_os in
+mingw*)
+  opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
+  symcode='[ABCDGISTW]'
+fi
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Write the raw and C identifiers.
+lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[        ]\($symcode$symcode*\)[         ][      ]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+  rm -f conftest*
+  cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+EOF
+
+  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5
+  (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+       mv -f "$nlist"T "$nlist"
+      else
+       rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if egrep ' nm_test_var$' "$nlist" >/dev/null; then
+       if egrep ' nm_test_func$' "$nlist" >/dev/null; then
+         cat <<EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+         # Now generate the symbol file.
+         eval "$lt_cv_global_symbol_to_cdecl"' < "$nlist" >> conftest.$ac_ext'
+
+         cat <<EOF >> conftest.$ac_ext
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+  const char *name;
+  lt_ptr_t address;
+}
+lt_preloaded_symbols[] =
+{
+EOF
+         sed "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" >> conftest.$ac_ext
+         cat <<\EOF >> conftest.$ac_ext
+  {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+         # Now try linking the two files.
+         mv conftest.$ac_objext conftstm.$ac_objext
+         save_LIBS="$LIBS"
+         save_CFLAGS="$CFLAGS"
+         LIBS="conftstm.$ac_objext"
+         CFLAGS="$CFLAGS$no_builtin_flag"
+         if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && test -s conftest; then
+           pipe_works=yes
+         fi
+         LIBS="$save_LIBS"
+         CFLAGS="$save_CFLAGS"
+       else
+         echo "cannot find nm_test_func in $nlist" >&5
+       fi
+      else
+       echo "cannot find nm_test_var in $nlist" >&5
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+    fi
+  else
+    echo "$progname: failed program was:" >&5
+    cat conftest.$ac_ext >&5
+  fi
+  rm -f conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+
+fi
+
+global_symbol_pipe="$lt_cv_sys_global_symbol_pipe"
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  global_symbol_to_cdecl=
+else
+  global_symbol_to_cdecl="$lt_cv_global_symbol_to_cdecl"
+fi
+if test -z "$global_symbol_pipe$global_symbol_to_cdecl"; then
+  echo "$as_me:$LINENO: result: failed" >&5
+echo "${ECHO_T}failed" >&6
+else
+  echo "$as_me:$LINENO: result: ok" >&5
+echo "${ECHO_T}ok" >&6
+fi
+
+
+for ac_header in dlfcn.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+  # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_header_compiler=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  egrep -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc in
+  yes:no )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
+  no:yes )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+# Only perform the check for file, if the check method requires it
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5
+echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $MAGIC_CMD in
+  /*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+  ?:/*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path.
+  ;;
+  *)
+  ac_save_MAGIC_CMD="$MAGIC_CMD"
+  IFS="${IFS=   }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="/usr/bin:$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/${ac_tool_prefix}file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+      if test -n "$file_magic_test_file"; then
+       case $deplibs_check_method in
+       "file_magic "*)
+         file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`"
+         MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+         if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+           egrep "$file_magic_regex" > /dev/null; then
+           :
+         else
+           cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+EOF
+         fi ;;
+       esac
+      fi
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  MAGIC_CMD="$ac_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+echo "${ECHO_T}$MAGIC_CMD" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    echo "$as_me:$LINENO: checking for file" >&5
+echo $ECHO_N "checking for file... $ECHO_C" >&6
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $MAGIC_CMD in
+  /*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+  ?:/*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path.
+  ;;
+  *)
+  ac_save_MAGIC_CMD="$MAGIC_CMD"
+  IFS="${IFS=   }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="/usr/bin:$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/file"
+      if test -n "$file_magic_test_file"; then
+       case $deplibs_check_method in
+       "file_magic "*)
+         file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`"
+         MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+         if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+           egrep "$file_magic_regex" > /dev/null; then
+           :
+         else
+           cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+EOF
+         fi ;;
+       esac
+      fi
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  MAGIC_CMD="$ac_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+echo "${ECHO_T}$MAGIC_CMD" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  else
+    MAGIC_CMD=:
+  fi
+fi
+
+  fi
+  ;;
+esac
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  RANLIB=$ac_ct_RANLIB
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  STRIP=$ac_ct_STRIP
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+
+enable_dlopen=no
+enable_win32_dll=no
+
+# Check whether --enable-libtool-lock or --disable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then
+  enableval="$enable_libtool_lock"
+
+fi;
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '#line 6836 "configure"' > conftest.$ac_ext
+  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+    case `/usr/bin/file conftest.$ac_objext` in
+    *32-bit*)
+      LD="${LD-ld} -32"
+      ;;
+    *N32*)
+      LD="${LD-ld} -n32"
+      ;;
+    *64-bit*)
+      LD="${LD-ld} -64"
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5
+echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6
+if test "${lt_cv_cc_needs_belf+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+
+     ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+     cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  lt_cv_cc_needs_belf=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+lt_cv_cc_needs_belf=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+     ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5
+echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+
+
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e s/^X//'
+sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Constants:
+rm="rm -f"
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except M$VC,
+# which needs '.lib').
+libext=a
+ltmain="$ac_aux_dir/ltmain.sh"
+ofile="$default_ofile"
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+need_locks="$enable_libtool_lock"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+test -z "$AS" && AS=as
+test -z "$CC" && CC=cc
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$LD" && LD=ld
+test -z "$LN_S" && LN_S="ln -s"
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+test -z "$NM" && NM=nm
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$RANLIB" && RANLIB=:
+test -z "$STRIP" && STRIP=:
+test -z "$ac_objext" && ac_objext=o
+
+if test x"$host" != x"$build"; then
+  ac_tool_prefix=${host_alias}-
+else
+  ac_tool_prefix=
+fi
+
+# Transform linux* to *-*-linux-gnu*, to support old configure scripts.
+case $host_os in
+linux-gnu*) ;;
+linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
+esac
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+  old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds"
+fi
+
+# Allow CC to be a program name with arguments.
+set dummy $CC
+compiler="$2"
+
+echo "$as_me:$LINENO: checking for objdir" >&5
+echo $ECHO_N "checking for objdir... $ECHO_C" >&6
+rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+echo "$as_me:$LINENO: result: $objdir" >&5
+echo "${ECHO_T}$objdir" >&6
+
+
+
+# Check whether --with-pic or --without-pic was given.
+if test "${with_pic+set}" = set; then
+  withval="$with_pic"
+  pic_mode="$withval"
+else
+  pic_mode=default
+fi;
+test -z "$pic_mode" && pic_mode=default
+
+# We assume here that the value for lt_cv_prog_cc_pic will not be cached
+# in isolation, and that seeing it set (from the cache) indicates that
+# the associated values are set (in the cache) correctly too.
+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+if test "${lt_cv_prog_cc_pic+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+   lt_cv_prog_cc_pic=
+  lt_cv_prog_cc_shlib=
+  lt_cv_prog_cc_wl=
+  lt_cv_prog_cc_static=
+  lt_cv_prog_cc_no_builtin=
+  lt_cv_prog_cc_can_build_shared=$can_build_shared
+
+  if test "$GCC" = yes; then
+    lt_cv_prog_cc_wl='-Wl,'
+    lt_cv_prog_cc_static='-static'
+
+    case $host_os in
+    aix*)
+      # Below there is a dirty hack to force normal static linking with -ldl
+      # The problem is because libdl dynamically linked with both libc and
+      # libC (AIX C++ library), which obviously doesn't included in libraries
+      # list by gcc. This cause undefined symbols with -static flags.
+      # This hack allows C programs to be linked with "-static -ldl", but
+      # we not sure about C++ programs.
+      lt_cv_prog_cc_static="$lt_cv_prog_cc_static ${lt_cv_prog_cc_wl}-lC"
+      ;;
+    amigaos*)
+      # FIXME: we need at least 68020 code to build shared libraries, but
+      # adding the `-m68020' flag to GCC prevents building anything better,
+      # like `-m68040'.
+      lt_cv_prog_cc_pic='-m68020 -resident32 -malways-restore-a4'
+      ;;
+    beos* | irix5* | irix6* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_cv_prog_cc_pic='-fno-common'
+      ;;
+    cygwin* | mingw* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_cv_prog_cc_pic='-DDLL_EXPORT'
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+        lt_cv_prog_cc_pic=-Kconform_pic
+      fi
+      ;;
+    *)
+      lt_cv_prog_cc_pic='-fPIC'
+      ;;
+    esac
+  else
+    # PORTME Check for PIC flags for the system compiler.
+    case $host_os in
+    aix3* | aix4* | aix5*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+        # AIX 5 now supports IA64 processor
+        lt_cv_prog_cc_static='-Bstatic'
+        lt_cv_prog_cc_wl='-Wl,'
+      else
+        lt_cv_prog_cc_static='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      # Is there a better lt_cv_prog_cc_static that works with the bundled CC?
+      lt_cv_prog_cc_wl='-Wl,'
+      lt_cv_prog_cc_static="${lt_cv_prog_cc_wl}-a ${lt_cv_prog_cc_wl}archive"
+      lt_cv_prog_cc_pic='+Z'
+      ;;
+
+    irix5* | irix6*)
+      lt_cv_prog_cc_wl='-Wl,'
+      lt_cv_prog_cc_static='-non_shared'
+      # PIC (with -KPIC) is the default.
+      ;;
+
+    cygwin* | mingw* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_cv_prog_cc_pic='-DDLL_EXPORT'
+      ;;
+
+    newsos6)
+      lt_cv_prog_cc_pic='-KPIC'
+      lt_cv_prog_cc_static='-Bstatic'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      # All OSF/1 code is PIC.
+      lt_cv_prog_cc_wl='-Wl,'
+      lt_cv_prog_cc_static='-non_shared'
+      ;;
+
+    sco3.2v5*)
+      lt_cv_prog_cc_pic='-Kpic'
+      lt_cv_prog_cc_static='-dn'
+      lt_cv_prog_cc_shlib='-belf'
+      ;;
+
+    solaris*)
+      lt_cv_prog_cc_pic='-KPIC'
+      lt_cv_prog_cc_static='-Bstatic'
+      lt_cv_prog_cc_wl='-Wl,'
+      ;;
+
+    sunos4*)
+      lt_cv_prog_cc_pic='-PIC'
+      lt_cv_prog_cc_static='-Bstatic'
+      lt_cv_prog_cc_wl='-Qoption ld '
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+      lt_cv_prog_cc_pic='-KPIC'
+      lt_cv_prog_cc_static='-Bstatic'
+      if test "x$host_vendor" = xsni; then
+        lt_cv_prog_cc_wl='-LD'
+      else
+        lt_cv_prog_cc_wl='-Wl,'
+      fi
+      ;;
+
+    uts4*)
+      lt_cv_prog_cc_pic='-pic'
+      lt_cv_prog_cc_static='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+       lt_cv_prog_cc_pic='-Kconform_pic'
+       lt_cv_prog_cc_static='-Bstatic'
+      fi
+      ;;
+
+    *)
+      lt_cv_prog_cc_can_build_shared=no
+      ;;
+    esac
+  fi
+
+fi
+
+if test -z "$lt_cv_prog_cc_pic"; then
+  echo "$as_me:$LINENO: result: none" >&5
+echo "${ECHO_T}none" >&6
+else
+  echo "$as_me:$LINENO: result: $lt_cv_prog_cc_pic" >&5
+echo "${ECHO_T}$lt_cv_prog_cc_pic" >&6
+
+  # Check to make sure the pic_flag actually works.
+  echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_cv_prog_cc_pic works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_cv_prog_cc_pic works... $ECHO_C" >&6
+  if test "${lt_cv_prog_cc_pic_works+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      save_CFLAGS="$CFLAGS"
+    CFLAGS="$CFLAGS $lt_cv_prog_cc_pic -DPIC"
+    cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+        case $host_os in
+      hpux9* | hpux10* | hpux11*)
+       # On HP-UX, both CC and GCC only warn that PIC is supported... then
+       # they create non-PIC objects.  So, if there were any warnings, we
+       # assume that PIC is not supported.
+       if test -s conftest.err; then
+         lt_cv_prog_cc_pic_works=no
+       else
+         lt_cv_prog_cc_pic_works=yes
+       fi
+       ;;
+      *)
+       lt_cv_prog_cc_pic_works=yes
+       ;;
+      esac
+
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+      lt_cv_prog_cc_pic_works=no
+
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+    CFLAGS="$save_CFLAGS"
+
+fi
+
+
+  if test "X$lt_cv_prog_cc_pic_works" = Xno; then
+    lt_cv_prog_cc_pic=
+    lt_cv_prog_cc_can_build_shared=no
+  else
+    lt_cv_prog_cc_pic=" $lt_cv_prog_cc_pic"
+  fi
+
+  echo "$as_me:$LINENO: result: $lt_cv_prog_cc_pic_works" >&5
+echo "${ECHO_T}$lt_cv_prog_cc_pic_works" >&6
+fi
+
+# Check for any special shared library compilation flags.
+if test -n "$lt_cv_prog_cc_shlib"; then
+  { echo "$as_me:$LINENO: WARNING: \`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries" >&5
+echo "$as_me: WARNING: \`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries" >&2;}
+  if echo "$old_CC $old_CFLAGS " | egrep -e "[         ]$lt_cv_prog_cc_shlib[  ]" >/dev/null; then :
+  else
+   { echo "$as_me:$LINENO: WARNING: add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5
+echo "$as_me: WARNING: add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;}
+    lt_cv_prog_cc_can_build_shared=no
+  fi
+fi
+
+echo "$as_me:$LINENO: checking if $compiler static flag $lt_cv_prog_cc_static works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_cv_prog_cc_static works... $ECHO_C" >&6
+if test "${lt_cv_prog_cc_static_works+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+    lt_cv_prog_cc_static_works=no
+  save_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS $lt_cv_prog_cc_static"
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  lt_cv_prog_cc_static_works=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+  LDFLAGS="$save_LDFLAGS"
+
+fi
+
+
+# Belt *and* braces to stop my trousers falling down:
+test "X$lt_cv_prog_cc_static_works" = Xno && lt_cv_prog_cc_static=
+echo "$as_me:$LINENO: result: $lt_cv_prog_cc_static_works" >&5
+echo "${ECHO_T}$lt_cv_prog_cc_static_works" >&6
+
+pic_flag="$lt_cv_prog_cc_pic"
+special_shlib_compile_flags="$lt_cv_prog_cc_shlib"
+wl="$lt_cv_prog_cc_wl"
+link_static_flag="$lt_cv_prog_cc_static"
+no_builtin_flag="$lt_cv_prog_cc_no_builtin"
+can_build_shared="$lt_cv_prog_cc_can_build_shared"
+
+
+# Check to see if options -o and -c are simultaneously supported by compiler
+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+if test "${lt_cv_compiler_c_o+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+$rm -r conftest 2>/dev/null
+mkdir conftest
+cd conftest
+echo "int some_variable = 0;" > conftest.$ac_ext
+mkdir out
+# According to Tom Tromey, Ian Lance Taylor reported there are C compilers
+# that will create temporary files in the current directory regardless of
+# the output directory.  Thus, making CWD read-only will cause this test
+# to fail, enabling locking or at least warning the user not to do parallel
+# builds.
+chmod -w .
+save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -o out/conftest2.$ac_objext"
+compiler_c_o=no
+if { (eval echo configure:7365: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then
+  # The compiler can only warn and ignore the option if not recognized
+  # So say no if there are warnings
+  if test -s out/conftest.err; then
+    lt_cv_compiler_c_o=no
+  else
+    lt_cv_compiler_c_o=yes
+  fi
+else
+  # Append any errors to the config.log.
+  cat out/conftest.err 1>&5
+  lt_cv_compiler_c_o=no
+fi
+CFLAGS="$save_CFLAGS"
+chmod u+w .
+$rm conftest* out/*
+rmdir out
+cd ..
+rmdir conftest
+$rm -r conftest 2>/dev/null
+
+fi
+
+compiler_c_o=$lt_cv_compiler_c_o
+echo "$as_me:$LINENO: result: $compiler_c_o" >&5
+echo "${ECHO_T}$compiler_c_o" >&6
+
+if test x"$compiler_c_o" = x"yes"; then
+  # Check to see if we can write to a .lo
+  echo "$as_me:$LINENO: checking if $compiler supports -c -o file.lo" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.lo... $ECHO_C" >&6
+  if test "${lt_cv_compiler_o_lo+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+  lt_cv_compiler_o_lo=no
+  save_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -c -o conftest.lo"
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+int some_variable = 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+      # The compiler can only warn and ignore the option if not recognized
+    # So say no if there are warnings
+    if test -s conftest.err; then
+      lt_cv_compiler_o_lo=no
+    else
+      lt_cv_compiler_o_lo=yes
+    fi
+
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+  CFLAGS="$save_CFLAGS"
+
+fi
+
+  compiler_o_lo=$lt_cv_compiler_o_lo
+  echo "$as_me:$LINENO: result: $compiler_o_lo" >&5
+echo "${ECHO_T}$compiler_o_lo" >&6
+else
+  compiler_o_lo=no
+fi
+
+# Check to see if we can do hard links to lock some files if needed
+hard_links="nottested"
+if test "$compiler_c_o" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
+  hard_links=yes
+  $rm conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6
+  if test "$hard_links" = no; then
+    { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+if test "$GCC" = yes; then
+  # Check to see if options -fno-rtti -fno-exceptions are supported by compiler
+  echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  save_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.$ac_ext"
+  compiler_rtti_exceptions=no
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+int some_variable = 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+      # The compiler can only warn and ignore the option if not recognized
+    # So say no if there are warnings
+    if test -s conftest.err; then
+      compiler_rtti_exceptions=no
+    else
+      compiler_rtti_exceptions=yes
+    fi
+
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+  CFLAGS="$save_CFLAGS"
+  echo "$as_me:$LINENO: result: $compiler_rtti_exceptions" >&5
+echo "${ECHO_T}$compiler_rtti_exceptions" >&6
+
+  if test "$compiler_rtti_exceptions" = "yes"; then
+    no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions'
+  else
+    no_builtin_flag=' -fno-builtin'
+  fi
+fi
+
+# See if the linker supports building shared libraries.
+echo "$as_me:$LINENO: checking whether the linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the linker ($LD) supports shared libraries... $ECHO_C" >&6
+
+allow_undefined_flag=
+no_undefined_flag=
+need_lib_prefix=unknown
+need_version=unknown
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+archive_cmds=
+archive_expsym_cmds=
+old_archive_from_new_cmds=
+old_archive_from_expsyms_cmds=
+export_dynamic_flag_spec=
+whole_archive_flag_spec=
+thread_safe_flag_spec=
+hardcode_into_libs=no
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+hardcode_shlibpath_var=unsupported
+runpath_var=
+link_all_deplibs=unknown
+always_export_symbols=no
+export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols'
+# include_expsyms should be a list of space-separated symbols to be *always*
+# included in the symbol list
+include_expsyms=
+# exclude_expsyms can be an egrep regular expression of symbols to exclude
+# it will be wrapped by ` (' and `)$', so one must not match beginning or
+# end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+# as well as any symbol that contains `d'.
+exclude_expsyms="_GLOBAL_OFFSET_TABLE_"
+# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+# platforms (ab)use it in PIC code, but their linkers get confused if
+# the symbol is explicitly referenced.  Since portable code cannot
+# rely on this symbol name, it's probably fine to never include it in
+# preloaded symbol tables.
+extract_expsyms_cmds=
+
+case $host_os in
+cygwin* | mingw* | pw32* )
+  # FIXME: the MSVC++ port hasn't been tested in a loooong time
+  # When not using gcc, we currently assume that we are using
+  # Microsoft Visual C++.
+  if test "$GCC" != yes; then
+    with_gnu_ld=no
+  fi
+  ;;
+
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes; then
+  # If archive_cmds runs LD, not CC, wlarc should be empty
+  wlarc='${wl}'
+
+  # See if GNU ld supports shared libraries.
+  case $host_os in
+  aix3* | aix4* | aix5*)
+    # On AIX, the GNU linker is very broken
+    # Note:Check GNU linker on AIX 5-IA64 when/if it becomes available.
+    ld_shlibs=no
+    cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+    ;;
+
+  amigaos*)
+    archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_minus_L=yes
+
+    # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+    # that the semantics of dynamic libraries on AmigaOS, at least up
+    # to version 4, is to share data among multiple programs linked
+    # with the same dynamic library.  Since this doesn't match the
+    # behavior of shared libraries on other platforms, we can use
+    # them.
+    ld_shlibs=no
+    ;;
+
+  beos*)
+    if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+      allow_undefined_flag=unsupported
+      # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+      # support --undefined.  This deserves some investigation.  FIXME
+      archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+    else
+      ld_shlibs=no
+    fi
+    ;;
+
+  cygwin* | mingw* | pw32*)
+    # hardcode_libdir_flag_spec is actually meaningless, as there is
+    # no search path for DLLs.
+    hardcode_libdir_flag_spec='-L$libdir'
+    allow_undefined_flag=unsupported
+    always_export_symbols=yes
+
+    extract_expsyms_cmds='test -f $output_objdir/impgen.c || \
+      sed -e "/^# \/\* impgen\.c starts here \*\//,/^# \/\* impgen.c ends here \*\// { s/^# //;s/^# *$//; p; }" -e d < $''0 > $output_objdir/impgen.c~
+      test -f $output_objdir/impgen.exe || (cd $output_objdir && \
+      if test "x$HOST_CC" != "x" ; then $HOST_CC -o impgen impgen.c ; \
+      else $CC -o impgen impgen.c ; fi)~
+      $output_objdir/impgen $dir/$soroot > $output_objdir/$soname-def'
+
+    old_archive_from_expsyms_cmds='$DLLTOOL --as=$AS --dllname $soname --def $output_objdir/$soname-def --output-lib $output_objdir/$newlib'
+
+    # cygwin and mingw dlls have different entry points and sets of symbols
+    # to exclude.
+    # FIXME: what about values for MSVC?
+    dll_entry=__cygwin_dll_entry@12
+    dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12~
+    case $host_os in
+    mingw*)
+      # mingw values
+      dll_entry=_DllMainCRTStartup@12
+      dll_exclude_symbols=DllMain@12,DllMainCRTStartup@12,DllEntryPoint@12~
+      ;;
+    esac
+
+    # mingw and cygwin differ, and it's simplest to just exclude the union
+    # of the two symbol sets.
+    dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12,DllMainCRTStartup@12,DllEntryPoint@12
+
+    # recent cygwin and mingw systems supply a stub DllMain which the user
+    # can override, but on older systems we have to supply one (in ltdll.c)
+    if test "x$lt_cv_need_dllmain" = "xyes"; then
+      ltdll_obj='$output_objdir/$soname-ltdll.'"$ac_objext "
+      ltdll_cmds='test -f $output_objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < [$]0 > $output_objdir/$soname-ltdll.c~
+       test -f $output_objdir/$soname-ltdll.$ac_objext || (cd $output_objdir && $CC -c $soname-ltdll.c)~'
+    else
+      ltdll_obj=
+      ltdll_cmds=
+    fi
+
+    # Extract the symbol export list from an `--export-all' def file,
+    # then regenerate the def file from the symbol export list, so that
+    # the compiled dll only exports the symbol export list.
+    # Be careful not to strip the DATA tag left be newer dlltools.
+    export_symbols_cmds="$ltdll_cmds"'
+      $DLLTOOL --export-all --exclude-symbols '$dll_exclude_symbols' --output-def $output_objdir/$soname-def '$ltdll_obj'$libobjs $convenience~
+      sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]*//" -e "s/ *;.*$//" < $output_objdir/$soname-def > $export_symbols'
+
+    # If the export-symbols file already is a .def file (1st line
+    # is EXPORTS), use it as is.
+    # If DATA tags from a recent dlltool are present, honour them!
+    archive_expsym_cmds='if test "x`head -1 $export_symbols`" = xEXPORTS; then
+        cp $export_symbols $output_objdir/$soname-def;
+      else
+        echo EXPORTS > $output_objdir/$soname-def;
+        _lt_hint=1;
+        cat $export_symbols | while read symbol; do
+         set dummy \$symbol;
+         case \$# in
+           2) echo "   \$2 @ \$_lt_hint ; " >> $output_objdir/$soname-def;;
+           *) echo "     \$2 @ \$_lt_hint \$3 ; " >> $output_objdir/$soname-def;;
+         esac;
+         _lt_hint=`expr 1 + \$_lt_hint`;
+        done;
+      fi~
+      '"$ltdll_cmds"'
+      $CC -Wl,--base-file,$output_objdir/$soname-base '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~
+      $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp~
+      $CC -Wl,--base-file,$output_objdir/$soname-base $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~
+      $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp --output-lib $output_objdir/$libname.dll.a~
+      $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags'
+    ;;
+
+  netbsd*)
+    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+      archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+      wlarc=
+    else
+      archive_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      archive_expsym_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+    fi
+    ;;
+
+  solaris* | sysv5*)
+    if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then
+      ld_shlibs=no
+      cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+    elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+    else
+      ld_shlibs=no
+    fi
+    ;;
+
+  sunos4*)
+    archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+    wlarc=
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  *)
+    if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+    else
+      ld_shlibs=no
+    fi
+    ;;
+  esac
+
+  if test "$ld_shlibs" = yes; then
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'
+    export_dynamic_flag_spec='${wl}--export-dynamic'
+    case $host_os in
+    cygwin* | mingw* | pw32*)
+      # dlltool doesn't understand --whole-archive et. al.
+      whole_archive_flag_spec=
+      ;;
+    *)
+      # ancient GNU ld didn't support --whole-archive et. al.
+      if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then
+       whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      else
+       whole_archive_flag_spec=
+      fi
+      ;;
+    esac
+  fi
+else
+  # PORTME fill in a description of your system's linker (not GNU ld)
+  case $host_os in
+  aix3*)
+    allow_undefined_flag=unsupported
+    always_export_symbols=yes
+    archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+    # Note: this linker hardcodes the directories in LIBPATH if there
+    # are no directories specified by -L.
+    hardcode_minus_L=yes
+    if test "$GCC" = yes && test -z "$link_static_flag"; then
+      # Neither direct hardcoding nor static linking is supported with a
+      # broken collect2.
+      hardcode_direct=unsupported
+    fi
+    ;;
+
+  aix4* | aix5*)
+    # When large executables or shared objects are built, AIX ld can
+    # have problems creating the table of contents.  If linking a library
+    # or program results in "error TOC overflow" add -mminimal-toc to
+    # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+    # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+    archive_cmds=''
+    hardcode_libdir_separator=':'
+    if test "$GCC" = yes; then
+      collect2name=`${CC} -print-prog-name=collect2`
+      if test -f "$collect2name" && \
+        strings "$collect2name" | grep resolve_lib_name >/dev/null
+      then
+       # We have reworked collect2
+       hardcode_direct=yes
+      else
+        # We have old collect2
+        hardcode_direct=unsupported
+        # It fails to find uninstalled libraries when the uninstalled
+        # path is not listed in the libpath.  Setting hardcode_minus_L
+        # to unsupported forces relinking
+        hardcode_minus_L=yes
+        hardcode_libdir_flag_spec='-L$libdir'
+        hardcode_libdir_separator=
+      fi
+      shared_flag='-shared'
+    else
+      if test "$host_cpu" = ia64; then
+        shared_flag='-G'
+      else
+        shared_flag='${wl}-bM:SRE'
+      fi
+      hardcode_direct=yes
+    fi
+
+    if test "$host_cpu" = ia64; then
+      # On IA64, the linker does run time linking by default, so we don't
+      # have to do anything special.
+      aix_use_runtimelinking=no
+      exp_sym_flag='-Bexport'
+      no_entry_flag=""
+    else
+      # Test if we are trying to use run time linking, or normal AIX style linking.
+      # If -brtl is somewhere in LDFLAGS, we need to do run time linking.
+      aix_use_runtimelinking=no
+      for ld_flag in $LDFLAGS; do
+        if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl" ); then
+          aix_use_runtimelinking=yes
+          break
+        fi
+      done
+      exp_sym_flag='-bexport'
+      no_entry_flag='-bnoentry'
+    fi
+    # It seems that -bexpall can do strange things, so it is better to
+    # generate a list of symbols to export.
+    always_export_symbols=yes
+    if test "$aix_use_runtimelinking" = yes; then
+      hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:/usr/lib:/lib'
+      allow_undefined_flag=' -Wl,-G'
+      archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"
+    else
+      if test "$host_cpu" = ia64; then
+        hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+       allow_undefined_flag="-znodefs"
+        archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname ${wl}-h$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"
+      else
+        hardcode_libdir_flag_spec='${wl}-bnolibpath ${wl}-blibpath:$libdir:/usr/lib:/lib'
+        # Warning - without using the other run time loading flags, -berok will
+        #           link without error, but may produce a broken library.
+        allow_undefined_flag='${wl}-berok'
+        # This is a bit strange, but is similar to how AIX traditionally builds
+        # it's shared libraries.
+        archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"' ~$AR -crlo $objdir/$libname$release.a $objdir/$soname'
+      fi
+    fi
+    ;;
+
+  amigaos*)
+    archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_minus_L=yes
+    # see comment about different semantics on the GNU ld section
+    ld_shlibs=no
+    ;;
+
+  cygwin* | mingw* | pw32*)
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    # hardcode_libdir_flag_spec is actually meaningless, as there is
+    # no search path for DLLs.
+    hardcode_libdir_flag_spec=' '
+    allow_undefined_flag=unsupported
+    # Tell ltmain to make .lib files, not .a files.
+    libext=lib
+    # FIXME: Setting linknames here is a bad hack.
+    archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames='
+    # The linker will automatically build a .lib file if we build a DLL.
+    old_archive_from_new_cmds='true'
+    # FIXME: Should let the user specify the lib program.
+    old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs'
+    fix_srcfile_path='`cygpath -w "$srcfile"`'
+    ;;
+
+  darwin* | rhapsody*)
+    allow_undefined_flag='-undefined suppress'
+    # FIXME: Relying on posixy $() will cause problems for
+    #        cross-compilation, but unfortunately the echo tests do not
+    #        yet detect zsh echo's removal of \ escapes.
+    archive_cmds='$CC $(test .$module = .yes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib $libobjs $deplibs$linkopts -install_name $rpath/$soname $(test -n "$verstring" -a x$verstring != x0.0 && echo $verstring)'
+    # We need to add '_' to the symbols in $export_symbols first
+    #archive_expsym_cmds="$archive_cmds"' && strip -s $export_symbols'
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    whole_archive_flag_spec='-all_load $convenience'
+    ;;
+
+  freebsd1*)
+    ld_shlibs=no
+    ;;
+
+  # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+  # support.  Future versions do this automatically, but an explicit c++rt0.o
+  # does not break anything, and helps significantly (at the cost of a little
+  # extra space).
+  freebsd2.2*)
+    archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+    hardcode_libdir_flag_spec='-R$libdir'
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+  freebsd2*)
+    archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+    hardcode_direct=yes
+    hardcode_minus_L=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+  freebsd*)
+    archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+    hardcode_libdir_flag_spec='-R$libdir'
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  hpux9* | hpux10* | hpux11*)
+    case $host_os in
+    hpux9*) archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ;;
+    *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;;
+    esac
+    hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+    hardcode_libdir_separator=:
+    hardcode_direct=yes
+    hardcode_minus_L=yes # Not in the search PATH, but as the default
+                        # location of the library.
+    export_dynamic_flag_spec='${wl}-E'
+    ;;
+
+  irix5* | irix6*)
+    if test "$GCC" = yes; then
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+    else
+      archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+    fi
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    hardcode_libdir_separator=:
+    link_all_deplibs=yes
+    ;;
+
+  netbsd*)
+    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+    else
+      archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+    fi
+    hardcode_libdir_flag_spec='-R$libdir'
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  newsos6)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
+    hardcode_direct=yes
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    hardcode_libdir_separator=:
+    hardcode_shlibpath_var=no
+    ;;
+
+  openbsd*)
+    archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+    hardcode_libdir_flag_spec='-R$libdir'
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  os2*)
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_minus_L=yes
+    allow_undefined_flag=unsupported
+    archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+    old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+    ;;
+
+  osf3*)
+    if test "$GCC" = yes; then
+      allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+      archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+    else
+      allow_undefined_flag=' -expect_unresolved \*'
+      archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+    fi
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    hardcode_libdir_separator=:
+    ;;
+
+  osf4* | osf5*)       # as osf3* with the addition of -msym flag
+    if test "$GCC" = yes; then
+      allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+      archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    else
+      allow_undefined_flag=' -expect_unresolved \*'
+      archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+      archive_expsym_cmds='for i in `cat $export_symbols`; do printf "-exported_symbol " >> $lib.exp; echo "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+      $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp'
+
+      #Both c and cxx compiler support -rpath directly
+      hardcode_libdir_flag_spec='-rpath $libdir'
+    fi
+    hardcode_libdir_separator=:
+    ;;
+
+  sco3.2v5*)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+    hardcode_shlibpath_var=no
+    runpath_var=LD_RUN_PATH
+    hardcode_runpath_var=yes
+    ;;
+
+  solaris*)
+    no_undefined_flag=' -z defs'
+    # $CC -shared without GNU ld will not create a library from C++
+    # object files and a static libstdc++, better avoid it by now
+    archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+    archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+               $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+    hardcode_libdir_flag_spec='-R$libdir'
+    hardcode_shlibpath_var=no
+    case $host_os in
+    solaris2.[0-5] | solaris2.[0-5].*) ;;
+    *) # Supported since Solaris 2.6 (maybe 2.5.1?)
+      whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;;
+    esac
+    link_all_deplibs=yes
+    ;;
+
+  sunos4*)
+    if test "x$host_vendor" = xsequent; then
+      # Use $CC to link under sequent, because it throws in some extra .o
+      # files that make .init and .fini sections work.
+      archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+    else
+      archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+    fi
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_direct=yes
+    hardcode_minus_L=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  sysv4)
+    if test "x$host_vendor" = xsno; then
+      archive_cmds='$LD -G -Bsymbolic -h $soname -o $lib $libobjs $deplibs $linkopts'
+      hardcode_direct=yes # is this really true???
+    else
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+    fi
+    runpath_var='LD_RUN_PATH'
+    hardcode_shlibpath_var=no
+    ;;
+
+  sysv4.3*)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+    hardcode_shlibpath_var=no
+    export_dynamic_flag_spec='-Bexport'
+    ;;
+
+  sysv5*)
+    no_undefined_flag=' -z text'
+    # $CC -shared without GNU ld will not create a library from C++
+    # object files and a static libstdc++, better avoid it by now
+    archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+    archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+               $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+    hardcode_libdir_flag_spec=
+    hardcode_shlibpath_var=no
+    runpath_var='LD_RUN_PATH'
+    ;;
+
+  uts4*)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_shlibpath_var=no
+    ;;
+
+  dgux*)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_shlibpath_var=no
+    ;;
+
+  sysv4*MP*)
+    if test -d /usr/nec; then
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var=no
+      runpath_var=LD_RUN_PATH
+      hardcode_runpath_var=yes
+      ld_shlibs=yes
+    fi
+    ;;
+
+  sysv4.2uw2*)
+    archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+    hardcode_direct=yes
+    hardcode_minus_L=no
+    hardcode_shlibpath_var=no
+    hardcode_runpath_var=yes
+    runpath_var=LD_RUN_PATH
+    ;;
+
+  sysv5uw7* | unixware7*)
+    no_undefined_flag='${wl}-z ${wl}text'
+    if test "$GCC" = yes; then
+      archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+    else
+      archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+    fi
+    runpath_var='LD_RUN_PATH'
+    hardcode_shlibpath_var=no
+    ;;
+
+  *)
+    ld_shlibs=no
+    ;;
+  esac
+fi
+echo "$as_me:$LINENO: result: $ld_shlibs" >&5
+echo "${ECHO_T}$ld_shlibs" >&6
+test "$ld_shlibs" = no && can_build_shared=no
+
+# Check hardcoding attributes.
+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" || \
+   test -n "$runpath_var"; then
+
+  # We can hardcode non-existant directories.
+  if test "$hardcode_direct" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$hardcode_shlibpath_var" != no &&
+     test "$hardcode_minus_L" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+echo "$as_me:$LINENO: result: $hardcode_action" >&5
+echo "${ECHO_T}$hardcode_action" >&6
+
+striplib=
+old_striplib=
+echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5
+echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6
+if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+# PORTME Fill in your ld.so characteristics
+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}.so$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}.so$major'
+  ;;
+
+aix4* | aix5*)
+  version_type=linux
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}.so$major ${libname}${release}.so$versuffix $libname.so'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+       aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+           echo ' yes '
+           echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+        :
+      else
+        can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so instead of
+      # lib<name>.a to let people know that these are not typical AIX shared libraries.
+      library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}.so$major'
+    fi
+    shlibpath_var=LIBPATH
+    deplibs_check_method=pass_all
+  fi
+  ;;
+
+amigaos*)
+  library_names_spec='$libname.ixlibrary $libname.a'
+  # Create ${libname}_ixlibrary.a entries in /sys/libs.
+  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done'
+  ;;
+
+beos*)
+  library_names_spec='${libname}.so'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi4*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  export_dynamic_flag_spec=-rdynamic
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32*)
+  version_type=windows
+  need_version=no
+  need_lib_prefix=no
+  case $GCC,$host_os in
+  yes,cygwin*)
+    library_names_spec='$libname.dll.a'
+    soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll'
+    postinstall_cmds='dlpath=`bash 2>&1 -c '\''. $dir/${file}i;echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog .libs/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`bash 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $rm \$dlpath'
+    ;;
+  yes,mingw*)
+    library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll'
+    sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g"`
+    ;;
+  yes,pw32*)
+    library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | sed -e 's/./-/g'`${versuffix}.dll'
+    ;;
+  *)
+    library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  # FIXME: Relying on posixy $() will cause problems for
+  #        cross-compilation, but unfortunately the echo tests do not
+  #        yet detect zsh echo's removal of \ escapes.
+  library_names_spec='${libname}${release}${versuffix}.$(test .$module = .yes && echo so || echo dylib) ${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib) ${libname}.$(test .$module = .yes && echo so || echo dylib)'
+  soname_spec='${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib)'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+freebsd*)
+  objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  *)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  dynamic_linker="$host_os dld.sl"
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  shlibpath_var=SHLIB_PATH
+  shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+  library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl'
+  soname_spec='${libname}${release}.sl$major'
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
+
+irix5* | irix6*)
+  version_type=irix
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}.so$major'
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so $libname.so'
+  case $host_os in
+  irix5*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux-gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so'
+    soname_spec='${libname}${release}.so$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+openbsd*)
+  version_type=sunos
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+    need_version=no
+  fi
+  library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+os2*)
+  libname_spec='$name'
+  need_lib_prefix=no
+  library_names_spec='$libname.dll $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_version=no
+  soname_spec='${libname}${release}.so'
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+sco3.2v5*)
+  version_type=osf
+  soname_spec='${libname}${release}.so$major'
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+  version_type=linux
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so'
+    soname_spec='$libname.so.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6
+test "$dynamic_linker" = no && can_build_shared=no
+
+# Report the final consequences.
+echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
+echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $can_build_shared" >&5
+echo "${ECHO_T}$can_build_shared" >&6
+
+if test "$hardcode_action" = relink; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  cygwin* | mingw* | pw32*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+   ;;
+
+  *)
+    echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char dlopen ();
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_dl_dlopen=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_lib_dl_dlopen=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
+if test $ac_cv_lib_dl_dlopen = yes; then
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+  echo "$as_me:$LINENO: checking for dlopen" >&5
+echo $ECHO_N "checking for dlopen... $ECHO_C" >&6
+if test "${ac_cv_func_dlopen+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char dlopen (); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char dlopen ();
+char (*f) ();
+
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_dlopen) || defined (__stub___dlopen)
+choke me
+#else
+f = dlopen;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_dlopen=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_func_dlopen=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5
+echo "${ECHO_T}$ac_cv_func_dlopen" >&6
+if test $ac_cv_func_dlopen = yes; then
+  lt_cv_dlopen="dlopen"
+else
+  echo "$as_me:$LINENO: checking for shl_load" >&5
+echo $ECHO_N "checking for shl_load... $ECHO_C" >&6
+if test "${ac_cv_func_shl_load+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char shl_load (); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char shl_load ();
+char (*f) ();
+
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_shl_load) || defined (__stub___shl_load)
+choke me
+#else
+f = shl_load;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_shl_load=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_func_shl_load=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5
+echo "${ECHO_T}$ac_cv_func_shl_load" >&6
+if test $ac_cv_func_shl_load = yes; then
+  lt_cv_dlopen="shl_load"
+else
+  echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5
+echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6
+if test "${ac_cv_lib_svld_dlopen+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char dlopen ();
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_svld_dlopen=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_lib_svld_dlopen=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6
+if test $ac_cv_lib_svld_dlopen = yes; then
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+  echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5
+echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6
+if test "${ac_cv_lib_dld_shl_load+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char shl_load ();
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+shl_load ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_dld_shl_load=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_lib_dld_shl_load=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6
+if test $ac_cv_lib_dld_shl_load = yes; then
+  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+        test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5
+echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6
+if test "${lt_cv_dlopen_self+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+         if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self=cross
+else
+    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<EOF
+#line 8984 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL          RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL                DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL                0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW           RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW         DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW       RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW     DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW     0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
+
+    exit (status);
+}
+EOF
+  if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_unknown|x*) lt_cv_dlopen_self=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5
+echo "${ECHO_T}$lt_cv_dlopen_self" >&6
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      LDFLAGS="$LDFLAGS $link_static_flag"
+      echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5
+echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6
+if test "${lt_cv_dlopen_self_static+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+         if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self_static=cross
+else
+    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<EOF
+#line 9082 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL          RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL                DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL                0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW           RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW         DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW       RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW     DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW     0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
+
+    exit (status);
+}
+EOF
+  if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self_static=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5
+echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+
+
+if test "$enable_shared" = yes && test "$GCC" = yes; then
+  case $archive_cmds in
+  *'~'*)
+    # FIXME: we may have to deal with multi-command sequences.
+    ;;
+  '$CC '*)
+    # Test whether the compiler implicitly links with -lc since on some
+    # systems, -lgcc has to come before -lc. If gcc already passes -lc
+    # to ld, don't add -lc before -lgcc.
+    echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+    if test "${lt_cv_archive_cmds_need_lc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  $rm conftest*
+    echo 'static int dummy;' > conftest.$ac_ext
+
+    if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+      soname=conftest
+      lib=conftest
+      libobjs=conftest.$ac_objext
+      deplibs=
+      wl=$lt_cv_prog_cc_wl
+      compiler_flags=-v
+      linker_flags=-v
+      verstring=
+      output_objdir=.
+      libname=conftest
+      save_allow_undefined_flag=$allow_undefined_flag
+      allow_undefined_flag=
+      if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+  (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+      then
+       lt_cv_archive_cmds_need_lc=no
+      else
+       lt_cv_archive_cmds_need_lc=yes
+      fi
+      allow_undefined_flag=$save_allow_undefined_flag
+    else
+      cat conftest.err 1>&5
+    fi
+fi
+
+    echo "$as_me:$LINENO: result: $lt_cv_archive_cmds_need_lc" >&5
+echo "${ECHO_T}$lt_cv_archive_cmds_need_lc" >&6
+    ;;
+  esac
+fi
+need_lc=${lt_cv_archive_cmds_need_lc-yes}
+
+# The second clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+  :
+else
+  # If there is no Makefile yet, we rely on a make rule to execute
+  # `config.status --recheck' to rerun these tests and create the
+  # libtool script then.
+  test -f Makefile && make "$ltmain"
+fi
+
+if test -f "$ltmain"; then
+  trap "$rm \"${ofile}T\"; exit 1" 1 2 15
+  $rm -f "${ofile}T"
+
+  echo creating $ofile
+
+  # Now quote all the things that may contain metacharacters while being
+  # careful not to overquote the AC_SUBSTed values.  We take copies of the
+  # variables and quote the copies for generation of the libtool script.
+  for var in echo old_CC old_CFLAGS \
+    AR AR_FLAGS CC LD LN_S NM SHELL \
+    reload_flag reload_cmds wl \
+    pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \
+    thread_safe_flag_spec whole_archive_flag_spec libname_spec \
+    library_names_spec soname_spec \
+    RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \
+    old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds \
+    postuninstall_cmds extract_expsyms_cmds old_archive_from_expsyms_cmds \
+    old_striplib striplib file_magic_cmd export_symbols_cmds \
+    deplibs_check_method allow_undefined_flag no_undefined_flag \
+    finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \
+    hardcode_libdir_flag_spec hardcode_libdir_separator  \
+    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+    compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do
+
+    case $var in
+    reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \
+    old_postinstall_cmds | old_postuninstall_cmds | \
+    export_symbols_cmds | archive_cmds | archive_expsym_cmds | \
+    extract_expsyms_cmds | old_archive_from_expsyms_cmds | \
+    postinstall_cmds | postuninstall_cmds | \
+    finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+      # Double-quote double-evaled strings.
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+      ;;
+    *)
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+      ;;
+    esac
+  done
+
+  cat <<__EOF__ > "${ofile}T"
+#! $SHELL
+
+# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996-2000 Free Software Foundation, Inc.
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="sed -e s/^X//"
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$need_lc
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# The default C compiler.
+CC=$lt_CC
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_wl
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_pic_flag
+pic_mode=$pic_mode
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_compiler_c_o
+
+# Can we write directly to a .lo ?
+compiler_o_lo=$lt_compiler_o_lo
+
+# Must we lock files when doing compilation ?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_link_static_flag
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_no_builtin_flag
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_global_symbol_to_cdecl
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# ### END LIBTOOL CONFIG
+
+__EOF__
+
+  case $host_os in
+  aix3*)
+    cat <<\EOF >> "${ofile}T"
+
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+EOF
+    ;;
+  esac
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | os2*)
+    cat <<'EOF' >> "${ofile}T"
+      # This is a source program that is used to create dlls on Windows
+      # Don't remove nor modify the starting and closing comments
+# /* ltdll.c starts here */
+# #define WIN32_LEAN_AND_MEAN
+# #include <windows.h>
+# #undef WIN32_LEAN_AND_MEAN
+# #include <stdio.h>
+#
+# #ifndef __CYGWIN__
+# #  ifdef __CYGWIN32__
+# #    define __CYGWIN__ __CYGWIN32__
+# #  endif
+# #endif
+#
+# #ifdef __cplusplus
+# extern "C" {
+# #endif
+# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
+# #ifdef __cplusplus
+# }
+# #endif
+#
+# #ifdef __CYGWIN__
+# #include <cygwin/cygwin_dll.h>
+# DECLARE_CYGWIN_DLL( DllMain );
+# #endif
+# HINSTANCE __hDllInstance_base;
+#
+# BOOL APIENTRY
+# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
+# {
+#   __hDllInstance_base = hInst;
+#   return TRUE;
+# }
+# /* ltdll.c ends here */
+        # This is a source program that is used to create import libraries
+        # on Windows for dlls which lack them. Don't remove nor modify the
+        # starting and closing comments
+# /* impgen.c starts here */
+# /*   Copyright (C) 1999-2000 Free Software Foundation, Inc.
+#
+#  This file is part of GNU libtool.
+#
+#  This program is free software; you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation; either version 2 of the License, or
+#  (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#  */
+#
+# #include <stdio.h>           /* for printf() */
+# #include <unistd.h>          /* for open(), lseek(), read() */
+# #include <fcntl.h>           /* for O_RDONLY, O_BINARY */
+# #include <string.h>          /* for strdup() */
+#
+# /* O_BINARY isn't required (or even defined sometimes) under Unix */
+# #ifndef O_BINARY
+# #define O_BINARY 0
+# #endif
+#
+# static unsigned int
+# pe_get16 (fd, offset)
+#      int fd;
+#      int offset;
+# {
+#   unsigned char b[2];
+#   lseek (fd, offset, SEEK_SET);
+#   read (fd, b, 2);
+#   return b[0] + (b[1]<<8);
+# }
+#
+# static unsigned int
+# pe_get32 (fd, offset)
+#     int fd;
+#     int offset;
+# {
+#   unsigned char b[4];
+#   lseek (fd, offset, SEEK_SET);
+#   read (fd, b, 4);
+#   return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
+# }
+#
+# static unsigned int
+# pe_as32 (ptr)
+#      void *ptr;
+# {
+#   unsigned char *b = ptr;
+#   return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
+# }
+#
+# int
+# main (argc, argv)
+#     int argc;
+#     char *argv[];
+# {
+#     int dll;
+#     unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
+#     unsigned long export_rva, export_size, nsections, secptr, expptr;
+#     unsigned long name_rvas, nexp;
+#     unsigned char *expdata, *erva;
+#     char *filename, *dll_name;
+#
+#     filename = argv[1];
+#
+#     dll = open(filename, O_RDONLY|O_BINARY);
+#     if (dll < 1)
+#      return 1;
+#
+#     dll_name = filename;
+#
+#     for (i=0; filename[i]; i++)
+#      if (filename[i] == '/' || filename[i] == '\\'  || filename[i] == ':')
+#          dll_name = filename + i +1;
+#
+#     pe_header_offset = pe_get32 (dll, 0x3c);
+#     opthdr_ofs = pe_header_offset + 4 + 20;
+#     num_entries = pe_get32 (dll, opthdr_ofs + 92);
+#
+#     if (num_entries < 1) /* no exports */
+#      return 1;
+#
+#     export_rva = pe_get32 (dll, opthdr_ofs + 96);
+#     export_size = pe_get32 (dll, opthdr_ofs + 100);
+#     nsections = pe_get16 (dll, pe_header_offset + 4 +2);
+#     secptr = (pe_header_offset + 4 + 20 +
+#            pe_get16 (dll, pe_header_offset + 4 + 16));
+#
+#     expptr = 0;
+#     for (i = 0; i < nsections; i++)
+#     {
+#      char sname[8];
+#      unsigned long secptr1 = secptr + 40 * i;
+#      unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
+#      unsigned long vsize = pe_get32 (dll, secptr1 + 16);
+#      unsigned long fptr = pe_get32 (dll, secptr1 + 20);
+#      lseek(dll, secptr1, SEEK_SET);
+#      read(dll, sname, 8);
+#      if (vaddr <= export_rva && vaddr+vsize > export_rva)
+#      {
+#          expptr = fptr + (export_rva - vaddr);
+#          if (export_rva + export_size > vaddr + vsize)
+#              export_size = vsize - (export_rva - vaddr);
+#          break;
+#      }
+#     }
+#
+#     expdata = (unsigned char*)malloc(export_size);
+#     lseek (dll, expptr, SEEK_SET);
+#     read (dll, expdata, export_size);
+#     erva = expdata - export_rva;
+#
+#     nexp = pe_as32 (expdata+24);
+#     name_rvas = pe_as32 (expdata+32);
+#
+#     printf ("EXPORTS\n");
+#     for (i = 0; i<nexp; i++)
+#     {
+#      unsigned long name_rva = pe_as32 (erva+name_rvas+i*4);
+#      printf ("\t%s @ %ld ;\n", erva+name_rva, 1+ i);
+#     }
+#
+#     return 0;
+# }
+# /* impgen.c ends here */
+
+EOF
+    ;;
+  esac
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "${ofile}T" || (rm -f "${ofile}T"; exit 1)
+
+  mv -f "${ofile}T" "$ofile" || \
+    (rm -f "$ofile" && cp "${ofile}T" "$ofile" && rm -f "${ofile}T")
+  chmod +x "$ofile"
+fi
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+# Prevent multiple expansion
+
+
+
+
+
+
+ac_config_files="$ac_config_files Makefile Makefile.lib Makefile.prog Makefile.comm include/config.h"
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overriden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+  (set) 2>&1 |
+    case `(ac_space=' '; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+        "s/'/'\\\\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;;
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n \
+        "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+} |
+  sed '
+     t clear
+     : clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     : end' >>confcache
+if cmp -s $cache_file confcache; then :; else
+  if test -w $cache_file; then
+    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+    cat confcache >$cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[        ]*VPATH[        ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[   ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[     ]*$//;
+}'
+fi
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then we branch to the quote section.  Otherwise,
+# look for a macro that doesn't take arguments.
+cat >confdef2opt.sed <<\_ACEOF
+t clear
+: clear
+s,^[   ]*#[    ]*define[       ][      ]*\([^  (][^    (]*([^)]*)\)[   ]*\(.*\),-D\1=\2,g
+t quote
+s,^[   ]*#[    ]*define[       ][      ]*\([^  ][^     ]*\)[   ]*\(.*\),-D\1=\2,g
+t quote
+d
+: quote
+s,[    `~#$^&*(){}\\|;'"<>?],\\&,g
+s,\[,\\&,g
+s,\],\\&,g
+s,\$,$$,g
+p
+_ACEOF
+# We use echo to avoid assuming a particular line-breaking character.
+# The extra dot is to prevent the shell from consuming trailing
+# line-breaks from the sub-command output.  A line-break within
+# single-quotes doesn't work because, if this script is created in a
+# platform that uses two characters for line-breaks (e.g., DOS), tr
+# would break.
+ac_LF_and_DOT=`echo; echo .`
+DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'`
+rm -f confdef2opt.sed
+
+
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+
+# NLS nuisances.
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+(set +x; test -n "`(LANG=C; export LANG) 2>&1`") &&
+    { $as_unset LANG || test "${LANG+set}" != set; } ||
+      { LANG=C; export LANG; }
+(set +x; test -n "`(LC_ALL=C; export LC_ALL) 2>&1`") &&
+    { $as_unset LC_ALL || test "${LC_ALL+set}" != set; } ||
+      { LC_ALL=C; export LC_ALL; }
+(set +x; test -n "`(LC_TIME=C; export LC_TIME) 2>&1`") &&
+    { $as_unset LC_TIME || test "${LC_TIME+set}" != set; } ||
+      { LC_TIME=C; export LC_TIME; }
+(set +x; test -n "`(LC_CTYPE=C; export LC_CTYPE) 2>&1`") &&
+    { $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set; } ||
+      { LC_CTYPE=C; export LC_CTYPE; }
+(set +x; test -n "`(LANGUAGE=C; export LANGUAGE) 2>&1`") &&
+    { $as_unset LANGUAGE || test "${LANGUAGE+set}" != set; } ||
+      { LANGUAGE=C; export LANGUAGE; }
+(set +x; test -n "`(LC_COLLATE=C; export LC_COLLATE) 2>&1`") &&
+    { $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set; } ||
+      { LC_COLLATE=C; export LC_COLLATE; }
+(set +x; test -n "`(LC_NUMERIC=C; export LC_NUMERIC) 2>&1`") &&
+    { $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set; } ||
+      { LC_NUMERIC=C; export LC_NUMERIC; }
+(set +x; test -n "`(LC_MESSAGES=C; export LC_MESSAGES) 2>&1`") &&
+    { $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set; } ||
+      { LC_MESSAGES=C; export LC_MESSAGES; }
+
+
+# Name of the executable.
+as_me=`(basename "$0") 2>/dev/null ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)$' \| \
+        .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+         /^X\/\(\/\/\)$/{ s//\1/; q; }
+         /^X\/\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conftest.sh
+  echo  "exit 0"   >>conftest.sh
+  chmod +x conftest.sh
+  if (PATH=".;."; conftest.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conftest.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+        case $as_dir in
+        /*)
+          if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+            CONFIG_SHELL=$as_dir/$as_base
+            export CONFIG_SHELL
+            exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+          fi;;
+        esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='     ' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS="  $as_nl"
+
+# CDPATH.
+$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=$PATH_SEPARATOR; export CDPATH; }
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.  Logging --version etc. is OK.
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.53.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+  echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+  echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+  echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+  echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number, then exit
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Report bugs to <bug-autoconf@gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.53,
+  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "x$1" : 'x\([^=]*\)='`
+    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+    shift
+    set dummy "$ac_option" "$ac_optarg" ${1+"$@"}
+    shift
+    ;;
+  -*);;
+  *) # This is not an option, so the user has probably given explicit
+     # arguments.
+     ac_need_defaults=false;;
+  esac
+
+  case $1 in
+  # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    echo "running $SHELL $0 " $ac_configure_args " --no-create --no-recursion"
+    exec $SHELL $0 $ac_configure_args --no-create --no-recursion ;;
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+  --version | --vers* | -V )
+    echo "$ac_cs_version"; exit 0 ;;
+  --he | --h)
+    # Conflict between --help and --header
+    { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit 0 ;;
+  --debug | --d* | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    shift
+    CONFIG_FILES="$CONFIG_FILES $1"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $1"
+    ac_need_defaults=false;;
+
+  # This is an error.
+  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1" ;;
+
+  esac
+  shift
+done
+
+_ACEOF
+
+
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+  case "$ac_config_target" in
+  # Handling of arguments.
+  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+  "Makefile.lib" ) CONFIG_FILES="$CONFIG_FILES Makefile.lib" ;;
+  "Makefile.prog" ) CONFIG_FILES="$CONFIG_FILES Makefile.prog" ;;
+  "Makefile.comm" ) CONFIG_FILES="$CONFIG_FILES Makefile.comm" ;;
+  "include/config.h" ) CONFIG_FILES="$CONFIG_FILES include/config.h" ;;
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+fi
+
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+: ${TMPDIR=/tmp}
+{
+  tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=$TMPDIR/cs$$-$RANDOM
+  (umask 077 && mkdir $tmp)
+} ||
+{
+   echo "$me: cannot create a temporary directory in $TMPDIR" >&2
+   { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+  # Protect against being on the right side of a sed subst in config.status.
+  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@DEFS@,$DEFS,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@LIBS@,$LIBS,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@PACKAGE@,$PACKAGE,;t t
+s,@VERSION@,$VERSION,;t t
+s,@ACLOCAL@,$ACLOCAL,;t t
+s,@AUTOCONF@,$AUTOCONF,;t t
+s,@AUTOMAKE@,$AUTOMAKE,;t t
+s,@AUTOHEADER@,$AUTOHEADER,;t t
+s,@MAKEINFO@,$MAKEINFO,;t t
+s,@SET_MAKE@,$SET_MAKE,;t t
+s,@TOP@,$TOP,;t t
+s,@SPINCLUDEDIR@,$SPINCLUDEDIR,;t t
+s,@SPLIBDIR@,$SPLIBDIR,;t t
+s,@build@,$build,;t t
+s,@build_cpu@,$build_cpu,;t t
+s,@build_vendor@,$build_vendor,;t t
+s,@build_os@,$build_os,;t t
+s,@host@,$host,;t t
+s,@host_cpu@,$host_cpu,;t t
+s,@host_vendor@,$host_vendor,;t t
+s,@host_os@,$host_os,;t t
+s,@CC@,$CC,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@LN_S@,$LN_S,;t t
+s,@CXX@,$CXX,;t t
+s,@CXXFLAGS@,$CXXFLAGS,;t t
+s,@ac_ct_CXX@,$ac_ct_CXX,;t t
+s,@PERL@,$PERL,;t t
+s,@CPP@,$CPP,;t t
+s,@LIB_THREADS@,$LIB_THREADS,;t t
+s,@CXXCPP@,$CXXCPP,;t t
+s,@ECHO@,$ECHO,;t t
+s,@RANLIB@,$RANLIB,;t t
+s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
+s,@STRIP@,$STRIP,;t t
+s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t
+s,@LIBTOOL@,$LIBTOOL,;t t
+s,@LIBTOOL_DEPS@,$LIBTOOL_DEPS,;t t
+s,@LINKFLAGS@,$LINKFLAGS,;t t
+CEOF
+
+_ACEOF
+
+  cat >>$CONFIG_STATUS <<\_ACEOF
+  # Split the substitutions into bite-sized pieces for seds with
+  # small command number limits, like on Digital OSF/1 and HP-UX.
+  ac_max_sed_lines=48
+  ac_sed_frag=1 # Number of current file.
+  ac_beg=1 # First line for current file.
+  ac_end=$ac_max_sed_lines # Line after last line for current file.
+  ac_more_lines=:
+  ac_sed_cmds=
+  while $ac_more_lines; do
+    if test $ac_beg -gt 1; then
+      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    else
+      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    fi
+    if test ! -s $tmp/subs.frag; then
+      ac_more_lines=false
+    else
+      # The purpose of the label and of the branching condition is to
+      # speed up the sed processing (if there are no `@' at all, there
+      # is no need to browse any of the substitutions).
+      # These are the two extra sed commands mentioned above.
+      (echo ':t
+  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+      if test -z "$ac_sed_cmds"; then
+       ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+      else
+       ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+      fi
+      ac_sed_frag=`expr $ac_sed_frag + 1`
+      ac_beg=$ac_end
+      ac_end=`expr $ac_end + $ac_max_sed_lines`
+    fi
+  done
+  if test -z "$ac_sed_cmds"; then
+    ac_sed_cmds=cat
+  fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+        cat >$tmp/stdin
+        ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+         X"$ac_file" : 'X\(//\)[^/]' \| \
+         X"$ac_file" : 'X\(//\)$' \| \
+         X"$ac_file" : 'X\(/\)' \| \
+         .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+         /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+         /^X\(\/\/\)$/{ s//\1/; q; }
+         /^X\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+  { case "$ac_dir" in
+  [\\/]* | ?:[\\/]* ) as_incr_dir=;;
+  *)                      as_incr_dir=.;;
+esac
+as_dummy="$ac_dir"
+for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do
+  case $as_mkdir_dir in
+    # Skip DOS drivespec
+    ?:) as_incr_dir=$as_mkdir_dir ;;
+    *)
+      as_incr_dir=$as_incr_dir/$as_mkdir_dir
+      test -d "$as_incr_dir" ||
+        mkdir "$as_incr_dir" ||
+       { { echo "$as_me:$LINENO: error: cannot create \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }
+    ;;
+  esac
+done; }
+
+  ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
+# absolute.
+ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
+ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd`
+ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
+ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
+
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+  esac
+
+  if test x"$ac_file" != x-; then
+    { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    rm -f "$ac_file"
+  fi
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    configure_input=
+  else
+    configure_input="$ac_file.  "
+  fi
+  configure_input=$configure_input"Generated from `echo $ac_file_in |
+                                     sed 's,.*/,,'` by configure."
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+         # Absolute (can't be DOS-style, as IFS=:)
+         test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         echo $f;;
+      *) # Relative
+         if test -f "$f"; then
+           # Build tree
+           echo $f
+         elif test -f "$srcdir/$f"; then
+           # Source tree
+           echo $srcdir/$f
+         else
+           # /dev/null tree
+           { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+  rm -f $tmp/stdin
+  if test x"$ac_file" != x-; then
+    mv $tmp/out $ac_file
+  else
+    cat $tmp/out
+    rm -f $tmp/out
+  fi
+
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
+
diff --git a/contrib/README b/contrib/README
new file mode 100644 (file)
index 0000000..3509286
--- /dev/null
@@ -0,0 +1,15 @@
+README for the OpenJade contrib directory
+-----------------------------------------
+
+This directory contains software and documentation that are not an
+integral part of OpenJade -- that is, they are not part of a DSSSL
+implementation. They may or may not be useful. Your pointage may 
+vary.
+
+Here's a list of what's in this directory:
+
+rtf2doc.pl - a Perl script which will take .rtf files generated by 
+    Jade and convert them to Word .doc format. In the process, 
+    referenced graphic files will be embedded into the documents,
+    and page numbers references will be resolved. Requires MS Word
+    97.d
\ No newline at end of file
diff --git a/contrib/catalog b/contrib/catalog
new file mode 100644 (file)
index 0000000..4437285
--- /dev/null
@@ -0,0 +1,3 @@
+-- Copyright (C) 1999 Avi Kivity --
+CATALOG "../dsssl/catalog"
+-- ENTITY "transform.dsl" "transform.dsl" --
\ No newline at end of file
diff --git a/contrib/rtf2doc.pl b/contrib/rtf2doc.pl
new file mode 100644 (file)
index 0000000..f0da050
--- /dev/null
@@ -0,0 +1,49 @@
+#! /usr/bin/perl -w 
+# Copyright (C) 1999 Avi Kivity
+
+sub usage
+{
+    print <<__USAGE__;
+Usage: rtf2doc.pl FILE...
+  Converts one or more MS .rtf FILEs to MS Word .doc files.
+  Requires MS Word 97 or above, plus correct phase of moon.
+__USAGE__
+}
+
+usage(), exit 0 
+    if ($#ARGV < 0) || ($ARGV[0] =~ /^((-h)|(--help))$/);
+
+use Cwd;
+use Win32::OLE;
+use Win32::OLE::Const 'Microsoft Word';
+
+$cwd = cwd();
+
+@storytypes = ( 4, 3, 8, 6, 11, 10, 2, 1, 9, 7, 5 );
+my $Word = Win32::OLE->new('Word.Application', 'Quit');
+die "Cannot open MS Word\n" unless $Word;
+
+foreach (@ARGV) {
+    my $src = $_;
+    $src = "$cwd\\$src"
+        unless $src =~ /^(.:\\)/;
+    my $tgt = "$src.doc";
+    my $Doc = $Word->Documents->Open($src);
+    die "Cannot open $src\n" unless $Doc;
+    $Doc->Repaginate();
+    $Stories = $Doc->StoryRanges;
+    for $s (@storytypes) {
+        eval {            
+            local $SIG{__WARN__} = {};    
+            $Story = $Stories->Item($s);
+            if ($Story) {
+                $Story->Fields->Update();
+                $Story->Fields->Unlink();
+            }
+        };
+    }
+    $Doc->SaveAs($tgt, 0);
+    $Doc->Close();
+}
+
+$Word->Quit();
diff --git a/contrib/transform.dsl b/contrib/transform.dsl
new file mode 100644 (file)
index 0000000..005984f
--- /dev/null
@@ -0,0 +1,73 @@
+<!doctype style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN">
+<!-- Copyright (C) 1999 Avi Kivity -->
+
+<!--
+   
+This stylesheet provides procedures for handling sgml transformations
+using OpenJade's sgml backend. All procedures assume that osnl refers
+to a node of class element.
+
+  (empty-element? osnl)
+  Returns #f if the element has a declared content model of EMPTY.
+
+  (element-attributes osnl)
+  Returns a list of the non-implied attributes of osnl, in the same
+  foramt accepted by the attributes: characteristic of the element
+  flow object.
+  
+  (copy-element osnl)
+  Returns a sosofo that is the identity transformation of osnl. Bug:
+  Defaulted attributes are made explicit. Fix with prlgabs1?
+
+-->
+
+
+<style-specification id=transform>
+
+(declare-flow-object-class element
+    "UNREGISTERED::James Clark//Flow Object Class::element")
+(declare-flow-object-class empty-element
+    "UNREGISTERED::James Clark//Flow Object Class::empty-element")
+(declare-flow-object-class document-type
+    "UNREGISTERED::James Clark//Flow Object Class::document-type")
+(declare-flow-object-class entity
+    "UNREGISTERED::James Clark//Flow Object Class::entity")
+(declare-flow-object-class entity-ref
+    "UNREGISTERED::James Clark//Flow Object Class::entity-ref")
+(declare-flow-object-class formatting-instruction
+    "UNREGISTERED::James Clark//Flow Object Class::formatting-instruction")
+(declare-characteristic preserve-sdata?
+    "UNREGISTERED::James Clark//Characteristic::preserve-sdata?" #f)
+
+(define (empty-element? #!optional (nd (current-node)))
+    (node-property 'must-omit-end-tag? nd)
+)
+
+(define (element-attributes #!optional (nd (current-node)))
+    (let loop ((atts (named-node-list-names (attributes nd))))
+        (if (null? atts)
+            '()
+            (let*
+                (
+                    (name (car atts))
+                    (value (attribute-string name nd))
+                )
+                (if value
+                    (cons (list name value) (loop (cdr atts)))
+                    (loop (cdr atts))
+                )
+            )
+        )
+    )
+)
+
+(define (copy-element #!optional (node (current-node)))
+    (if (empty-element? node)
+        (make empty-element  attributes: (element-attributes node))
+        (make element        attributes: (element-attributes node))
+    )
+)
+
+(mode identity-transform
+    (default (copy-element))        
+)
\ No newline at end of file
diff --git a/develdoc/jadedoc.sgml b/develdoc/jadedoc.sgml
new file mode 100644 (file)
index 0000000..9e0a7a4
--- /dev/null
@@ -0,0 +1,1149 @@
+<!doctype article public "-//Davenport//DTD DocBook V3.0//EN">
+<article>
+  <artheader>
+    <title>Jade internals</title>
+    <author>
+      <firstname>Matthias</firstname>
+      <surname>Clasen</surname>
+      <affiliation>
+       <address format="linespecific">
+         <email>clasen@mathematik.uni-freiburg.de</email>
+       </address>
+      </affiliation>
+    </author>
+    <date>5.6.99</date>
+  </artheader>
+  <abstract>
+    <para>This document describes the Jade DSSSL engine
+      from the programmers point of view. It was written to
+      help people who want to extend Jade.</para>
+  </abstract>
+  <sect1>
+    <title>Package organization</title>
+    <sect2>
+      <title>Directory contents</title>
+      <para>The follwing directories contain files needed during the
+      build:</para> 
+      <variablelist>
+       <varlistentry>
+         <term><filename>all/</filename></term>
+         <listitem><para>Visual C++ build process</para></listitem>
+       </varlistentry>
+       <varlistentry>
+         <term><filename>config/</filename></term>
+         <listitem><para>autoconf build process</para></listitem>
+       </varlistentry>
+       <varlistentry>
+         <term><filename>jadedist/</filename></term>
+         <listitem><para>creating a distribution</para></listitem>
+       </varlistentry>
+      </variablelist>
+      <para>The following directories contain documentation:</para>
+      <variablelist>
+       <varlistentry>
+         <term><filename>doc/</filename></term>
+         <listitem><para>SP documentation</para></listitem>
+       </varlistentry>
+       <varlistentry>
+         <term><filename>jadedoc/</filename></term>
+         <listitem><para>Jade documentation</para></listitem>
+       </varlistentry>
+      </variablelist>
+      <para>The following directories contain
+      <acronym>SGML</acronym>/<acronym>DSSSL</acronym> text files:</para>
+      <variablelist>
+       <varlistentry>
+         <term><filename>dsssl/</filename></term>
+         <listitem><para>DTDs for style sheets and FOT output; jadetex;
+             examples</para></listitem>
+       </varlistentry>
+       <varlistentry>
+         <term><filename>pubtext/</filename></term>
+         <listitem><para>various DTDs and catalogs</para></listitem>
+       </varlistentry>
+       <varlistentry>
+         <term><filename>unicode/</filename></term>
+         <listitem><para><acronym>SGML</acronym> declaration and catalog for
+         dealing with Unicode</para></listitem>
+       </varlistentry>
+      </variablelist>
+      <para>The following directories contain the sources of the various
+      libraries:</para> 
+      <variablelist>
+       <varlistentry>
+         <term><filename>include/</filename></term>
+         <term><filename>lib/</filename></term>
+         <listitem><para>the SP library</para></listitem> 
+       </varlistentry>
+       <varlistentry>
+         <term><filename>style/</filename></term>
+         <listitem><para>the <acronym>DSSSL</acronym> style
+             engine</para></listitem>
+       </varlistentry>
+       <varlistentry>
+         <term><filename>grove/</filename></term>
+         <listitem><para>an abstract interface to groves</para></listitem>
+       </varlistentry>
+       <varlistentry>
+         <term><filename>spgrove/</filename></term>
+         <listitem><para>an implementation of the grove
+             interface</para></listitem> 
+       </varlistentry>
+       <varlistentry>
+         <term><filename>groveoa/</filename></term>
+         <listitem><para>an <acronym>OLE</acronym>-enabled version of the
+             grove builder, Windows-only</para></listitem>  
+       </varlistentry>
+       <varlistentry>
+         <term><filename>generic</filename></term>
+         <listitem><para>simple <acronym>API</acronym> for applications
+         derived from SP</para></listitem>
+       </varlistentry>
+      </variablelist>
+      <para>Applications:</para>
+      <variablelist>
+       <varlistentry>
+         <term><filename>nsgmls/</filename></term>
+         <listitem><para>an <acronym>SGML</acronym> parser</para></listitem>
+       </varlistentry>
+       <varlistentry>
+         <term><filename>sgmlnorm/</filename></term>
+         <listitem><para>an <acronym>SGML</acronym> normalizer</para>
+         </listitem>
+       </varlistentry>
+       <varlistentry>
+         <term><filename>spam/</filename></term>
+         <listitem><para>a markup stream editor</para></listitem>
+       </varlistentry>
+       <varlistentry>
+         <term><filename>spent/</filename></term>
+         <listitem><para>a frontend to the SP entity manager</para>
+         </listitem>
+       </varlistentry>
+       <varlistentry>
+         <term><filename>sx/</filename></term>
+         <listitem><para>a simple <acronym>SGML</acronym> to
+             <acronym>XML</acronym> converter</para></listitem>
+       </varlistentry>
+       <varlistentry>
+         <term><filename>jade/</filename></term>
+         <listitem><para>the source of the Jade application and its various
+             backends</para></listitem>
+       </varlistentry>
+      </variablelist>
+    </sect2>
+    <sect2>
+      <title>The build system</title>
+      <para>TODO: What needs to be said here ? msggen.pl; What makefiles
+      are used and included where; list of defines in config.h;
+      building by hand vs. configure</para>
+    </sect2>
+  </sect1>
+  <sect1>
+    <title>Coding conventions</title>
+    <sect2>
+      <title>Formatting</title>
+      <para>The following list gives some hints on the coding conventions
+       used throughout the source.</para>
+      <itemizedlist>
+       <listitem>
+         <para>Whitespace.</para>
+         <itemizedlist>
+           <listitem>
+             <para>Statement keywords have one space after them, and no space
+               between the parentheses and the enclosed expression:</para>
+             <programlisting>
+if (foo)  /* good */
+if( foo ) /* bad */
+             </programlisting>
+           </listitem>
+           <listitem>
+             <para>In general there is never a space after an open
+               parenthesis or before a close parenthesis:</para>
+             <programlisting>   
+foo(arg)    /* good */
+foo( arg ) /* bad */
+             </programlisting>
+           </listitem> 
+           <listitem>
+             <para>The * or & in pointer or reference declarations stick to
+               the identifier, not to the type:</para>
+             <programlisting>
+void foo(int *p, int &amp;r) /* good */
+void foo(int* p, int& r) /* bad */
+             </programlisting>     
+           </listitem>
+           <listitem>
+             <para>Put whitespace on either side of operators:</para>
+             <programlisting>   
+x = y + z; /* good */
+x=y+z;     /* bad */
+             </programlisting>
+           </listitem> 
+           <listitem>
+             <para>Indent by 2 characters.</para>
+           </listitem>
+           <listitem>
+             <para>Tabs are set every 8 characters.</para>
+           </listitem>
+         </itemizedlist>
+       </listitem>
+       <listitem>
+         <para>Line breaks.</para>
+         <itemizedlist>
+           <listitem>
+             <para>Expressions broken over more than one line are aligned
+               LISP style:</para> 
+             <programlisting>   
+if ((a
+      && b)
+       || (c
+           && d)) 
+             </programlisting>
+           </listitem> 
+           <listitem>
+             <para>else is on a separate line from the preceding brace:</para>
+             <programlisting>
+if (foo) {
+}
+else if (bar) {
+}
+else {
+}
+             </programlisting>
+           </listitem>
+           <listitem>
+             <para>Long function headers should not be broken before the
+               parenthesis that starts the argument list.</para>
+           </listitem>
+         </itemizedlist>       
+       </listitem>     
+       <listitem>
+         <para>Identifiers.</para>
+         <itemizedlist>
+           <listitem>
+             <para>Use camelCase. Class names and type names start
+               with an upper-case letter. Function names start with a
+               lower-case letter.</para>
+           </listitem>
+           <listitem>
+             <para>Names of private date members end with an
+               underscore.</para> 
+           </listitem>
+         </itemizedlist>
+       </listitem>
+       <listitem>
+         <para>Declarations.</para>
+         <itemizedlist>
+           <listitem>
+             <para>Use public: before private: in class declarations.</para>
+           </listitem>
+           <listitem>
+             <para>Use const wherever applicable.  Declare member functions
+               const if they don't alter the object.  Declare reference
+               arguments const if the function doesn't change them
+               etc.</para> 
+           </listitem>
+           <listitem>
+             <para>Don't declare inline member functions in the body; declare
+               them separately in the header file.</para>
+           </listitem>
+           <listitem>
+             <para>Never have public data members in a class.</para>
+             <para>However is OK to have a struct which is just a bundle of
+               data.  In this case use struct not class.  All members are
+               public and names don't end with an underscore.  There are no
+               member functions (the only exception is that there may be a
+             constructor).</para>           
+           </listitem>
+         </itemizedlist>
+       </listitem>
+       <listitem>
+         <para>Other rules.</para>
+         <itemizedlist>
+           <listitem>
+             <para>case clauses without a break always have a
+               "fall through" comment where the break would occur:</para>
+             <programlisting format="linespecific">
+switch (foo)
+case x:
+/* do something here */
+// fall through
+case y:
+}
+             </programlisting>
+           </listitem> 
+           <listitem>
+             <para>A statement governed by if or else that is longer than a
+               single line always is surrounded by {}. The following is
+               unacceptable:</para>
+             <programlisting> 
+else
+if (foo)
+    ;
+else
+    ;
+             </programlisting>
+           </listitem>
+           <listitem>
+             <para>On the other hand, never use braces around single
+               statements:</para>
+             <programlisting>
+if (foo)   /* good */
+  bar();  
+if (foo) { /* bad */
+  bar();
+}
+             </programlisting>
+           </listitem> 
+           <listitem>
+             <para>Avoid global functions.  All functions should be members
+               of some class.</para>
+           </listitem>
+           <listitem>
+             <para>Try to avoid calling delete except in low-level library
+               classes. For example, don't do:
+               <programlisting>
+void foo() {
+  Obj *p = new Obj;
+
+  ...
+  delete p;
+}
+               </programlisting>
+               Instead do:
+               <programlisting>
+void foo() {
+  Owner&lt;Obj> p(new Obj);
+  ...
+}
+               </programlisting>
+             </para>
+           </listitem>
+           <listitem>
+             <para>If a the default copy constructor and assignment operator
+               will not work for a class, you must do one of two things:
+               Either provide a copy constructor and assigment operator that
+               will work or declare but do not implement aprivate copy
+               constructor and assignment operator.</para>
+           </listitem>
+           <listitem>
+             <para>Avoid C++ exceptions.</para>
+           </listitem>
+           <listitem>
+             <para>You can assume new will never return NULL (either it will
+               throw an exception on systems where that works or it will
+               print a fatal error and exit).</para>
+           </listitem>
+         </itemizedlist>
+       </listitem>
+      </itemizedlist>
+    </sect2>
+    <sect2>
+      <title>Headers</title>
+      <para>Every header file should be surrounded by an ifndef. Here
+       is a skeleton for a header file named 
+       <filename>filename.h</filename>:</para>
+      <programlisting format="linespecific">
+/* copyright notice goes here */
+
+#ifndef filename_INCLUDED
+#define filename_INCLUDED 1
+
+/* contents go here */
+
+#endif /* not filename_INCLUDED */
+      </programlisting>
+    </sect2>
+    <sect2>
+      <title>Namespaces</title>
+      <para>Every file should be surrounded by a namespace. Namespaces are
+       never used directly in order to support compilers which don't
+       understand namespaces. The general skeleton for a
+      <filename>.cxx</filename> file in the namespace NAMESPACE is:</para>
+       <programlisting format="linespecific">
+/* includes go here */
+
+#ifdef NAMESPACE
+namespace NAMESPACE {
+#endif
+
+/* content goes here */
+
+#ifdef NAMESPACE
+}
+#endif
+</programlisting>
+      <para>Files in the <filename>lib/</filename>,
+       <filename>nsgmls/</filename>, <filename>sgmlnorm/</filename>,
+       <filename>spam/</filename>, <filename>spent/</filename>,  
+       <filename>spgrove/</filename> and <filename>sx/</filename>
+       directories use the namespace SP_NAMESPACE. Files in
+       <filename>grove/</filename> use the namespace GROVE_NAMESPACE.
+       Files in <filename>style/</filename> and
+       <filename>jade/</filename> use DSSSL_NAMESPACE.</para>
+      
+      <para>DSSSL_NAMESPACE imports everything from SP_NAMESPACE and
+       GROVE_NAMESPACE (see <filename>style/dsssl_ns.h</filename>).</para>
+
+      <para>VC 5 and 6 have bugs in the namespace management, which mean that
+       all these 3 need to be defined to be the same.</para>
+
+      <para>The conditional stuff is to deal with compilers that don't support
+       namespaces.</para>
+    </sect2>
+    <sect2>
+      <title>Templates</title>
+      <para>To cope with different compilers capabilities with respect to
+      templates, all template instantiations are collected in files with names
+       ending in <filename>_inst.cxx</filename>. These are generated from
+       <filename>_inst.m4</filename> files.</para> 
+      
+      <para>To add a new template instantiation, add a macro call of the
+       form
+<programlisting>
+__instantiate(/* your template instatiation */)
+</programlisting>
+       to the appropriate <filename>.m4</filename> file.</para>
+    </sect2>
+    <sect2>
+      <title>API definitions</title>
+      <para>
+       When building <acronym>DLL</acronym>s on Windows, every class or
+       function which should be exported by the <acronym>DLL</acronym>
+       has to be prefixed with 
+<programlisting format="linespecific">
+__declspec(dllexport)
+</programlisting>
+       when building the <acronym>DLL</acronym> and with
+<programlisting format="linespecific">
+__declspec(dllimport)
+</programlisting>
+       when using it outside the <acronym>DLL</acronym>.</para>
+
+      <para>This is hidden behind the _API macros which get defined
+      appropriately. Every declaration of a class of function which is part of
+      the public interface of its library should be prefixed with the proper
+      _API macro. Files in <filename>include/</filename> use SP_API,  
+       files in <filename>grove/</filename> use GROVE_API,
+       files in <filename>spgrove/</filename> use SPGROVE_API,
+       files in <filename>style/</filename> use STYLE_API.
+      </para>
+    </sect2>
+    <sect2>
+      <title>Messages</title>
+      <para>Messages for the main classes are collected in separate classes.
+       Eg there is a class <classname>InterpreterMessages</classname> for all
+       messages of the class <classname>Interpreter</classname>.</para>
+      
+      <para>The sources (<filename>.h</filename> and <filename>.cxx</filename>
+       files and, on Windows, <filename>.rc</filename> files) for the
+       <classname><replaceable>&lt;class></replaceable>Messages</classname>
+       classes are generated from <filename>.msg</filename> files by
+       the <filename>msggen.pl</filename> Perl script.
+      </para>
+
+       <para>Adding a new message amounts to adding one line to the correct
+       <filename>.msg</filename> file. The lines in these files have the
+       following format:</para> 
+
+      <para><replaceable>&lt;message type></replaceable><replaceable>&lt;args></replaceable>+<replaceable>&lt;identifier></replaceable>+<replaceable>&lt;relevant clause></replaceable>+<replaceable>&lt;message text></replaceable></para>
+        
+      <para><replaceable>&lt;message type></replaceable> must be one of the
+       I, W, Q, X or E. These stand for info, warning, quantity error, idref
+       error and error, respectively.</para>
+
+      <para><replaceable>&lt;args></replaceable> is the number of placeholders
+       of the form %n in the <replaceable>&lt;message
+       text></replaceable>.</para>  
+
+      <para><replaceable>&lt;identifier></replaceable> is the C++-identifier
+       used to refer to the message.</para> 
+
+      <para><replaceable>&lt;relevant clause></replaceable> is used in SP to
+       give an exact reference to the <acronym>SGML</acronym> standard for
+       each error message. Outside of SP, this field is usually left
+       empty.</para> 
+
+      <para><replaceable>&lt;message text></replaceable> is the text of the
+   message. It can contain placeholders of the form %n where n is a number
+   between 0 and <replaceable>&lt;args></replaceable> - 1. These placeholders
+   will be replaced by suitable arguments if the message is issued.</para>
+
+      <para>Message arguments come from classes derived from
+       <classname>MessageArg</classname>.
+       <classname>StringMessageArg</classname> is a string, 
+       <classname>NumberMessageArg</classname> is an unsigned long.</para> 
+
+      <para>There is a special form of message which also gives a location for
+       the error which can be defined by adding one more field of the form
+       +<replaceable>&lt;aux text></replaceable> at the end of message
+       definition. <replaceable>&lt;aux text></replaceable> will usually be
+       an explanation of the location like "first definition was here" (for a
+       duplicate definition error). This form of message is only implemented
+       for <replaceable>&lt;args></replaceable>&le;1.</para> 
+
+      <para>Issuing a message is done by a call of the form
+       <function>message(<replaceable>&lt;class></replaceable>Messages::<replaceable>&lt;identifier></replaceable>, ...)</function>
+       
+       where <replaceable>&lt;class></replaceable> is the class to which the
+       message belongs and <replaceable>&lt;identifier></replaceable> is the
+       identifier used in the message definition. The remaining arguments to
+       the <function>message()</function> call must match the %n placeholders
+       in the message. For messages which give location information, the last
+       argument must be an object of type
+       <classname>Location</classname>.</para>  
+    </sect2>
+  </sect1>
+  <sect1>
+    <title>General overview</title>
+    <sect2>
+      <title>Program structure</title>
+
+      <para>Most of SP and Jade is user-interface independent: it doesn't know
+       whether it's being run from the command line or from a GUI. The 
+       code is organized in several layers.</para>
+      <orderedlist>
+       <listitem><para>The lowest layer is a general purpose class library (mostly
+         template based), which is independent of
+         <acronym>SGML</acronym>/<acronym>XML</acronym>.
+       </para></listitem>
+       <listitem><para>The next layer is a general concept of an entity
+         manager, which is basically an interface to set of services to an
+         <acronym>SGML</acronym> parser; basically it's everything that the
+         <acronym>SGML</acronym> standard leaves undefined or makes 
+         system-dependent for an <acronym>SGML</acronym> parser.  This layer
+         includes the message reporting API
+         (<classname>MessageReporter</classname>,
+         <classname>Message</classname>), catalog API 
+         (<classname>EntityCatalog</classname>), 
+         character set API (<classname>CharsetInfo</classname>), and the
+         entity manager proper
+         (<classname>EntityManager</classname>). Template instantations for
+         this are in <filename>entmgr_inst.m4</filename>.
+       </para></listitem>
+       <listitem><para>Dependent on the first two layers is the core
+         <acronym>SGML</acronym> parser.  This only implements the behaviour
+         defined in the <acronym>SGML</acronym> standard.  Main public  
+         classes are <classname>SgmlParser</classname> and
+         <classname>Event</classname>. Template instantations for this are in 
+         <filename>parser_inst.m4</filename>.
+       </para>
+       </listitem>
+       <listitem><para>The architectural forms engine. It depends on the
+         <acronym>SGML</acronym> parser. Main class is
+         <classname>ArcEngine</classname>. 
+         Template instantiations are in
+         <filename>arc_inst.m4</filename>.</para>
+       </listitem>
+       <listitem><para>An implementation of the entity manager interface. This
+         doesn't depend on the <acronym>SGML</acronym> parser or achitectural
+         forms engine. Main class is
+         <classname>ExtendEntityManager</classname>. This for example 
+         determines what the syntax of a system identifier is. Template
+         instantiations for this are in
+         <filename>xentmgr_inst.m4</filename>.</para>
+       </listitem>
+       <listitem><para>A generic interface to groves; in
+         <filename>grove/Node.h</filename>.  This doesn't depend 
+         on any of the previous layers.</para>
+       </listitem>
+       <listitem><para>An implementation of the grove interface using SP;
+         this is in the <filename>spgrove/</filename> directory. Main class
+         is <classname>GroveBuilder</classname>. This doesn't depend on the
+         implementation of the entity manager interface.</para>
+       </listitem>
+       <listitem><para>An implementation of the <acronym>DSSSL</acronym> style
+         language (the tree construction part, not the formatting part). 
+         This is in the <filename>style/</filename> directory.  There
+         are really two sub parts:</para>
+         <orderedlist>
+           <listitem><para>Packaging of the <acronym>DSSSL</acronym>
+               stylesheet as an <acronym>SGML</acronym> document using
+               architectural forms. Main classes are
+               <classname>DssslSpecEventHandler</classname> and  
+               <classname>StyleEngine</classname>. This doesn't depend on
+               the implemenation of the entity manager and grove
+               interfaces.</para>
+           </listitem>
+           <listitem><para>Processing of the contents of the elements in
+               the <acronym>DSSSL</acronym> stylesheet; this depends only
+               on the entity manager and grove interfaces.
+               The main interface here is <classname>FOTBuilder</classname>
+               which is the interface between the tree construction process
+               and the formatter.</para>
+           </listitem>
+         </orderedlist>
+       </listitem>
+       <listitem><para>Multiple implementations of the
+           <classname>FOTBuilder</classname> interface (the backends).</para> 
+       </listitem>
+      </orderedlist>
+      <para>Parallel to the hierarchy of layers is a hierarchy of convenience
+       classes that collect together various pieces in a convenient way for
+       command line apps.</para>
+      <orderedlist>
+       <listitem><para><classname>CmdLineApp</classname> is the lowest level
+         and depends only on the general purpose class library.</para></listitem>
+       <listitem><para><classname>EntityApp</classname> additionally depends on 
+         the entity manager interface and implementation; it's a convenience
+         class for accessing the functionality of the entity manager with a
+         command line program.</para></listitem> 
+       <listitem><para><classname>ParserApp</classname> additionally depends on the
+         <acronym>SGML</acronym> parser; it packages the parser together with
+         the entity manager for use in a command line program.</para></listitem>
+       <listitem><para><classname>GroveApp</classname> additionally depends on the
+         grove interface and implementation; this packages the functionality
+         of the grove builder in a convenient way for command line
+         apps.</para></listitem>  
+       <listitem><para><classname>DssslApp</classname> additionally depends on 
+         <acronym>DSSSL</acronym> style language implementation, tieing it to
+         the grove implementation; it is packaging up the functionality of
+         the <acronym>DSSSL</acronym> tree construction in a way suitable for
+         command line apps.</para></listitem> 
+       <listitem><para><classname>JadeApp</classname> additionally depends on the
+         backends.</para></listitem>
+      </orderedlist>
+    </sect2>
+    <sect2>
+      <title>Other important classes</title>
+      <para>Short descriptions of several central classes in the
+      <acronym>DSSSL</acronym> style language implementation, some of which
+       have not yet been mentioned.</para>
+      <variablelist>
+       <varlistentry>
+         <term><classname>StyleEngine</classname></term>
+         <listitem>
+           <para>main class of the style
+             library. <classname>DssslApp</classname> 
+             uses an instance of this class to process the grove.</para>
+         </listitem>
+       </varlistentry>
+       <varlistentry>
+         <term><classname>Interpreter</classname></term>
+         <listitem>
+           <para>contains all the stylesheet-related state:
+             there are no global
+             variables. <classname>StyleEngine</classname> owns an instance
+             of this class.</para>
+         </listitem>
+       </varlistentry>
+       <varlistentry>
+         <term><classname>SchemeParser</classname></term>
+         <listitem>
+           <para>parses a part of a <acronym>DSSSL</acronym> spec, creating
+             expression language objects and binding variables using a given
+             <classname>Interpreter</classname>.
+             <classname>StyleEngine</classname> uses instances of this class 
+             to parse the parts of its spec.</para>
+         </listitem>
+       </varlistentry>
+       <varlistentry>
+         <term><classname>ProcessContext</classname></term>
+         <listitem>
+           <para>holds the current state of the processing of a grove.</para>
+         </listitem>
+       </varlistentry>
+       <varlistentry>
+         <term><classname>VM</classname></term>
+         <listitem>
+           <para>represents the state of the virtual machine that
+             implements the expression language.</para>
+         </listitem>
+       </varlistentry>
+       <varlistentry>
+         <term><classname>Expression</classname></term>
+         <listitem>
+           <para><classname>Expression</classname>s are the result of parsing
+             expression language constructs. They are compiled to
+             <classname>Insn</classname>s.</para> 
+         </listitem>
+       </varlistentry>
+       <varlistentry>
+         <term><classname>Insn</classname></term>
+         <listitem>
+           <para>an instruction for the virtual machine.</para>
+           <para>When an instruction is executed it modifies the state of the
+             virtual machine (usually) and then returns the next instruction
+             to be executed. Returning a null <classname>Insn</classname>
+           terminates execution.  Thus the inner loop of the expression
+             evaluator is in a member function of <classname>VM</classname>
+           and looks like:  
+           </para>
+           <programlisting>  
+while (insn)
+    insn = insn->execute(*this);
+</programlisting>
+         </listitem>
+       </varlistentry>
+       <varlistentry>
+         <term><classname>ELObj</classname></term>
+         <listitem>
+           <para>the abstract base class for all expression language
+           types.</para> 
+         </listitem>
+       </varlistentry>
+      </variablelist>
+    </sect2>
+    <sect2>
+      <title>Garbage collection</title>
+
+      <para>
+       For further information on the garbage collection technique used in
+       Jade, look at <ulink url="ftp://ftp.cs.utexas.edu/pub/garbage/bigsurv.ps">ftp://ftp.cs.utexas.edu/pub/garbage/bigsurv.ps</ulink> and
+       <ulink
+              url="ftp://ftp.netcom.com/pub/hb/hbaker/NoMotionGC.html">ftp://ftp.netcom.com/pub/hb/hbaker/NoMotionGC.html</ulink>.</para>
+
+      <para>Basically it works like a copying collector, but the copying is
+       logical rather than physical.  There are two doubly-linked lists one
+       for each of the two spaces of a copying collector.  Every object is
+       one of these two lists.  There's also a bit (the "color") which says
+       which space it is in. To "copy" an object from one space to another,
+       it is unlinked from one list, linked into the other, and its color is
+       flipped.  A key point is that unlike normal copying collectors, this
+       collector never changes the address of a GC object.
+      </para>
+      <para>This is a simplification. It is optimized so that there is one big 
+       circular list of all objects. A pointer into the list separates the 
+       allocated from the free list.  Allocating just moves the pointer along 
+       the list.
+      </para>
+      <para>Garbage collection starts with a set of root objects (more on this 
+       later). It finds all objects reachable from this set of root objects. 
+       All objects not reachable are considered garbage and are put on the
+       free list where they can be reused.  If garbage collection doesn't
+       free up enough objects, then more memory is allocated from the system.
+      </para>
+      <para>There are a couple of twists beyond what's described in the Wilson
+       paper:
+      </para>
+      <orderedlist>
+       <listitem><para>It supports finalization (the ability to call an GC object's
+         destructor when the object is GCed).  All finalizable objects occur
+         before non-finalizable objects in the allocated list.  The garbage
+         collection arranges so that immediately after completing the copy
+         part of a garbage collection, the objects needing finalization are
+         at the head of the free list, thus allowing the collector to
+         efficiently perform finalization.
+       </para></listitem>
+       <listitem><para>Objects which are created during the parsing of the
+         stylesheet, which can never become garbage during the processing of
+         the source document, are separated off into a separate area (these
+         are called "permanent").  All objects reachable from a permanent
+         object must themselves be permanent.
+       </para></listitem>
+       <listitem><para>It has the concept of an object being read-only: it can mark
+         an object and all objects reachable from that object as being
+         read-only (needed for Jade extensions which allow limited mutation
+         of objects). 
+       </para></listitem>
+       <listitem><para>It always allocates a fixed amount of space for a GC object;
+         so the <function>sizeof()</function> any object derived from
+         <classname>ELObj</classname> must be &le; this space. How big 
+         is it? On a 32-bit machine there is space for 16 bytes (eg 4
+         pointers, or a double+int+pointer) beyond what is used by the
+         <classname>ELObj</classname> itself.  On a 64-bit machine it will be
+         about twice that; <function>maxObjSize()</function> in
+         <filename>style/Interpreter.cxx</filename> figures it out at
+         runtime, so to be safe add any new  types of
+         <classname>ELObj</classname> to the table in
+         <function>maxObjSize()</function>.  But make 
+         sure you don't use more than 16 bytes on a 32-bit machine, otherwise
+         you will significantly increase Jade's memory consumption.  If you
+         need more space than this, then the <classname>ELObj</classname>
+         should have a pointer to dynamically allocated memory; in this case
+         you must deallocate the memory in the destructor.  In this case and
+         any other case where an <classname>ELObj</classname> has a  
+         destructor that must be called, you must declare an operator
+         <function>new()</function>:
+<programlisting>         
+void *operator new(size_t, Collector &lt;c) 
+{
+  return c.allocateObject(1);
+}
+</programlisting>
+This tells the garbage collector that the object has a destructor that
+must be called when the object becomes garbage.
+</para></listitem>
+</orderedlist>
+
+      <para>A key aspect of correct use of the garbage collector is to ensure
+       that the collector always has a sufficient set of roots.  Any time
+       that C++ code does anything that may allocate a GC object, any GC
+       object that is not reachable from a root object may get recycled by
+       the system.  The way to create a root is to use an auto variable of
+       type <classname>ELObjDynamicRoot</classname>.  An
+       <classname>ELObjDynamicRoot</classname> adds a single
+       <classname>ELObj</classname> as a root for the
+       <classname>Collector</classname> for as long as the
+       <classname>ELObjDynamicRoot</classname> is in scope.  The first
+       argument of the <classname>ELObjDynamicRoot</classname> constructor
+       specifies the collector. The second argument specifies the
+       <classname>ELObj</classname> that is to be made a root. The
+       <classname>ELObj</classname> that the
+       <classname>ELObjDynamicRoot</classname> causes to be a 
+       root can be changed by assiging an <classname>ELObj</classname> to the
+       <classname>ELObjDynamicRoot</classname>.  There's also a  
+       conversion from <classname>ELObjDynamicRoot</classname> to
+       <classname>ELObj</classname> *.</para>
+      <example>
+       <title>The <function>reverse()</function> function</title>
+      <programlisting>
+DEFPRIMITIVE(Reverse, argc, argv, context, interp, loc)
+{
+  ELObjDynamicRoot protect(interp, interp.makeNil());
+  ELObj *p = argv[0];
+  while (!p->isNil()) {
+    PairObj *tem = p->asPair();
+    if (!tem)
+      return argError(interp, loc,
+                     InterpreterMessages::notAList, 0, argv[0]);
+    protect = new (interp) PairObj(tem->car(), protect);
+    p = tem->cdr();
+  }
+  return protect;
+}
+</programlisting>
+       <para>protect is a dynamic root that contains the currently created
+         part of the reversed node list.  Making this a root ensures that all
+         the newly created <classname>PairObj</classname>s are reachable from
+         a root.</para>
+      </example>
+      <example>
+       <title>The <function>NodeListRef()</function> function</title>
+      <para>The <function>NodeListRef()</function> function gives an example of
+       the sort of bug that can creep in if you're not very careful. This
+       used to end like this:
+       <programlisting>
+return new (interp) 
+    NodePtrNodeListObj(nl->nodeListRef(k, context, interp));
+       </programlisting>
+         The <function>nodeListRef()</function> function sometimes
+       allocatesthat it takes an <classname>Interpreter</classname> argument
+       is a good clue).  So what could happen is:</para>
+       <orderedlist>
+         <listitem><para>operator <function>new()</function> gets called to
+           allocate a new object</para></listitem> 
+         <listitem><para><function>nodeListRef()</function> gets called in a
+           way that causes an allocation</para></listitem> 
+         <listitem><para>the free list happens to be empty, so the garbage
+           collector gets run; the newly allocated object is not reachable
+           from a root, so it gets GCed and recycled</para></listitem>
+         <listitem><para>the constructor gets called with a GC object that
+           the garbage collector thinks is free</para></listitem>
+       </orderedlist>
+      <para>
+       The fix was to rewrite it as:
+       <programlisting>  
+NodePtr nd(nl->nodeListRef(k, context, interp));
+return new (interp) NodePtrNodeListObj(nd);
+       </programlisting>       
+      </para>
+      </example>
+    </sect2>
+  </sect1>
+  <sect1>
+    <title>How to add a new application</title>
+    <para>Create a subclass of one of the <classname>App</classname> classes;
+      use the macro SP_DEFINE_APP.</para>
+    <para>TODO: This needs more detail. Perhaps 
+      use <command>spcat</command> as example.</para>
+  </sect1>
+  <sect1>
+    <title>Extending Jade</title>
+    <sect2>
+      <title>Utility classes</title>
+      <para>TODO: Explain Char, String, Vector, StringC, Ptr, Owner</para>
+      <para>TODO: Maybe move this to the "General overview".</para>
+    </sect2>
+    <sect2>
+      <title>Primitives</title>
+      <para>Primitives of the expression language, the SDQL and the style
+       language are implemented as subclasses of
+      <classname>PrimitiveObj</classname> 
+       (<filename>style/Insn.h</filename>,
+      <filename>style/Insn.cxx</filename>). All primitives are defined in the
+       files <filename>style/primitive.h</filename> and
+      <filename>style/primitive.cxx</filename>. Adding a new primitive is done
+      by adding a macro call of the form
+       <programlisting format="linespecific">
+PRIMITIVE(<replaceable>&lt;class name prefix></replaceable>,
+         "<replaceable>&lt;primitive name></replaceable>", 
+          <replaceable>&lt;req. args></replaceable>, <replaceable>&lt;opt. args></replaceable>, <replaceable>&lt;rest arg></replaceable>)
+       </programlisting>
+       to <filename>style/primitive.h</filename> and a macro call of the form
+       <programlisting format="linespecific">
+DEFPRIMITIVE(<replaceable>&lt;class name prefix></replaceable>, argc, argv,
+            context, interp, loc)
+       </programlisting>
+       to <filename>style/primitive.cxx</filename>, followed by the body of
+       the function 
+       <function>PrimitiveObj::primitiveCall()</function> as needed for the
+       function you want to add.</para>
+
+      <para>For a new external procedure, use XPRIMITIVE instead of PRIMITIVE.
+       The new procedure can be accessed using the public identifier</para>
+      <para>"UNREGISTERED::James Clark//Procedure::<replaceable>&lt;primitive name></replaceable>".</para>    
+      <example>
+       <title>The <function>sin</function> function</title>
+       <para>We can add the <function>sin</function> defined in clause
+         8.5.7.18 of the <acronym>DSSSL</acronym> standard by appending
+         <programlisting>
+PRIMITIVE(Sin, "sin", 1, 0, 0)
+         </programlisting>      
+         to <filename>style/primitive.h</filename> and 
+         <programlisting>
+DEFPRIMITIVE(Sin, argc, argv, context, interp, loc)
+{
+  double d;
+  if (!argv[0]->realValue(d)) 
+  return argError(interp, loc,
+                   InterpreterMessages::notANumber, 0, argv[0]);
+  return new (interp) RealObj(sin(d));
+}
+         </programlisting>      
+         to <filename>style/primitive.cxx</filename>.</para>
+      </example>
+    </sect2>
+    <sect2>
+      <title>Expression language types</title>
+      <para>Relevant classes:</para>
+      <variablelist>
+       <varlistentry>
+         <term><classname>ELObj</classname></term> 
+         <listitem>
+           <para>Adding a new expression language type
+             is done by adding a new subclass of
+             <classname>ELObj</classname>. Make sure to follow the advise
+             in the section on garbage collection with respect to the size of
+             the subclass.</para>
+         </listitem> 
+       </varlistentry>
+       <varlistentry>
+         <term>SchemeParser</term>
+         <listitem>
+           <para>You will have to add a method for generating
+             objects of the new type. This will generally involve a line like 
+             <programlisting>
+result = new (*interp_) <replaceable>&lt;your class></replaceable>(...)
+             </programlisting>    
+       The *interp_ argument to new is important to make
+       the newly generated object properly garbage collected.</para>
+         </listitem>
+       </varlistentry>
+      </variablelist>
+      <para>TODO: is this all ? add an example!</para>
+    </sect2>
+    <sect2>
+      <title>Backends</title>
+      <para>In order to create a completely new backend, you first
+       need to create a new subclass of
+      <classname>SerialFOTBuilder</classname> implementing the output 
+       format you are interested in. It is probably a good idea to
+       take an existing backend as a skeleton.</para>
+      <para>TODO: More detail needed.</para>
+
+      <para>To make the new backend available to Jade, you have to
+       add new values for your backend to 
+       <type>JadeApp::OutputType</type> and
+       <type>JadeApp::outputTypeNames</type> and add a new 
+       case to the switch statement in 
+       <function>JadeApp::makeFOTBuilder()</function> 
+       returning an instance of your <classname>FOTBuilder</classname>
+       subclass.</para>  
+    </sect2>
+    <sect2>
+      <title>Flow objects</title>
+      <para>For a standard flow object, you must create
+       a new subclass of <classname>FlowObj</classname> (atomic)
+       or <classname>CompoundFlowObj</classname> (nonatomic).
+       Do not forget to add a FLOW_OBJ macro call for the new class
+       in the <function>Interpreter::installFlowObjs()</function> function
+       in <filename>style/FlowObj.cxx</filename>.</para>
+      
+      <para>The <function>processInner()</function> of the new class
+       is responsible for calling the <classname>FOTBuilder</classname>
+       function (or pair of functions for nonatomic flow objects) associated
+       with the flow object in question. You may have to add these
+       functions to the interface of the <classname>FOTBuilder</classname>
+       class and provide default definitions there. These have to
+       be overridden by the backends (<classname>FOTBuilder</classname>
+       subclass) in order to implement the flow object in question.</para>
+
+      <para>TODO: explain extension flow objects</para>
+    </sect2>
+    <sect2>
+      <title>Command line switches</title>
+      <para>If you are adding a new Jade-specific option, add it to 
+       <classname>JadeApp</classname>. If the option you are adding
+       influences the behaviour of the style engine, add it to
+      <classname>DssslApp</classname>.</para> 
+
+      <para>Adding an option amount to registering it in the constructor 
+       with <function>registerOption()</function> and handling it in
+       <function>processOption()</function>. 
+      </para>
+      
+      <para>The <classname>CmdLineApp</classname> supports only single-letter options. You should
+       make sure that you don't choose a letter that is already taken:
+      </para>
+      <variablelist>
+       <varlistentry>
+         <term>b, f, v</term>
+           <listitem><para>registered by
+               <classname>CmdLineApp</classname></para></listitem> 
+       </varlistentry>
+       <varlistentry>
+         <term>c, C, D</term>
+           <listitem><para>registered by
+               <classname>EntityApp</classname></para></listitem> 
+       </varlistentry>
+       <varlistentry>
+         <term>a, A, e, E, g, i, w</term>
+           <listitem><para>registered by
+               <classname>ParserApp</classname></para></listitem> 
+       </varlistentry>
+       <varlistentry>
+         <term>G, 2, d, V</term>
+           <listitem><para>registered by
+               <classname>DssslApp</classname></para></listitem>
+       </varlistentry>
+       <varlistentry>
+         <term>t, o</term>
+           <listitem><para>registered by
+               <classname>JadeApp</classname></para></listitem>
+       </varlistentry>
+      </variablelist>    
+      <example>
+       <title>A -s flag for <classname>DssslApp</classname></title>
+       <para>Lets assume you have changed the
+         <classname>StyleEngine</classname> constructor to accept one
+         more bool parameter strict_, which you want to be set depending
+         on the -s command line flag.</para>
+
+       <para>We add a new private member strict_ to
+         <classname>DssslApp</classname> to hold the value until we pass
+         it to the <classname>StyleEngine</classname> constructor. Thus we
+         insert
+       <programlisting format="linespecific">
+bool strict_;    
+       </programlisting>
+         at the very end of the <classname>DssslApp</classname> class
+         declaration in <filename>style/DssslApp.h</filename>.</para>
+       <para>Now we change the constructor to
+         <programlisting>
+DssslApp::DssslApp(int unitsPerInch)
+: GroveApp("unicode"), unitsPerInch_(unitsPerInch),
+  dssslSpecOption_(0), debugMode_(0), dsssl2_(0),
+  strict_(0)  // this line is new
+{
+  registerOption('G');
+  registerOption('2');
+  registerOption('d', SP_T("dsssl_spec"));
+  registerOption('V', SP_T("variable"));
+  registerOption('s'); // this line is new
+}
+         </programlisting> 
+         and the function <function>processOption()</function> to
+         <programlisting format="linespecific">
+void DssslApp::processOption(AppChar opt, const AppChar *arg)
+{
+  switch (opt) {
+  case 's':  // new case        
+    strict_ = 1;
+    break;
+  /* other cases stay the same */
+    }
+}
+         </programlisting>
+         Finally, we change the call of the
+         <classname>StyleEngine</classname> constructor in
+         <function>processGrove()</function> to
+         <programlisting format="linespecific">
+StyleEngine se(*this, *this, unitsPerInch_, debugMode_, 
+               dsssl2_, strict_, extensions);
+         </programlisting>
+         </para>
+      </example>
+    </sect2>
+    <sect2>
+      <title>Supporting a larger grove plan</title>
+      <para>???</para>
+    </sect2>
+    <sect2>
+      <title>Translating messages</title>
+      <para>I can explain this only for the <function>gettext()</function>
+      support. Here are the necessary steps:</para>
+      <procedure>
+       <step performance="required">
+         <para>Make sure to define SP_HAVE_GETTEXT and undefine
+           SP_NO_MESSAGE_TEXT. I had to change the test for
+           <function>gettext()</function> in
+           <filename>config/configure.in</filename> from
+           <programlisting format="linespecific">
+AC_CHECK_LIB(intl,gettext,AC_DEFINE(SP_HAVE_GETTEXT) LIBS="$LIBS -lintl")
+           </programlisting>
+           to
+           <programlisting format="linespecific">
+AC_CHECK_FUNC(gettext,AC_DEFINE(SP_HAVE_GETTEXT),
+  AC_CHECK_LIB(intl,gettext,AC_DEFINE(SP_HAVE_GETTEXT) LIBS="$LIBS -lintl"))
+           </programlisting>
+           and call <command>autoconf</command> to regenerate
+           the <filename>configure</filename> script.</para>
+       </step>
+       <step performance="required">
+         <para>Add the following to <filename>msggen.pl</filename>
+           in order to generate <filename>.po</filename> files:</para>
+         <programlisting format="linespecific">
+chmod 0666, "$file_base.po";
+unlink("$file_base.po");
+open(OUT, ">$file_base.po");
+chmod 0444, "$file_base.po";
+select(OUT);
+
+printf "# %s\n\n", $file_base;
+
+foreach $i (0 .. $#message) {
+    if (defined($message[$i])) {
+       $str = $message[$i];
+       $str =~ s/"/""/g;
+       printf "msgid \"%s\"\nmsgstr \"\"\n\n", $str;
+    }
+    elsif (defined($message2[$i])) {
+       $str = $message2[$i];
+       $str =~ s/"/""/g;
+       printf "msgid \"%s\"\nmsgstr \"\"\n\n", $str;
+    }
+}
+
+close(OUT);
+         </programlisting>
+       </step>
+       <step performance="required">
+         <para>Build everything.</para>
+       </step>
+       <step performance="required">
+         <para>Collect the various .po files in one big one:</para>
+         <programlisting format="linespecific">
+for i in */*.po; do cat $i >> messages.po; done
+         </programlisting>
+       </step>
+       <step performance="required">
+         <para>Make a copy of <filename>messages.po</filename> for
+           the language you are interested in and add the translations.</para>
+       </step>
+       <step performance="required">
+         <para>Compile the translated file and install the resulting
+           <filename>.mo</filename> file under the name
+           <filename>sp.mo</filename> in the appropriate directory:</para> 
+         <programlisting format="linespecific">
+msgfmt -o de.mo de.po
+cp de.mo /usr/local/share/locale/de/LC_MESSAGES/sp.mo
+         </programlisting>
+       </step>
+      </procedure>
+    </sect2>
+  </sect1>
+</article>
+
+
diff --git a/develdoc/missing b/develdoc/missing
new file mode 100644 (file)
index 0000000..a154ece
--- /dev/null
@@ -0,0 +1,240 @@
+This collects stuff from the DSSSL standard which is 
+not implemented (yet) in OpenJade. A '+' at the end of 
+a line indicates that there is a patch implementing it.
+A '*' indicates it is already in CVS.
+
+
+missing DSSSL architectural element forms
+=========================================
+
+7.1.1  features
+7.1.2  sgml-grove-plan
+7.1.3  char-repertoire         * 
+7.1.5  other-chars             +
+7.1.6  baseset-encoding        + (the patch is only semi-functional)
+7.1.7  literal-described-char  + (the patch is only semi-functional)
+7.1.9  add-separator-chars     *
+7.1.10 add-name-chars          *
+7.1.11 combine-char            + (the patch is only semi-functional)
+
+
+missing expression language primitives
+======================================
+
+8.5.8.1                declare-char-property *
+               add-char-properties   *
+8.5.8.2                language?        *
+               current-language *
+               with-language    *
+8.5.8.2.1      define-language  *
+8.5.8.4                char<?           *
+               char>?           *
+               char<=?          * 
+               char>=?          *
+8.5.8.5                char-ci<?        *
+               char-ci>?        *
+               char-ci<=?       *
+               char-ci>=?       *
+8.5.8.6                char-upcase      *
+               char-downcase    *
+8.5.8.7                char-property    * 
+8.5.9.5                string-ci=?      *
+               string-equiv?    *
+8.5.9.6                string<?         *
+               string>?         *
+               string<=?        *
+               string>=?        *
+               string-ci<?      *
+               string-ci>?      *
+               string-ci<=?     *
+               string-ci>=?     *
+
+
+missing property set modules
+============================
+
+basesds1
+sdclabs
+sdclsds
+prlgabs1                  * 
+prlgsds
+instsds1
+dtgabs
+rankabs
+srabs
+srsds
+linkabs
+linksds
+subdcsds
+fpiabs
+
+
+missing SDQL primitives
+=======================
+
+10.1.1 current-root         *
+10.2.1 value-proploc
+       list-proploc
+       node-list-proploc
+       listloc
+       nameloc
+       groveloc
+       treeloc
+       pathloc
+       relloc-any
+       relloc-esib
+       relloc-ysib
+       relloc-des
+       datatok
+       make-grove
+       literal-match
+       hylex-match
+       compare
+       ordered-may-overlap?
+       ordered-no-overlap?
+       span
+10.2.2 node-list-reduce                *
+       node-list-contains?             *
+       node-list-remove-duplicates     *
+       node-list-union                 *
+       node-list-intersection          *
+       node-list-difference            *
+       node-list-symmetric-difference  *
+       node-list-map                   *
+       node-list-union-map             *
+       node-list-some?                 *
+       node-list-every?                *
+       node-list-filter                *
+       node-list->list                 *
+       node-list-tail                  *
+       node-list-head                  *
+       node-list-sublist               *
+       node-list-count                 *
+       node-list-last                  *
+       there-exist?                    *
+       for-all?                        *
+       select-each                     *
+       union-for-each                  *
+10.2.3 node-list-property              *
+       origin                          *
+       origin-to-subnode-rel           *
+       tree-root                       *
+       grove-root                      *
+       source                          *
+       subtree                         *
+       subgrove                        *
+       ancestors                       *
+       grove-root-path                 *
+       rsiblings                       *
+       ipreced                         *
+       ifollow                         *
+       grove-before?                   *
+       sort-in-tree-order              *
+       tree-before?                    *
+       tree-before                     *
+       property-lookup                 *
+       select-by-property              *
+       select-by-null-property         *
+       select-by-missing-property      *
+10.2.5 attribute                       *
+       referent                        *
+       q-element                       *
+       q-class                         *
+       q-sdata                         *
+10.3.1         word-parse
+       select-tokens
+10.3.2 regexp?
+10.3.3 regexp-node
+       regexp-seq
+       regexp-or
+       regexp-and
+       regexp-rep
+       regexp-plus
+       regexp-opt
+       regexp-range
+       string->regexp
+10.3.4 regexp-search
+       regexp-search-disjoint
+
+
+Transformation language
+=======================
+
+
+Style language
+==============
+
+12.4.1   query
+12.4.6  char-script-case
+        declare-char-characteristic+property *
+12.4.7  sync
+        side-sync
+12.5.1  generated-object?
+12.5.1.1 general-indirect-sosofo
+        asis-indirect-sosofo
+        number-indirect-sosofo
+12.5.1.2 page-number
+        category-page-number
+        page-number-in-node
+        total-node-page-numbers
+        column-number
+        footnote-number
+        line-number
+12.5.1.3 declare-reference-value-type
+        first-area-reference-value      
+        last-area-reference-value       
+        last-preceding-area-reference-value     
+        all-area-reference-value        
+12.5.3  decoration-area
+        decorated-area-width
+        decorated-area-height
+12.5.7  font-property
+
+
+Missing color spaces
+====================
+
+ISO/IEC 10179:1996//Color-Space Family::Device Gray     *
+ISO/IEC 10179:1996//Color-Space Family::Device CMYK     *
+ISO/IEC 10179:1996//Color-Space Family::Device KX       *
+ISO/IEC 10179:1996//Color-Space Family::CIE LAB         *
+ISO/IEC 10179:1996//Color-Space Family::CIE LUV         *
+ISO/IEC 10179:1996//Color-Space Family::CIE Based ABC   *
+ISO/IEC 10179:1996//Color-Space Family::CIE Based A     *
+
+
+Missing flow object classes
+===========================
+
+page-sequence       (and related expression language primitives and types) 
+column-set-sequence (and related expression language primitives and types) 
+anchor
+embedded-text
+included-container-area
+side-by-side
+side-by-side-item
+glyph-annotation
+aligned-column
+multi-line-inline-note
+emphasizing-mark
+
+
+Ignored inherited characteristics
+=================================
+
+force!c                         *
+inline-space-space              *
+line-miter-limit
+alignment-point-offset
+hyphenation-char
+asis-truncate-char
+asis-wrap-char
+first-line-align
+hyphenation-exceptions
+box-corner-rounded
+table-corner-rounded
+line-dash
+allowed-ligatures
+line-number
+line-spacing-priority
+char-map
diff --git a/doc/Makefile b/doc/Makefile
new file mode 100644 (file)
index 0000000..a56e707
--- /dev/null
@@ -0,0 +1,22 @@
+NSGMLS=nsgmls
+DOCS=archform.htm \
+  build.htm \
+  catalog.htm \
+  charset.htm \
+  features.htm \
+  generic.htm \
+  ideas.htm \
+  index.htm \
+  new.htm \
+  nsgmls.htm \
+  sgmldecl.htm \
+  sgmlnorm.htm \
+  sgmlsout.htm \
+  spam.htm \
+  spent.htm \
+  sysdecl.htm \
+  sysid.htm
+
+validate: $(DOCS)
+       $(NSGMLS) -sB $(DOCS)
+       touch validate
diff --git a/doc/archform.htm b/doc/archform.htm
new file mode 100644 (file)
index 0000000..65ac2e1
--- /dev/null
@@ -0,0 +1,372 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML Strict//EN">
+<HTML>
+<HEAD>
+<TITLE>Architectural Form Processing</TITLE>
+</HEAD>
+<BODY>
+<H1>Architectural Form Processing</H1>
+<P>
+The Hytime standard (ISO/IEC 10744) introduced the concept of
+architectural forms.  This document assumes you are already familiar
+with this concept. HyTime 2nd Edition generalizes this, and makes it
+possible to have an <I>architecture engine</I> which can perform
+architectural form processing for arbitrary architectures.  SP
+includes such an architecture engine.
+<P>
+Non-markup sensitive applications built using SP now support
+architectural form processing using the <SAMP>-A
+<VAR>archname</VAR></SAMP> option.  When this option is specified, the
+document will be validated against all declared base architectures,
+and the output will be for the architectural document for that
+architecture: the element types, notations and attributes will be
+those defined in the meta-DTD.
+<P>
+Although spam does not support the <SAMP>-A</SAMP> option because it
+works with the markup of your document, sgmlnorm does.
+
+<H2>Architectural Support Attributes</H2>
+<P>
+To use the <SAMP>-A</SAMP> option with a document, you must add
+<UL>
+<LI>
+an architecture base declaration for <SAMP><VAR>archname</VAR></SAMP>,
+<LI>
+a notation declaration and associated attribute definition list
+declaration for <SAMP><VAR>archname</VAR></SAMP>;
+this is called the <I>architecture notation declaration</I>.
+</UL>
+<P>
+An architecture base declaration is a processing instruction of the form:
+<PRE>
+&lt;?IS10744 ArcBase <VAR>archname</VAR>&gt;
+</PRE>
+<P>
+The processing instruction is recognized either in the DTD or in an
+active LPD.
+<P>
+The architecture notation declaration and associated attribute
+definition list declaration serve to declare a number of architectural
+support attributes which control the architecture engine.  The value
+for each architecture support attribute is taken from the default
+value, if any, specified for that attribute in the attribute
+definition list declaration.  It is an error to declare an
+architecture support attribute as <SAMP>#REQUIRED</SAMP>.
+<P>
+The following architectural support attributes are recognized:
+<DL>
+<DT>
+<SAMP>ArcDTD</SAMP>
+<DD>
+The name of an external entity that contains the meta-DTD.
+This attribute is required.
+If the name starts with the PERO delimiter <SAMP>%</SAMP>,
+the entity is a parameter entity,
+otherwise it is a general entity.
+<DT>
+<SAMP>ArcQuant</SAMP>
+<DD>
+A list of tokens that looks like what follows <SAMP>QUANTITY SGMLREF</SAMP>
+in the quantity set section of an SGML declaration.
+The quantities used for parsing the meta-DTD
+and validating the architectural document
+will be the maximum of the quantities in the document's concrete syntax
+and the quantities specified here.
+<DT>
+<SAMP>ArcDocF</SAMP>
+<DD>
+The name of the document element type in the meta-DTD.
+This would be <SAMP>HyDoc</SAMP> for HyTime.
+This defaults to <SAMP><VAR>archname</VAR></SAMP>.
+<DT>
+<SAMP>ArcFormA</SAMP>
+<DD>
+The name of the attribute that elements use to specify the
+corresponding element type, if any, in the meta-DTD.
+Data entities also use this attribute to specify the corresponding
+notation in the meta-DTD.
+This would be <SAMP>HyTime</SAMP> for HyTime.
+This defaults to <SAMP><VAR>archname</VAR></SAMP>.
+<DT>
+<SAMP>ArcNamrA</SAMP>
+<DD>
+The name of the attribute that elements use to specify substitutes for
+the names of attributes in the meta-DTD.  A value of
+<SAMP>#DEFAULT</SAMP> is allowed for a substitute name; this inhibits
+mapping of an attribute to an architectural attribute, but specifies
+that the value of the architectural attribute should be defaulted
+rather than taken from the value of another attribute in the document.
+For HyTime the value of this attribute would be <SAMP>HyNames</SAMP>.
+By default no attribute name substitutition is done.
+<DT>
+<SAMP>ArcSuprA</SAMP>
+<DD>
+The name of an attribute that elements may use to suppress processing
+of their descendants.  This attribute is not recognized for data
+entities.  The value of the attribute must be one of the following
+tokens:
+<DL>
+<DT>
+<SAMP>sArcAll</SAMP>
+<DD>
+Completely suppress all architectural processing of descendants.
+It is not possible to restore architectural processing
+for a descendant.
+<DT>
+<SAMP>sArcForm</SAMP>
+<DD>
+Suppress processing of the <SAMP>ArcFormA</SAMP> attribute of all
+descendants of this element, except for those elements that have a
+non-implied <SAMP>ArcSuprA</SAMP> attribute.
+<DT>
+<SAMP>sArcNone</SAMP>
+<DD>
+Don't suppress architectural processing for the descendants of
+this element.
+</DL>
+<P>
+The value may also be implied, in which case the state of
+architectural processing is inherited.
+<P>
+If an element has an ArcSuprA attribute that was processed, its
+ArcFormA attribute will always be processed.  Otherwise its ArcFormA
+attribute will be processed unless its closest ancestor that has a
+non-implied value for the ArcSuprA attribute suppressed processing of
+the ArcFormA attribute.  An element whose ArcFormA attribute is
+processed will not be treated as architectural if it has an implied
+value for the ArcFormA attribute.
+<DT>
+<SAMP>ArcSuprF</SAMP>
+<DD>
+The name of the element type in the meta-DTD that suppresses
+architectural processing in the same manner as does the
+<SAMP>sHyTime</SAMP> form in HyTime.  By default, no element type
+does.  This behaves like an element with an
+<SAMP>ArcSuprA</SAMP> attribute of <SAMP>sArcForm</SAMP>.  The element
+type should be declared in the meta-DTD.  You should not specify a
+value for this attribute if you specified a value for the
+<SAMP>ArcSuprA</SAMP> attribute.
+<P>
+This is a non-standardized extension.
+<DT>
+<SAMP>ArcIgnDA</SAMP>
+<DD>
+The name of an attribute that elements may use to control whether
+data is ignored.
+The value of the attribute must be one of the following values:
+<DL>
+<DT>
+<SAMP>nArcIgnD</SAMP>
+<DD>
+Data is not ignored.
+It is an error if data occurs where not allowed by the meta-DTD.
+<DT>
+<SAMP>cArcIgnD</SAMP>
+<DD>
+Data is conditionally ignored.
+Data will be ignored only when it occurs where the meta-DTD
+does not allow it.
+<DT>
+<SAMP>ArcIgnD</SAMP>
+<DD>
+Data is always ignored.
+</DL>
+<P>
+The value may also be implied, in which case the state of
+architectural processing is inherited.
+If no the document element has no value specified,
+<SAMP>cArcIgnD</SAMP> will be used.
+<DT>
+<SAMP>ArcBridF</SAMP>
+<DD>
+The name of a default element type declared in a meta-DTD,
+to which elements in the document should be automatically mapped
+if they have an ID and would not otherwise be considered
+architectural.
+This would be <SAMP>HyBrid</SAMP> for HyTime.
+If your meta-DTD declares IDREF attributes, it will
+usually be appropriate to specify a value for
+<SAMP>ArcBridF</SAMP>, and to declare an ID attribute
+for that form in your meta-DTD.
+<DT>
+<SAMP>ArcDataF</SAMP>
+<DD>
+The name of a default notation declared in the meta-DTD,
+to which the external data entities in the document
+should be automatically mapped if they would
+not otherwise be considered architectural.
+If this attribute is defined,
+then general entities will be automatically architectural:
+any external data entity whose notation cannot otherwise be mapped
+into a notation in the meta-DTD will be automatically treated
+as an instance of the <SAMP>ArcDataF</SAMP> notation.
+This would be <SAMP>data</SAMP> for HyTime.
+If your meta-DTD declares entity attributes, it will usually
+be appropriate to specify a value for <SAMP>ArcDataF</SAMP>
+even if your meta-DTD declares no data attributes for the
+notation.
+<DT>
+<SAMP>ArcAuto</SAMP>
+<DD>
+This must have one of the following values:
+<DL>
+<DT>
+<SAMP>ArcAuto</SAMP>
+<DD>
+If an element does not have an <SAMP>ArcFormA</SAMP> attribute and the
+meta-DTD defines an element type with the same name as the element's
+type, the element will be automatically treated as being an instance
+of the meta-type.  This rule does not apply to the
+document element type; this is automatically treated as being an
+instance of the meta-DTD's document element type.
+Note that this automatic mapping is prevented if
+the element has an <SAMP>ArcFormA</SAMP> attribute with an implied
+value.  It is also prevented if processing of the
+<SAMP>ArcFormA</SAMP> attribute is suppressed.  This applies equally
+to the notations of external data entities.
+The default element or notation specified with the
+<SAMP>ArcBridF</SAMP> or <SAMP>ArcDfltN</SAMP> attribute
+is only considered after the mapping specified by <SAMP>ArcAuto</SAMP>.
+<DT>
+<SAMP>nArcAuto</SAMP>
+<DD>
+Automatic mapping is not performed.
+</DL>
+<P>
+The default value is <SAMP>ArcAuto</SAMP>.
+<DT>
+<SAMP>ArcOptSA</SAMP>
+<DD>
+A list of names of architectural support attributes,
+each of which is interpreted as a list of parameter entities
+to be defined with a replacement text of <SAMP>INCLUDE</SAMP>
+when parsing the meta-DTD.
+The default value is <SAMP>ArcOpt</SAMP>.
+</DL>
+<H2>Meta-DTDs</H2>
+<P>
+A meta-DTD is allowed to use the following extensions:
+<UL>
+<LI>
+a single element type or notation is allowed to be an associated
+element type or associated notation name for multiple attribute
+definition lists.
+<LI>
+<SAMP>#ALL</SAMP> can be used as an associated element type
+or associated notation name in an attribute definition list
+to define attributes for all element types or notations
+in the meta-DTD
+</UL>
+<P>
+Before any of these extensions can be used, the meta-DTD must include a
+declaration
+<PRE>
+&lt;!AFDR "ISO/IEC 10744:1997"&gt;
+</PRE>
+<P>
+This declaration should only be included if the extensions are used.
+<P>
+In all other respects a meta-DTD must be a valid SGML DTD.
+<P>
+A declared value of ENTITY for an attribute in a meta-DTD means that
+the value of the attribute must be an entity declared in
+the (non-meta) DTD that is architectural.
+An external data entity is architectural only if its notation can be
+mapped into a notation in the meta-DTD.
+All other kinds of data entities and subdoc entities are automatically
+architectural.
+<P>
+An IDREF attribute in the meta-document must have a corresponding ID
+in the meta-document.  An attribute with a declared value of ID in the
+document will be automatically mapped to an attribute with a declared
+value of ID in the meta-DTD.
+<P>
+A declared value of NOTATION in the meta-DTD means that the value of
+the attribute must have one the values specified in the name group and
+that it must be a notation in the meta-DTD.
+(Perhaps if the attribute also has a declared value of NOTATION
+in the non-meta-DTD, the value should be mapped in a similar
+way to the notation of an external data entity.)
+
+<H2>Differences from HyTime</H2>
+<P>
+There are a number of differences from how architectural processing is
+defined in the pre-Corringendum version of the HyTime standard.
+<UL>
+<LI>
+The <SAMP>ArcNamrA</SAMP> and <SAMP>ArcFormA</SAMP> attributes are not
+part of the meta-DTD.  Rather they are used by the architecture engine
+in deriving the meta-document that is validated against the meta-DTD.
+<LI>
+The <SAMP>use:</SAMP> conventional comment is not recognized.  Instead
+a single element type is allowed to be an associated element type for
+multiple attribute definition lists.
+<LI>
+The notation and data attributes of an external data entity are
+treated just like the element type and attributes of an element.  The
+notation of an external data entity is mapped into a notation in the
+meta-DTD and the data attributes of the entity are mapped onto
+attributes defined for the meta-DTD notation.
+<LI>
+<SAMP>#FIXED</SAMP> has the same meaning in a meta-DTD that it does in
+a regular DTD: the value of the attribute must be the same as the
+default value of the attribute specified in the meta-DTD.
+</UL>
+
+<H2>Specifying architectural processing with an LPD</H2>
+<P>
+Link attributes defined by an implicit link process are treated in the
+same way as non-link attributes.  The only complication is that SGML
+allows link attributes to have the same name as non-link attributes.
+If there is a link attribute and a non-link attribute with the same
+name, the architecture engine will only look at the link attribute,
+even if the value of the link attribute is implied.  The only
+exception is the <SAMP>ArcNamrA</SAMP> attribute: the architecture
+engine will use both the link attribute and the non-link attribute,
+but the substitute names in the value of the non-link attribute cannot
+refer to link attribute names.
+<P>
+The <SAMP>-A <VAR>archname</VAR></SAMP> option automatically activates
+any link type <SAMP><VAR>archname</VAR></SAMP>.
+<P>
+The architecture notation declaration and associated attribute
+definition list declaration are allowed in the LPD.  Although the
+productions of ISO 8879 do not allow a notation declaration in a link
+type declaration subset, it is clearly the intent of the standard that
+they be allowed.  You can use a <SAMP>-wlpd-notation</SAMP> option to
+disallow them.
+
+<H2>Derived architectures</H2>
+<P>
+A meta-DTD can have one or more base architectures in the same way as
+a normal DTD.  Multiple <SAMP>-A</SAMP> options can be used to exploit
+this.  For example,
+<PRE>
+-A <VAR>arch1</VAR> -A <VAR>arch2</VAR>
+</PRE>
+<P>
+will perform architectural processing on the source document to
+produce an architectural document conforming to the architecture
+<SAMP><VAR>arch1</VAR></SAMP> declared in the source document, and
+will then perform architectural processing on this architectural
+document to produce an architectural document conforming to the
+<SAMP><VAR>arch2</VAR></SAMP> architecture declared in
+<SAMP><VAR>arch1</VAR></SAMP>'s meta-DTD.
+<P>
+A document that is validated against a meta-DTD will automatically
+be validated against any base architectures of that meta-DTD.
+
+<H2><A NAME=hi2diff>Unimplemented features</A></H2>
+<P>
+The following features from the AFDR specification in HyTime 2nd
+edition are not yet implemented:
+<UL>
+<LI>
+use of <CODE>#MAPTOKEN</CODE> in the architectural attribute renamer.
+</UL>
+<P>
+<ADDRESS>
+James Clark<BR>
+jjc@jclark.com
+</ADDRESS>
+</BODY>
+</HTML>
diff --git a/doc/build.htm b/doc/build.htm
new file mode 100644 (file)
index 0000000..8708c1b
--- /dev/null
@@ -0,0 +1,121 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML Strict//EN">
+<HTML>
+<HEAD>
+<TITLE>Building SP</TITLE>
+</HEAD>
+<BODY>
+<H1>Building SP</H1>
+<P>
+You will need a C++ compiler with good template support to build this.
+Support for exceptions is not required.
+<P>
+In most cases you should be able to port to a new compiler just by
+editing <code>include/config.h</code>.
+
+<H2>Unix</H2>
+<P>
+To build on Unix, edit the Makefile, and do a make.  You can also
+build in a different directory.  This requires GNU make or another
+make that implements VPATH.  Copy or link the top-level Makefile to
+the build directory, change srcdir in the Makefile to point to the
+original directory, and do a make in the build directory.
+<P>
+<SAMP>make install</SAMP> installs the programs.
+<P>
+You can use the following compilers:
+<DL>
+<DT>
+gcc
+<DD>
+gcc 2.7.2 works (gcc 2.7.0 won't work at least on the sparc).  You
+will also an iostream library (eg as provided by libg++ 2.7).  This
+distribution builds on Solaris 2.3 and on Linux 1.2.  I expect it will
+build on SunOS 4 as well with little difficulty.
+<P>
+With gcc 2.6.3/SunOS 4, you'll need to compile with
+<CODE>-Dsig_atomic_t=int</CODE>, and, if you want to compile with
+-DSP_HAVE_SOCKET, you'll need to make netdb.h and arpa/inet.h C++
+compatible.
+<DT>
+Sun C++
+<DD>
+To compile with Sun C++ 4.0.1, run first sunfix.sh.  Also in the
+top-level Makefile, change set libMakefile to Makefile.lib.sun.
+This makes the library build use the -xar option.
+</DL>
+<P>
+Nelson Beebe has ported SP to a variety of other Unix systems and has
+produced some <A
+HREF="http://www.math.utah.edu/~beebe/sp-notes-1.0.1.html">notes</A>
+about his experiences.
+
+<H2>DOS/Windows</H2>
+<P>
+You must use a compiler that generates 32-bit code.
+
+<H3></H3>
+<P>
+The following compilers have been tested:
+<DL>
+<DT>
+Visual C++ 4.2
+<DD>
+Open SP.mak as a Makefile in the Developer Studio and build whatever
+you want.
+Don't use <SAMP>Batch Build</SAMP> or <SAMP>Rebuild All</SAMP>: these
+rebuild the library repeatedly.
+You can build all the targets in a particular configuration by
+building the all target.
+The <SAMP>sp-generate.mak</SAMP> makefile can be used to make
+all the .cxx and .h files that are automatically generated.
+(These are included in the distribution, so you don't need to do this
+unless you want to modify SP.)
+<P>
+To create a new program, make a new project in the SP project
+workspace using the <SAMP>Build&gt;Subprojects</SAMP> command, and
+include <SAMP>lib</SAMP> and maybe <SAMP>generic</SAMP> as
+subprojects. You may also want to add your project as a subproject to
+<SAMP>all</SAMP>.
+Then, in <SAMP>Build&gt;Settings</SAMP> under the <SAMP>C/C++</SAMP>
+tab in the <SAMP>Preprocessor</SAMP> category, copy the
+<SAMP>Preprocessor definitions</SAMP> and <SAMP>Additional include
+directories</SAMP> entries from the nsgmls subproject.
+In the <SAMP>Code Generation</SAMP> category make sure you've selected
+the same run-time library as that used by the corresponding configuration
+of <SAMP>lib</SAMP>.
+<DT>
+Visual C++ 5.0
+<DD>
+Use SP.mak as with Visual C++ 4.2.  Visual C++ 5.0 has a bug which
+will cause it to crash when converting the makefile. To work around
+this, rename the lib directory to x, say, before converting the
+makefile and then, after conversion but before building, rename it
+back to lib. Then proceed as with Visual C++ 4.2.
+<P>
+You should be aware that Visual C++ 5.0 also has some optimization
+bugs.  There are workarounds for those I've discovered, but it would
+be safer to use Visual C++ 4.2.
+<DT>
+Visual C++ 6.0
+<DD>
+Use jade.dsw. Build debug with all.dsp, release with jadedist.dsp.
+<P>
+The style library needs cleaning between builds, but rebuild all takes care of this.
+<P>
+OpenJade 1.3.1 has only been built with VC++ 6.0 SP3.
+<P>
+Remember you need perl installed on your system - www.activestate.com.
+<DT>
+Watcom C++ 11.0
+<DD>
+Use Makefile.wat.
+<P>
+You must compile on a platform that supports long filenames.
+</DL>
+<P>
+<ADDRESS>
+James Clark<BR>
+jjc@jclark.com
+</ADDRESS>
+</BODY>
+</HTML>
diff --git a/doc/catalog b/doc/catalog
new file mode 100644 (file)
index 0000000..1d53793
--- /dev/null
@@ -0,0 +1 @@
+CATALOG ../pubtext/html.soc
diff --git a/doc/catalog.htm b/doc/catalog.htm
new file mode 100644 (file)
index 0000000..cc62529
--- /dev/null
@@ -0,0 +1,170 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML Strict//EN">
+<HTML>
+<HEAD>
+<TITLE>SP - Catalogs</TITLE>
+</HEAD>
+<BODY>
+<H1>Catalogs</H1>
+<P>
+The entity manager generates a system identifier for every external
+entity using catalog entry files in the format defined by <A
+HREF="http://www.oasis-open.org/a401.htm">SGML Open
+Technical Resolution TR9401:1997</A>.  The entity manager will give an
+error if it is unable to generate a system identifier for an external
+entity.  Normally if the external identifier for an entity includes a
+system identifier then the entity manager will use that as the
+effective system identifier for the entity; this behaviour can be
+changed using <CODE>OVERRIDE</CODE> or <CODE>SYSTEM</CODE> entries in
+a catalog entry file.
+<P>
+A catalog entry file contains a sequence of entries in one of the
+following forms:
+<DL>
+<DT>
+<SAMP>PUBLIC <VAR>pubid</VAR> <VAR>sysid</VAR></SAMP>
+<DD>
+This specifies that <SAMP><VAR>sysid</VAR></SAMP> should be used as
+the effective system identifier if the public identifier is
+<SAMP><VAR>pubid</VAR></SAMP>.  <SAMP><VAR>Sysid</VAR></SAMP> is a
+system identifier as defined in ISO 8879 and
+<SAMP><VAR>pubid</VAR></SAMP> is a public identifier as defined in ISO
+8879.
+<DT>
+<SAMP>ENTITY <VAR>name</VAR> <VAR>sysid</VAR></SAMP>
+<DD>
+This specifies that <VAR>sysid</VAR> should be used as the effective
+system identifier if the entity is a general entity whose name is
+<VAR>name</VAR>.
+<DT>
+<SAMP>ENTITY %<VAR>name</VAR> <VAR>sysid</VAR></SAMP>
+<DD>
+This specifies that <SAMP><VAR>sysid</VAR></SAMP> should be used as
+the effective system identifier if the entity is a parameter entity
+whose name is <VAR>name</VAR>.  Note that there is no space between
+the <SAMP>%</SAMP> and the <SAMP><VAR>name</VAR></SAMP>.
+<DT>
+<SAMP>DOCTYPE  <VAR>name</VAR> <VAR>sysid</VAR></SAMP>
+<DD>
+This specifies that <SAMP><VAR>sysid</VAR></SAMP> should be used as
+the effective system identifier if the entity is an entity declared in
+a document type declaration whose document type name is <VAR>name</VAR>.
+<DT>
+<SAMP>LINKTYPE <VAR>name</VAR> <VAR>sysid</VAR></SAMP>
+<DD>
+This specifies that <SAMP><VAR>sysid</VAR></SAMP> should be used as the
+effective system identifier if the entity is an entity declared in a
+link type declaration whose link type name is <VAR>name</VAR>.
+<DT>
+<SAMP>NOTATION <VAR>name</VAR> <VAR>sysid</VAR></SAMP>
+<DD>
+This specifies that <SAMP><VAR>sysid</VAR></SAMP> should be used as
+the effective system identifier for a notation whose name is
+<SAMP><VAR>name</VAR></SAMP>.
+This is relevant only with the <SAMP>-n</SAMP> option.
+<DT>
+<SAMP>OVERRIDE <VAR>bool</VAR></SAMP>
+<DD>
+<SAMP><VAR>bool</VAR></SAMP> may be <SAMP>YES</SAMP> or
+<SAMP>NO</SAMP>.  This sets the overriding mode for entries up to the
+next occurrence of OVERRIDE or the end of the catalog entry file.  At
+the beginning of a catalog entry file the overriding mode will be NO.
+A PUBLIC, ENTITY, DOCTYPE, LINKTYPE or NOTATION entry with an
+overriding mode of YES will be used whether or not the external
+identifier has an explicit system identifier; those with an overriding
+mode of NO will be ignored if external identifier has an explicit
+system identifier.
+<DT>
+<SAMP>SYSTEM <VAR>sysid1</VAR> <VAR>sysid2</VAR></SAMP>
+<DD>
+This specifies that <VAR>sysid2</VAR> should be used as the effective
+system identifier if the system identifier specified in the external
+identifier was <SAMP><VAR>sysid1</VAR></SAMP>.
+<VAR>sysid2</VAR> should always be quoted to
+ensure that it is not misinterpreted when parsed by a system that does
+not support this extension.
+<DT>
+<A NAME="sgmldecl"><SAMP>SGMLDECL <VAR>sysid</VAR></SAMP></A>
+<DD>
+This specifies that if the document does not contain an SGML declaration,
+the SGML declaration in <SAMP><VAR>sysid</VAR></SAMP> should be implied.
+<DT>
+<SAMP>DOCUMENT <VAR>sysid</VAR></SAMP>
+<DD>
+This specifies that the document entity is <SAMP><VAR>sysid</VAR></SAMP>.
+This entry is used only with the <SAMP>-C</SAMP> option.
+<DT>
+<SAMP>CATALOG <VAR>sysid</VAR></SAMP>
+<DD>
+This specifies that <SAMP><VAR>sysid</VAR></SAMP> is the system
+identifier of an additional catalog entry file to be read after this
+one.  Multiple <SAMP>CATALOG</SAMP> entries are allowed and will be
+read in order.
+<DT>
+<SAMP>BASE <VAR>sysid</VAR></SAMP>
+<DD>
+This specifies that relative storage object identifiers in system
+identifiers in the catalog entry file following this entry should be
+resolved using first storage object identifier in
+<SAMP><VAR>sysid</VAR></SAMP> as the base, instead of the storage
+object identifiers of the storage objects comprising the catalog entry
+file.
+Note that the <CODE><VAR>sysid</VAR></CODE> must exist.
+<DT>
+<SAMP>DELEGATE <VAR>pubid-prefix</VAR> <VAR>sysid</VAR></SAMP>
+<DD>
+This specifies that entities with a public identifier that has
+<SAMP><VAR>pubid-prefix</VAR></SAMP> as a prefix should be resolved
+using a catalog whose system identfier is
+<SAMP><VAR>sysid</VAR></SAMP>.  For more details, see <A
+HREF="http://www.entmp.org/fpi-urn/delegate.html">A Proposal for
+Delegating SGML Open Catalogs</A>.
+</DL>
+<P>
+The delimiters can be omitted from the <SAMP><VAR>sysid</VAR></SAMP>
+provided it does not contain any white space.  Comments are allowed
+between parameters delimited by <SAMP>--</SAMP> as in SGML.
+<P>
+The entity manager will look for catalog entry files as follows:
+<OL>
+<LI>
+a file called <SAMP>catalog</SAMP> in the same directory as the
+document entity, unless the environment variable
+<SAMP>SP_USE_DOCUMENT_CATALOG</SAMP> has the value <SAMP>NO</SAMP> or
+<SAMP>0</SAMP>;
+<LI>
+any catalog entry files specified using the <SAMP>-c</SAMP> option;
+<LI>
+a list of files specified by the environment variable
+<SAMP>SGML_CATALOG_FILES</SAMP>; the list is separated by colons under
+Unix and by semi-colons under MS-DOS and Windows; if this environment
+variable is not set, then a system dependent list of catalog entry
+files will be used.
+</OL>
+<P>
+In fact catalog entry files are not restricted to being files: the
+name of a catalog entry file is interpreted as a system identifier.
+<P>
+A match in one catalog entry file will take precedence over any match
+in a later catalog entry file.  A more specific matching entry in one
+catalog entry file will take priority over a less specific matching
+entry in the same catalog entry file.  For this purpose, the order of
+specificity is (most specific first):
+<UL>
+<LI>
+<SAMP>SYSTEM</SAMP> entries;
+<LI>
+<SAMP>PUBLIC</SAMP> entries;
+<LI>
+<SAMP>DELEGATE</SAMP> entries ordered by the length of the prefix,
+longest first;
+<LI>
+<SAMP>ENTITY</SAMP>, <SAMP>DOCTYPE</SAMP>, <SAMP>LINKTYPE</SAMP> and
+<SAMP>NOTATION</SAMP> entries.
+</UL>
+<P>
+<ADDRESS>
+James Clark<BR>
+jjc@jclark.com
+</ADDRESS>
+</BODY>
+</HTML>
diff --git a/doc/charset.htm b/doc/charset.htm
new file mode 100644 (file)
index 0000000..0f47442
--- /dev/null
@@ -0,0 +1,273 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML Strict//EN">
+<HTML>
+<HEAD>
+<TITLE>SP - Character sets</TITLE>
+</HEAD>
+<BODY>
+<H1>Handling of character sets in SP</H1>
+<P>
+The following description applies only to the multi-byte version of
+SP.  In the single-byte version of SP, each character is represented
+both internally and in storage objects by a single byte equal to the
+number of the character in the document character set.
+<P>
+SP's entity manager converts the bytes comprising a storage object
+into a sequence of characters.
+This conversion is determined by the encoding associated with
+the storage object.
+<P>
+An encoding may be specified using the name of a mapping from
+sequences of characters to sequences of bytes.
+<P>
+An encoding can also be specified relative to the document character
+set.  This kind of an encoding maps a sequence of characters in the
+repertoire of the document character set into a sequence of bytes by
+<OL>
+<LI>
+mapping each character to its bit
+combination in the document character set, and then
+<LI>
+applying a transformation that maps sequences of bit combinations
+to sequences of bytes.
+</OL>
+<P>
+The transformation applied in the second step is called a bit
+combination transformation format (BCTF).
+A document character set relative encoding is specified by giving
+the name of a BCTF.
+<P>
+An application receives characters from SP represented as non-negative
+integers.
+The mapping from characters to integers is determined by SP's internal
+character set.
+SP can operate in a mode in which the internal character set is the
+same as the document character set.
+(Versions of SP up to 1.1.1 always operated in this mode.)
+<A NAME="fixed">
+The multibyte version of SP can also operate in a mode in which the
+internal character set does not vary with the document character set,
+but is always a fixed character set, known as the system character set;
+this mode of operation is called fixed character set mode.</A>
+
+<H2>Environment</H2>
+<P>
+SP's character set handling is controlled by the following
+environment variables:
+<DL>
+<DT>
+SP_CHARSET_FIXED
+<DD>
+If this variable is 1 or YES, then SP will operate in fixed character set mode.
+<DT>
+SP_SYSTEM_CHARSET
+<DD>
+This identifies the system character set.  When in fixed character set
+mode, this character set is used as the internal character set.  When
+not in fixed character set mode this character set is used as the
+internal character set until the document character set has been read,
+at which point the document character set is used as the internal
+character set.
+<P>
+The only currently recognized value for this is <SAMP>JIS</SAMP>.
+This refers to a character set which combines JIS X 0201, JIS X 0208
+and JIS X 0212 by adding 0x8080 to the codes of characters in JIS X
+0208 and 0x8000 to the codes of characters in JIS X 0212.
+<P>
+The default system character set is Unicode 2.0.
+<DT>
+SP_ENCODING
+<DD>
+This specifies the default encoding when operating in fixed character set mode.
+The value must be the name of an available encoding.
+The default encoding cannot be document character set relative
+when operating in fixed character set mode.
+<DT>
+SP_BCTF
+<DD>
+This specifies the default encoding when not operating in fixed character set mode.
+The value must be the name of an available BCTF.
+When not operating in fixed character set mode, the default encoding is
+the document character set relative encoding with this BCTF.
+The default encoding is required to be document character set relative
+when not operating in fixed character set mode.
+</DL>
+<P>
+The default encoding is used for file input and output, and, except
+under Windows 95 and Windows NT, for all other interfaces with the
+operating system including filenames, environment varable names,
+environment variable values and command line arguments.
+<P>
+Under Windows 95 and Windows NT there are no restrictions on the
+default encoding.  Note that in order for non-ASCII characters to be
+correctly displayed on your console you must select a TrueType font,
+such as Lucida Console, as your console font.  (This seems to work
+only on Windows NT.)
+<P>
+Under other operating systems, the default encoding must be one in
+which ASCII characters are represented by a single byte.
+<P>
+Applications built with SP may require fixed character set mode and a
+particular system character set; such applications will ignore the
+SP_SYSTEM_CHARSET and SP_CHARSET_FIXED environment variables.
+
+<H2><A NAME="encodings">Available encodings</A></H2>
+<P>
+Encoding names are case insensitive.
+The following named encodings are available:
+<DL>
+<DT>
+<SAMP>utf-8</SAMP>
+<DD>
+Each character is represented by a variable number of bytes
+according to UCS Transformation Format 8 defined in Annex P to be
+added by the first proposed drafted amendment (PDAM 1) to ISO/IEC
+10646-1:1993.
+<DT>
+<SAMP>ucs-2</SAMP>
+<DT>
+<SAMP>iso-10646-ucs-2</SAMP>
+<DD>
+This is ISO/IEC 10646 with the UCS-2 transformation format.
+Each character is represented by 2 bytes.
+No special treatment is given to the byte order mark character.
+<DT>
+<SAMP>unicode</SAMP>
+<DD>
+Each character is represented by 2 bytes.  The bytes
+representing the entire storage object may be preceded by a pair of
+bytes representing the byte order mark character (0xFEFF).  The bytes
+representing each character are in the system byte order, unless
+the byte order mark character is present, in which case the order of
+its bytes determines the byte order.  When the storage object is read,
+any byte order mark character is discarded.
+<DT>
+<SAMP>euc-jp</SAMP>
+<DD>
+This is equivalent to
+the Extended_UNIX_Code_Packed_Format_for_Japanese Internet charset.
+Each character is encoded by a variable length sequence of octets.
+<DT>
+<SAMP>euc-kr</SAMP>
+<DD>
+This is ASCII and KSC 5601 encoded with the EUC encoding
+as defined by KS C 5861-1992.
+<DT>
+<SAMP>euc-cn</SAMP>
+<DT>
+<SAMP>cn-gb</SAMP>
+<DT>
+<SAMP>gb2312</SAMP>
+<DD>
+This is ASCII and GB 2312-80 encoded with the EUC encoding.
+It is equivalent to the CN-GB MIME charset defined in RFC 1922.
+<DT>
+<SAMP>sjis</SAMP>
+<DT>
+<SAMP>shift_jis</SAMP>
+<DD>
+This is equivalent to the Shift_JIS Internet charset.
+Each character is encoded by a variable length sequence of octets.
+This is Microsoft's standard encoding for Japanese.
+<DT>
+<SAMP>big5</SAMP>
+<DT>
+<SAMP>cn-big5</SAMP>
+<DD>
+This is equivalent to the CN-Big5 MIME charset defined in RFC 1922.
+<DT>
+<SAMP>is8859-<VAR>n</VAR></SAMP>
+<DT>
+<SAMP>iso-8859-<VAR>n</VAR></SAMP>
+<DD>
+<SAMP><VAR>n</VAR></SAMP> can be any single digit other than 0.  Each
+character in the repertoire of ISO 8859-<VAR>n</var> is represented
+by a single byte.
+<DT>
+<SAMP>xml</SAMP>
+<DD>
+On input, this uses XML's rules to determine the encoding.
+On output, this uses UTF-8.
+</DL>
+<P>
+The following additional encodings are supported under Windows 95
+and Windows NT:
+<DL>
+<DT>
+<SAMP>windows</SAMP>
+<DD>
+Specify this encoding when a storage object is encoded using your
+system's default Windows character set.
+This uses the so-called ANSI code page.
+<DT>
+<SAMP>wunicode</SAMP>
+<DD>
+This uses the <SAMP>unicode</SAMP> encoding if the storage object starts
+with a byte order mark and otherwise the <SAMP>windows</SAMP> encoding.
+If you are working with Unicode, this is probably the best value
+for <SAMP>SP_ENCODING</SAMP>.
+<DT>
+<SAMP>ms-dos</SAMP>
+<DD>
+Specify this encoding when a storage object (file) uses the OEM code page.
+The OEM code-page for a particular
+machine is the code-page used by FAT file-systems on that machine and
+is the default code-page for MS-DOS consoles.
+</DL>
+
+<H2><A NAME="bctfs">Available BCTFs</A></H2>
+<P>
+The following BCTFs are available:
+<DL>
+<DT>
+<SAMP>identity</SAMP>
+<DD>
+Each bit combination is represented by a single byte.
+<DT>
+<SAMP>fixed-2</SAMP>
+<DD>
+Each bit combination is represented by exactly 2 bytes,
+with the more significant byte first.
+<DT>
+<SAMP>euc</SAMP>
+<DD>
+Each bit combination is represented by a variable number of bytes
+depending on the values of the 0x80 and 0x8000 bits:
+<UL>
+<LI>
+if neither bits are set, then the bit combination is
+represented by a single byte equal to the bit combination;
+<LI>
+bit combinations with both bits set, are represented by the MSB of the
+bit combination followed by the LSB of the bit combination;
+<LI>
+bit combinations with just the 0x80 bit set are represented
+by 0x8E followed by a byte equal to the bit combination;
+<LI>
+bit combinations with just the 0x8000 bit set are represented
+by 0x8F followed by the MSB of the bit combination followed
+by the LSB of the bit combination.
+</UL>
+<DT>
+<SAMP>sjis</SAMP>
+<DD>
+A bit combination between 0 and 127 or between 161 and
+223 is encoded as a single byte with the same value as the bit combination.
+A bit combination with the 0x8000 and 0x80 bits set is encoded by the
+sequence of bytes with which the SJIS encoding encodes the character
+whose number in JIS X 0208 added to 0x8080 is equal to the bit
+combination.
+<DT>
+<SAMP>big5</SAMP>
+<DD>
+A bit combination less than 0x80 is encoded as a single byte.
+A bit combination with the 0x8000 bit set is encoded as two bytes,
+the MSB of the bit combination followed by the LSB of the bit
+combination.
+</DL>
+<P>
+<ADDRESS>
+James Clark<BR>
+jjc@jclark.com
+</ADDRESS>
+</BODY>
+</HTML>
diff --git a/doc/features.htm b/doc/features.htm
new file mode 100644 (file)
index 0000000..94cd7e1
--- /dev/null
@@ -0,0 +1,138 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML Strict//EN">
+<HTML>
+<HEAD>
+<TITLE>SP - Features Summary</TITLE>
+<BODY>
+<H1>
+SP
+</H1>
+<H3>
+A free, object-oriented toolkit for SGML parsing and entity management
+</H3>
+<H2>
+Features summary
+</H2>
+<UL>
+<LI>
+Includes nsgmls
+<UL>
+<LI>
+Compatible with sgmls
+<LI>
+Also generates RAST (ISO/IEC 13673)
+</UL>
+<LI>
+Provides access to all information about SGML document
+<UL>
+<LI>
+Access to DTD and SGML declaration as well as document instance
+<LI>
+Access to markup as well as abstract document
+<LI>
+Sufficient to recreate character-for-character identical
+copy of any SGML document
+</UL>
+<LI>
+Supports almost all optional SGML features
+<UL>
+<LI>
+Arbitrary concrete syntaxes
+<LI>
+SHORTTAG, OMITTAG, RANK
+<LI>
+SUBDOC
+<LI>
+LINK (SIMPLE, IMPLICIT and EXPLICIT)
+<LI>
+Only DATATAG and CONCUR not supported
+</UL>
+<LI>
+Sophisticated entity manager
+<UL>
+<LI>
+Supports ISO/IEC 10744 Formal System Identifiers
+<LI>
+Supports SGML Open catalogs
+<LI>
+Supports WWW
+<LI>
+Can be used independently of parser
+</UL>
+<LI>
+Supports multi-byte character sets
+<UL>
+<LI>
+Parser can use 16-bit characters internally
+<LI>
+16-bit characters can be used in tag names and other markup
+<LI>
+Supports ISO/IEC 10646 (Unicode) using both UCS-2 and UTF-8
+<LI>
+Supports Japanese character sets (Shift-JIS, EUC)
+</UL>
+<LI>
+Object-oriented
+<LI>
+Written in C++ from scratch
+<UL>
+<LI>
+Not a modified version of a parser originally written in C
+<LI>
+Reentrant
+<LI>
+Sophisticated architecture
+</UL>
+<LI>
+Fast
+<UL>
+<LI>
+Up to twice as fast as sgmls on large documents
+</UL>
+<LI>
+Portable
+<UL>
+<LI>
+All major Unix variants
+<LI>
+MS-DOS
+<LI>
+Win32: Windows 95/Windows NT
+<LI>
+OS/2
+</UL>
+<LI>
+Production quality
+<UL>
+<LI>
+Version 1.0 recently released, after a year of test releases
+<LI>
+Tested using several SGML test suites
+<LI>
+Already used in several new commercial products
+<LI>
+Written by James Clark, previously responsible for turning arcsgml into sgmls
+</UL>
+<LI>
+Free
+<UL>
+<LI>
+Includes source code
+<LI>
+No restrictions on commercial use
+</UL>
+<LI>
+Disadvantages
+<UL>
+<LI>
+Programmer-level documentation only for generic API
+and not for native API.
+</UL>
+</UL>
+
+<P>
+<ADDRESS>
+James Clark<BR>
+jjc@jclark.com
+</ADDRESS>
+</BODY>
+</HTML>
diff --git a/doc/generic.htm b/doc/generic.htm
new file mode 100644 (file)
index 0000000..4bd77f3
--- /dev/null
@@ -0,0 +1,1089 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML Strict//EN">
+<html>
+<head>
+<title>The generic API to SP</title>
+</head>
+<body>
+<h1>The generic API to SP</h1>
+<p>
+SP provides a generic API in addition to its native API.  The generic
+interface is much simpler than the native interface.  It is generic in
+the sense that it could be easily implemented using parsers other than
+SP.  It provides all ESIS information as well as some other
+information about the instance that is commonly needed by
+applications.  However, it doesn't provide access to all information
+available from SP; in particular, it doesn't provide information about
+the DTD.  It is also slightly less efficient than the native
+interface.
+<p>
+The interface uses two related abstract classes.  An
+<code>SGMLApplication</code> is an object that can handle a number of
+different kinds of event which correspond to information in an SGML
+document.  An <code>EventGenerator</code> is an object that can
+generate a sequence of events of the kinds handled by an
+<code>SGMLApplication</code>.  The
+<code>ParserEventGeneratorKit</code> class makes an
+<code>EventGenerator</code> that generates events using SP.
+
+<h2>Types</h2>
+<p>
+<code>SGMLApplication</code> has a number of local types that are used
+in several contexts:
+<dl>
+<dt>
+<code>Char</code>
+<dd>
+This typedef is an unsigned integral type that represents a single bit
+combination (character).  It is <code>unsigned short</code> if
+<code>SP_MULTI_BYTE</code> is defined and <code>unsigned char</code>
+otherwise.
+<dt>
+<code>CharString</code>
+<dd>
+This struct represents a string of <code>Char</code>.
+It has the following members:
+<dl>
+<dt>
+<code>const Char *ptr</code>
+<dd>
+A pointer to the <code>Char</code>s of the string.
+<dt>
+<code>size_t len</code>
+<dd>
+The number of <code>Char</code>s in the string.
+</dl>
+<dt>
+<code>Location</code>
+<dd>
+This struct holds information about a location in the entity structure
+of a document.  It is constucted using an <code>OpenEntityPtr</code>
+and a <code>Position</code>.  The <code>CharString</code>s in it will
+remain valid as long as the <code>OpenEntity</code> that is pointed to
+by the <code>OpenEntityPtr</code> that was used to construct it
+remains valid.
+<p>
+It has the following members:
+<dl>
+<dt>
+<code>unsigned long lineNumber</code>
+<dd>
+The line number.
+<code>(unsigned long)-1</code> if invalid.
+<dt>
+<code>unsigned long columnNumber</code>
+<dd>
+The column number.
+Note that tabs are not treated specially.
+<code>(unsigned long)-1</code> if invalid.
+<dt>
+<code>unsigned long byteOffset</code>
+<dd>
+The number of bytes in the storage object preceding the location.
+<code>(unsigned long)-1</code> if invalid.
+<dt>
+<code>unsigned long entityOffset</code>
+<dd>
+The number of bit combinations in the entity preceding the location.
+<code>(unsigned long)-1</code> if invalid.
+<dt>
+<code>CharString entityName</code>
+<dd>
+The name of the external entity containing the location.
+An empty string if invalid.
+<dt>
+<code>CharString filename</code>
+<dd>
+The name of the file containing the location.
+An empty string if invalid.
+<dt>
+<code>const void *other</code>
+<dd>
+Other implementation-dependent information about the location.  In the
+SP implementation it will be a pointer to a StorageObjectSpec.  0 if
+invalid.
+</dl>
+<p>
+When a location is in an internal entity, the location of the reference
+to the entity will be used instead.
+<dt>
+<code>OpenEntity</code>
+<dd>
+This class represents a currently open entity.  The only use for an
+<code>OpenEntity</code> is, in conjunction with a
+<code>Position</code>, to create a <code>Location</code>.  An
+<code>OpenEntity</code> is accessed using an
+<code>OpenEntityPtr</code>.
+<dt>
+<code>OpenEntityPtr</code>
+<dd>
+This class is a reference-counted pointer to an <code>OpenEntity</code>.
+<dt>
+<code>Position</code>
+<dd>
+This is an integral type that represents a position in an open entity.
+The meaning of a <code>Position</code> is completely determined by the
+<code>OpenEntity</code> object with which it is associated.  The only
+use for an <code>Position</code> is, in conjunction with an
+<code>OpenEntity</code>, to create a <code>Location</code>.
+<dt>
+<code>ExternalId</code>
+<dd>
+This struct represents an external identifier.  It has the following
+members:
+<dl>
+<dt>
+<code>bool haveSystemId</code>
+<dd>
+True iff the external identifier included an explicit system identifier.
+<dt>
+<code>CharString systemId</code>
+<dd>
+The system identifier included in the external identifier.
+Valid only if <code>havePublicId</code> is true.
+<dt>
+<code>bool havePublicId</code>
+<dd>
+True iff the external identifier included an explicit public identifier.
+<dt>
+<code>CharString publicId</code>
+<dd>
+The public identifier included in the external identifier.
+Valid only if <code>havePublicId</code> is true.
+<dt>
+<code>bool haveGeneratedSystemId</code>
+<dd>
+True iff a system identifier was generated for the external identifier.
+<dt>
+<dt>
+<code>CharString generatedSystemId</code>
+<dd>
+The system identifier generated for the external identifier.
+Valid only if <code>haveGeneratedSystemId</code> is true.
+</dl>
+<dt>
+<code>Notation</code>
+<dd>
+This struct represents a notation.
+It has the following members:
+<dl>
+<dt>
+<code>CharString name</code>
+<dd>
+The name of the notation.
+<dt>
+<code>ExternalId externalId</code>
+<dd>
+The external identifier of the notation.
+</dl>
+<dt>
+<code>Entity</code>
+<dd>
+This struct represents an entity.
+It has the following members.
+<dl>
+<dt>
+<code>CharString name</code>
+<dd>
+The name of the entity.
+<dt>
+<code>Entity::DataType dataType</code>
+<dd>
+The type of the data of the entity.
+<p>
+<code>Entity::DataType</code> is a local enum with the following possible
+values:
+<dl>
+<dt>
+<code>Entity::sgml</code>
+<dd>
+<dt>
+<code>Entity::cdata</code>
+<dd>
+<dt>
+<code>Entity::sdata</code>
+<dd>
+<dt>
+<code>Entity::ndata</code>
+<dd>
+<dt>
+<code>Entity::subdoc</code>
+<dd>
+<dt>
+<code>Entity::pi</code>
+<dd>
+</dl>
+<dt>
+<code>Entity::DeclType declType</code>
+<dd>
+The type of the declaration of the entity.
+<p>
+<code>Entity::DeclType</code> is a local enum with the following possible
+values:
+<dl>
+<dt>
+<code>Entity::general</code>
+<dd>
+The entity is a general entity.
+<dt>
+<code>Entity::parameter</code>
+<dd>
+The entity is a parameter entity.
+<dt>
+<code>Entity::doctype</code>
+<dd>
+The entity was declared in a doctype declaration.
+<dt>
+<code>Entity::linktype</code>
+<dd>
+The entity was declared in a linktype declaration.
+</dl>
+<dt>
+<code>bool isInternal</code>
+<dd>
+True iff the entity is internal rather than external.
+<dt>
+<code>CharString text</code>
+<dd>
+The replacement text of the entity.
+Valid only if <code>isInternal</code> is true.
+<dt>
+<code>ExternalId externalId</code>
+<dd>
+The external identifier of the entity.
+Valid only if <code>isInternal</code> is false.
+<dt>
+<code>const Attribute *attributes</code>
+<dd>
+Pointer to the data attributes of the entity.
+Valid only if <code>isInternal</code> is false.
+<dt>
+<code>size_t nAttributes</code>
+<dd>
+The number of data attributes of the entity.
+Valid only if <code>isInternal</code> is false.
+<dt>
+<code>Notation notation</code>
+<dd>
+The entity's notation.
+An empty string if the entity has no notation.
+Valid only if <code>isInternal</code> is false.
+</dl>
+<dt>
+<code>Attribute</code>
+<dd>
+This struct represents an attribute.  More precisely it represents the
+assignment of an attribute value to an attribute name.
+It has the following members:
+<dl>
+<dt>
+<code>CharString name</code>
+<dd>
+The attribute name.
+<dt>
+<code>Attribute::Type type</code>
+<dd>
+An enumeration describing the type of the attribute.
+<p>
+<code>Attribute::Type</code> is a local type with the following possible
+values:
+<dl>
+<dt><code>Attribute::invalid</code>
+<dd>
+The attribute is invalid.
+<dt><code>Attribute::implied</code>
+<dd>
+The attribute is an impliable attribute for which
+no value was specified.
+<dt><code>Attribute::cdata</code>
+<dd>
+The attribute is a CDATA attribute.
+<dt><code>Attribute::tokenized</code>
+<dd>
+The attribute is a tokenized attribute.
+</dl>
+<dt>
+<code>Attribute::Defaulted defaulted</code>
+<dd>
+An enumeration specifying whether the entity was defaulted, and, if
+so, how.
+This is non-ESIS information.
+<p>
+<code>Attribute::Defaulted</code> is a local enum with the following
+possible values:
+<dl>
+<dt>
+<code>Attribute::specified</code>
+<dd>
+The value was explicitly specified.
+<dt>
+<code>Attribute::definition</code>
+<dd>
+The value was defaulted from the attribute definition.
+<dt>
+<code>Attribute::current</code>
+<dd>
+The value was defaulted using the CURRENT value of the attribute.
+</dl>
+<dt>
+<code>size_t nCdataChunks</code>
+<dd>
+The number of <code>Attribute::CdataChunk</code>s comprising the value
+of the attribute.  Valid only if <code>type</code> is
+<code>cdata</code>.
+<dt>
+<code>const Attribute::CdataChunk *cdataChunks</code>
+<dd>
+The <code>Attribute::CdataChunk</code>s comprising the value of this attribute.
+Valid only if <code>type</code> is <code>cdata</code>.
+<p>
+<code>Attribute::CdataChunk</code> is a local struct with the
+following members:
+<dl>
+<dt>
+<code>bool isSdata</code>
+<dd>
+True iff this chunk is the replacement text of an internal SDATA entity.
+<dt>
+<code>CharString data</code>
+<dd>
+The data of this chunk.
+<dt>
+<code>CharString entityName</code>
+<dd>
+The name of the internal SDATA entity that this chunk is the
+replacement text of.  Valid only if <code>isSdata</code> is true.
+This is non-ESIS information.
+</dl>
+<dt>
+<code>CharString tokens</code>
+<dd>
+Valid only if <code>type</code> is <code>Attribute::tokenized</code>.
+<dt>
+<code>bool isId</code>
+<dd>
+True iff the declared value is ID.
+This is non-ESIS information.
+<dt>
+<code>size_t nEntities</code>
+<dd>
+The number of entities associated with this attribute.
+This will be zero unless the declared value is ENTITY or ENTITIES.
+<dt>
+<code>const Entity *entities</code>
+<dd>
+The entities associated with this attribute.
+<dt>
+<code>Notation notation</code>
+<dd>
+The notation associated with this attribute.
+If the declared value of the attribute is not NOTATION,
+then the name member will be an empty string.
+</dl>
+</dl>
+<h2>Events</h2>
+<p>
+For each event <code><var>xyz</var>Event</code> handled by
+<code>SGMLApplication</code>, there is a virtual function of
+<code>SGMLApplication</code> named <code><var>xyz</var></code> to
+handle the event, and a local struct of <code>SGMLApplication</code>
+named <code><var>Xyz</var>Event</code>.
+<p>
+Pointers within an event <code><var>xyz</var>Event</code> are valid
+only during the call to <code><var>xyz</var></code>.  None of the
+structs in events have copy constructors or assignment operators
+defined.  It is up to the event handling function to make a copy of
+any data that it needs to preserve after the function returns.
+<p>
+Except as otherwise stated,
+the information in events is ESIS information.
+All position information is non-ESIS information.
+<p>
+There are the following types of event:
+<dl>
+<dt>
+<code>AppinfoEvent</code>
+<dd>
+Generated for the APPINFO section of the SGML declaration.
+The event has the following members:
+<dl>
+<dt><code>Position pos</code>
+<dd>
+The position of APPINFO parameter of the SGML declaration.
+<dt><code>bool none</code>
+<dd>
+True iff APPINFO NONE was specified.
+<dt><code>CharString string</code>
+<dd>
+The interpreted value of the minimum literal specified
+in the appinfo parameter of the SGML declaration.
+Valid only if <code>none</code> is false.
+</dl>
+<dt>
+<code>PiEvent</code>
+<dd>
+Generated for a processing instruction.
+The event has the following members:
+<dl>
+<dt>
+<code>Position pos</code>
+<dd>
+The position of the processing instruction.
+<dt>
+<code>CharString data</code>
+<dd>
+The system data of the processing instuction.
+<dt>
+<code>CharString entityName</code>
+<dd>
+If the processing instruction was the result of the
+reference to a PI entity, the name of the entity.
+If not, an empty string.
+This is non-ESIS information.
+</dl>
+<dt>
+<code>StartElementEvent</code>
+<dd>
+Generated for the start of an element.
+The event has the following members:
+<dl>
+<dt>
+<code>Position pos</code>
+<dd>
+The position of the start of the element.
+<dt>
+<code>CharString gi</code>
+<dd>
+The generic identifier of the element.
+<dt>
+<code>Element::ContentType contentType</code>
+<dd>
+The type of the element's content.
+This is non-ESIS information.
+<p>
+<code>Element::ContentType</code> is an enum with the following
+possible values:
+<dl>
+<dt>
+<code>Element::empty</code>
+<dd>
+The element has empty content, either because it was
+declared as EMPTY or because there was a #CONREF attribute.
+<dt>
+<code>Element::cdata</code>
+<dd>
+The element has CDATA content.
+<dt>
+<code>Element::rcdata</code>
+<dd>
+The element has RCDATA content.
+<dt>
+<code>Element::mixed</code>
+<dd>
+The element has mixed content.
+<dt>
+<code>Element::element</code>
+<dd>
+The element has element content.
+</dl>
+<dt>
+<code>bool included</code>
+<dd>
+True iff the element was an included subelement
+(rather than a proper subelement).
+This is non-ESIS information.
+<dt>
+<code>size_t nAttributes</code>
+<dd>
+The number of attributes of this element.
+<dt>
+<code>const Attribute *attributes</code>
+<dd>
+A pointer to the attributes for this element.
+</dl>
+<dt>
+<code>EndElementEvent</code>
+<dd>
+Generated for the end of an elemenet.
+The event has the following members:
+<dl>
+<dt>
+<code>Position pos</code>
+<dd>
+The position of the end of the element.
+<dt>
+<code>CharString gi</code>
+<dd>
+The generic identifier of the element.
+</dl>
+<dt>
+<code>DataEvent</code>
+<dd>
+Generated for character data.
+Separate data events may be generated for consecutive data characters.
+Applications should make no assumptions about how character data is split
+into <code>DataEvent</code>s.
+The event has the following members:
+<dl>
+<dt>
+<code>Position pos</code>
+<dd>
+The position of the first character of the data.
+<dt>
+<code>CharString data</code>
+<dd>
+The data.
+</dl>
+<dt>
+<code>SdataEvent</code>
+<dd>
+Generated for a reference to an internal sdata entity in content.
+The event has the following members:
+<dl>
+<dt>
+<code>Position pos</code>
+<dd>
+The position of the entity reference.
+<dt>
+<code>CharString text</code>
+<dd>
+The replacement text of the entity.
+<dt>
+<code>CharString entityName</code>
+<dd>
+The entity name.
+This is non-ESIS information.
+</dl>
+<dt>
+<code>ExternalDataEntityRefEvent</code>
+<dd>
+Generated for a reference to an external data entity.
+The event has the following members:
+<dl>
+<dt>
+<code>Position pos</code>
+<dd>
+The position of the entity reference.
+<dt>
+<code>Entity entity</code>
+<dd>
+The referenced entity.
+</dl>
+<dt>
+<code>SubdocEntityRefEvent</code>
+<dd>
+Generated for a reference to a subdoc entity.
+The event has the following members:
+<dl>
+<dt>
+<code>Position pos</code>
+<dd>
+The position of the entity reference.
+<dt>
+<code>Entity entity</code>
+<dd>
+The referenced entity.
+</dl>
+<dt>
+<code>StartDtdEvent</code>
+<dd>
+Generated at the start of a document type declaration.
+This is non-ESIS information.
+The event has the following members:
+<dl>
+<dt>
+<code>Position pos</code>
+<dd>
+The position of the start of the document type declaration.
+<dt>
+<code>CharString name</code>
+<dd>
+The document type name.
+<dt>
+<code>bool haveExternalId</code>
+<dd>
+The external identifier for the entity declared in the document type
+declaration.
+<dt>
+<code>ExternalId externalId</code>
+<dd>
+Valid iff haveExternalId is true.
+</dl>
+<dt>
+<code>EndDtdEvent</code>
+<dd>
+Generated at the end of a document type declaration.
+This is non-ESIS information.
+The event has the following members:
+<dl>
+<dt>
+<code>Position pos</code>
+<dd>
+The position of the end of the DTD.
+<dt>
+<code>CharString name</code>
+<dd>
+</dl>
+<dt>
+<code>EndPrologEvent</code>
+<dd>
+Generated at the end of the prolog.
+The event has the following members:
+<dl>
+<dt>
+<code>Position pos</code>
+<dd>
+The position of the start of the instance.
+</dl>
+<dt>
+<code>GeneralEntityEvent</code>
+<dd>
+Generated for each general entity in the name space of the governing
+doctype, but only if the
+<code>ParserEventGeneratorKit::outputGeneralEntities</code> option is
+enabled.  This is non-ESIS information.  The event has the following
+members:
+<dl>
+<dt>
+<code>Entity entity</code>
+<dd>
+The entity.
+</dl>
+<p>
+No event will be generated for the declaration of the
+<code>#default</code> entity; instead an event will be generated when
+an entity reference uses the <code>#default</code> entity if that is
+the first time on which an entity with that name is used.  This means
+that <code>GeneralEntityEvent</code> can occur after the end of the
+prolog.
+<dt>
+<code>CommentDeclEvent</code>
+<dd>
+Generated for each comment declaration in the instance, but only if
+<code>ParserEventGeneratorKit::outputCommentDecls</code> option is
+enabled.  This is non-ESIS information.  The event has the following
+members:
+<dl>
+<dt>
+<code>Position pos</code>
+<dd>
+The position of the start of the comment declaration.
+<dt>
+<code>size_t nComments</code>
+<dd>
+The number of comments in the comment declaration.
+<dt>
+<code>const CharString *comments</code>
+<dd>
+The content of each comment in the declaration.
+This excludes the com delimiters.
+<dt>
+<code>const CharString *seps</code>
+<dd>
+The separator following each comment in the declaration.
+</dl>
+<dt>
+<code>MarkedSectionStartEvent</code>
+<dd>
+Generated for the start of a marked section in the instance,
+but only if the <code>ParserEventGeneratorKit::outputMarkedSections</code>
+option is enabled.
+This is non-ESIS information.
+The event has the following members:
+<dl>
+<dt>
+<code>Position pos</code>
+<dd>
+The position of the start of the marked section declaration.
+<dt>
+<code>MarkedSectionStartEvent::Status status</code>
+<dd>
+The effective status of the marked section.
+<p>
+<code>MarkedSectionStartEvent::Status</code> is a local enum with the
+following possible values:
+<ul>
+<li><code>MarkedSectionStartEvent::include</code>
+<li><code>MarkedSectionStartEvent::rcdata</code>
+<li><code>MarkedSectionStartEvent::cdata</code>
+<li><code>MarkedSectionStartEvent::ignore</code>
+</ul>
+<dt>
+<code>size_t nParams</code>
+<dd>
+The number of top-level parameters in the status keyword specification.
+<dt>
+<code>const MarkedSectionStartEvent::Param *params</code>
+<dd>
+The top-level parameters in the status keyword specification.
+<p>
+<code>Param</code> is a local struct with the following members:
+<dl>
+<dt>
+<code>MarkedSectionStartEvent::Param::Type type</code>
+<dd>
+The type of top-level parameter:
+<p>
+<code>MarkedSectionStartEvent::Param::Type</code> is a local enum with the
+following possible values:
+<dl>
+<dt>
+<code>MarkedSectionStartEvent::Param::temp</code>
+<dt>
+<code>MarkedSectionStartEvent::Param::include</code>
+<dt>
+<code>MarkedSectionStartEvent::Param::rcdata</code>
+<dt>
+<code>MarkedSectionStartEvent::Param::cdata</code>
+<dt>
+<code>MarkedSectionStartEvent::Param::ignore</code>
+<dd>
+The parameter is the corresponding keyword.
+<dt>
+<code>MarkedSectionStartEvent::Param::entityRef</code>
+<dd>
+The parameter is an entity reference.
+</dl>
+<dt>
+<code>CharString entityName</code>
+<dd>
+Valid when <code>type</code> is
+<code>MarkedSectionStartEvent::Param::entityRef</code>.
+</dl>
+</dl>
+<dt>
+<code>MarkedSectionEndEvent</code>
+<dd>
+Generated for the end of a marked section in the instance, but only if
+the <code>ParserEventGeneratorKit::outputMarkedSections</code> option is
+enabled.  This is non-ESIS information.  The event has the following
+members:
+<dl>
+<dt>
+<code>Position pos</code>
+<dd>
+The position of the end of the marked section declaration.
+<dt>
+<code>MarkedSectionEndEvent::Status status</code>
+<dd>
+The effective status of the marked section.
+<p>
+<code>MarkedSectionEndEvent::Status</code> is a local enum with the
+following possible values:
+<ul>
+<li><code>MarkedSectionEndEvent::include</code>
+<li><code>MarkedSectionEndEvent::rcdata</code>
+<li><code>MarkedSectionEndEvent::cdata</code>
+<li><code>MarkedSectionEndEvent::ignore</code>
+</ul>
+</dl>
+<dt>
+<code>IgnoredCharsEvent</code>
+<dd>
+Generated for a sequence of characters in an ignored marked section in
+the instance, but only if the
+<code>ParserEventGeneratorKit::outputMarkedSections</code> option is
+enabled.  This is non-ESIS information.  The event has the following
+members:
+<dl>
+<dt>
+<code>Position pos</code>
+<dd>
+The position of the first of the ignored characters.
+<dt>
+<code>CharString data</code>
+<dd>
+The ignored characters.
+</dl>
+<dt>
+<code>ErrorEvent</code>
+<dd>
+Generated for each error detected by the parser,
+and also for any other cases where the parser produces a message.
+This is non-ESIS information.
+It has the following members:
+<dl>
+<dt>
+<code>Position pos</code>
+<dd>
+The position at which the error was detected.
+<dt>
+<code>ErrorEvent::Type type</code>
+<dd>
+The type of error.
+<p>
+<code>ErrorEvent::Type</code> is a local enum with the following possible
+values:
+<dl>
+<dt>
+<code>ErrorEvent::quantity</code>
+<dd>
+Exceeding a quantity limit.
+<dt>
+<code>ErrorEvent::idref</code>
+<dd>
+An IDREF to a non-existent ID.
+<dt>
+<code>ErrorEvent::capacity</code>
+<dd>
+Exceeding a capacity limit.
+<dt>
+<code>ErrorEvent::otherError</code>
+<dd>
+Any other kind of error.
+<dt>
+<code>ErrorEvent::warning</code>
+<dd>
+A warning.  Not actually an error.
+<dt>
+<code>ErrorEvent::info</code>
+<dd>
+An informational message.  Not actually an error.
+</dl>
+<dt>
+<code>CharString message</code>
+<dd>
+The message produced by the parser.
+If messages are not disabled, this will be the same as the message
+printed to standard error.
+</dl>
+</dl>
+<p>
+<code>SGMLApplication</code> also has a virtual function
+<pre>
+void openEntityChange(const OpenEntityPtr &);
+</pre>
+<p>
+which is similar to an event.  An application that wishes to makes use
+of position information must maintain a variable of type
+<code>OpenEntityPtr</code> representing the current open entity, and
+must provide an implementation of the <code>openEntityChange</code>
+function that updates this variable.  It can then use the value of
+this variable in conjunction with a <code>Position</code> to obtain a
+<code>Location</code>; this can be relatively slow.  Unlike events, an
+<code>OpenEntityPtr</code> has copy constructors and assignment
+operators defined.
+
+<h2>EventGenerator</h2>
+<p>
+The <code>EventGenerator</code> interface provides the following
+functions:
+<dl>
+<dt>
+<code>unsigned run(SGMLApplication &<var>app</var>)</code>
+<dd>
+Generate the sequence of events, calling the corresponding member of
+<code><var>app</var></code> for each event.  Returns the number of
+errors.  This must not be called more than once for any
+<code>EventGenerator</code>object.
+<dt>
+<code>
+EventGenerator *makeSubdocEventGenerator(const SGMLApplication::Char *<var>s</var>, size_t <var>n</var>)
+</code>
+<dd>
+Makes a new <code>EventGenerator</code> for a subdocument of the
+current document.  <var>s</var> and <var>n</var> together specify the
+system identifier of the subdocument entity.  These should usually be
+obtained from the <code>generatedSystemId</code> member of the
+<code>externalId</code> member of the <code>Entity</code> object for
+the subdocument entity.  This function can only be called after
+<code>run</code> has been called; the call to <code>run</code> need
+not have returned, but the <code>SGMLApplication
+</code>
+must have been passed events from the prolog or instance (ie the SGML
+declaration must have been parsed).
+<dt>
+<code>void inhibitMessages(bool <var>b</var>)</code>
+<dd>
+If <var>b</var> is true, disables error and warning messages,
+otherwise enables them.  Initially errors and warnings are enabled.
+This function may be called at any time, including while
+<code>run()</code> is executing.
+<dt>
+<code>void halt()</code>
+<dd>
+Halt the generation of events by <code>run()</code>.
+This can be at any point during the execution of <code>run()</code>.
+It is safe to call this function from a different thread from that which
+called <code>run()</code>.
+</dl>
+<h2>ParserEventGeneratorKit</h2>
+<p>
+The <code>ParserEventGeneratorKit</code> class is used to create an
+<code>EventGenerator</code> that  generate events using SP.  It
+provides the following members:
+<dl>
+<dt>
+<code>EventGenerator *makeEventGenerator(int <var>nFiles</var>, char *const *<var>files</var>)</code>
+<dd>
+This returns a new <code>EventGenerator</code> that will generate events
+for the SGML document whose document entity is contained in the
+<code><var>files</var></code>.
+The returned <code>EventGenerator</code> should be deleted when it
+is no longer needed.
+<code>makeEventGenerator</code> may be called more than once.
+<dt>
+<code>void setOption(ParserEventGeneratorKit::Option <var>opt</var>)</code>
+<dd>
+This can be called any time before <code>makeEventGenerator()</code> is called.
+<p>
+<code>ParserEventGeneratorKit::Option</code> is a local enum with the following possible
+values:
+<dl>
+<dt>
+<code>ParserEventGeneratorKit::showOpenEntities</code>
+<dd>
+This corresponds to the <code>-e</code> option of nsgmls.
+<dt>
+<code>ParserEventGeneratorKit::showOpenElements</code>
+<dd>
+This corresponds to the <code>-g</code> option of nsgmls.
+<dt>
+<code>ParserEventGeneratorKit::outputCommentDecls</code>
+<dd>
+This will cause <code>CommentDeclEvent</code>s to be generated.
+<dt>
+<code>ParserEventGeneratorKit::outputMarkedSections</code>
+<dd>
+This will cause
+<code>MarkedSectionStartEvent</code>s,
+<code>MarkedSectionStartEvent</code>s
+and <code>IgnoredCharsEvent</code>s
+to be generated.
+<dt>
+<code>ParserEventGeneratorKit::outputGeneralEntities</code>
+<dd>
+This will cause <code>GeneralEntityEvent</code>s to be generated.
+</dl>
+<dt>
+<code>
+void setOption(ParserEventGeneratorKit::OptionWithArg <var>opt</var>, const char *<var>arg</var>)
+</code>
+<dd>
+This can be called any time before <code>makeEventGenerator()</code> is called.
+<p>
+<code>ParserEventGeneratorKit::OptionWithArg</code> is a local enum with the following possible
+values:
+<dl>
+<dt>
+<code>ParserEventGeneratorKit::addCatalog</code>
+<dd>
+This corresponds to the <code>-m</code> option of nsgmls.
+<dt>
+<code>ParserEventGeneratorKit::includeParam</code>
+<dd>
+This corresponds to the <code>-i</code> option of nsgmls.
+<dt>
+<code>ParserEventGeneratorKit::enableWarning</code>
+<dd>
+This corresponds to the <code>-w</code> option of nsgmls.
+<dt>
+<code>ParserEventGeneratorKit::addSearchDir</code>
+<dd>
+This corresponds to the <code>-D</code> option of nsgmls.
+</dl>
+</dl>
+
+<h2>Using the interface</h2>
+<p>
+Creating an application with this interface involves the following steps:
+<ul>
+<li>
+Derive a class from <code>SGMLApplication</code>,
+called, say, <code>MyApplication</code>.
+<li>
+For each kind of event <code><var>Foo</var>Event</code> that the application
+needs information from, define a member of <code>MyApplication</code>
+<code>void MyApplication::<var>foo</var>(const <var>Foo</var>Event &)</code>.
+<li>
+Declare an object of type <code>ParserEventGeneratorKit</code>.
+<li>
+Optionally set options for the <code>ParserEventGeneratorKit</code> using
+<code>ParserEventGeneratorKit::setOption</code>.
+<li>
+Create an <code>EventGenerator</code> using
+<code>ParserEventGeneratorKit::makeEventGenerator</code>.
+<li>
+Create an instance of <code>MyApplication</code>
+(usually on the stack).
+<li>
+Call <code>EventGenerator::run</code> passing it a reference to
+the instance of <code>MyApplication</code>.
+<li>
+Delete the <code>EventGenerator</code>.
+</ul>
+<p>
+The application must include the <code>ParserEventGeneratorKit.h</code>
+file (which in turn includes <code>EventGenerator.h</code> and
+<code>SGMLApplication.h</code>), which is in the <code>generic</code>
+directory.  If your compiler does not support the standard C++
+<code>bool</code> type, you must ensure that <code>bool</code> is
+defined as a typedef for <code>int</code>, before including this.  One
+way to do this is to include <code>config.h</code> and then
+<code>Boolean.h</code> from the <code>lib</code> subdirectory of the SP
+distribution.
+<p>
+On Unix, the application must be linked with the
+<code>lib/libsp.a</code> library.
+
+<h2>Example</h2>
+<p>
+Here's a simple example of an application that uses this interface.
+The application prints an outline of the element structure of a
+document, using indentation to represent nesting.
+<pre>
+// The next two lines are only to ensure bool gets defined appropriately.
+#include "config.h"
+#include "Boolean.h"
+
+#include "ParserEventGeneratorKit.h"
+#include &lt;iostream.h>
+
+ostream &amp;operator<<<!>(ostream &amp;os, SGMLApplication::CharString s)
+{
+  for (size_t i = 0; i < s.len; i++)
+    os << char(s.ptr[i]);
+  return os;
+}
+
+class OutlineApplication : public SGMLApplication {
+public:
+  OutlineApplication() : depth_(0) { }
+  void startElement(const StartElementEvent &amp;event) {
+    for (unsigned i = 0; i < depth_; i++)
+      cout << "    ";
+    cout << event.gi << '\n';
+    depth_++;
+  }
+  void endElement(const EndElementEvent &amp;) { depth_--; }
+private:
+  unsigned depth_;
+};
+
+int main(int argc, char **argv)
+{
+  ParserEventGeneratorKit parserKit;
+  // Use all the arguments after argv[0] as filenames.
+  EventGenerator *egp = parserKit.makeEventGenerator(argc - 1, argv + 1);
+  OutlineApplication app;
+  unsigned nErrors = egp->run(app);
+  delete egp;
+  return nErrors > 0;
+}
+</pre>
+<p>
+This example will only work for the non-multibyte version of SP;
+for the multibyte version you will need to use the standard C++ library's
+facilities for wide character output, or roll your own equivalents
+(like the OutputCharStream used by SP applications).
+<p>
+There's a bigger example in the <code>sgmlnorm</code> directory in the SP
+distribution.
+This uses the <code>SGMLApplication</code> interface, but it doesn't
+use the <code>ParserEventGeneratorKit</code> interface.
+<p>
+<address>
+James Clark<BR>
+jjc@jclark.com
+</address>
+</body>
+</html>
diff --git a/doc/ideas.htm b/doc/ideas.htm
new file mode 100644 (file)
index 0000000..cd29c0a
--- /dev/null
@@ -0,0 +1,522 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML Strict//EN">
+<HTML>
+<HEAD>
+<TITLE>Ideas for improving SP</TITLE>
+</HEAD>
+<BODY>
+<H1>Ideas for improving SP</H1>
+<H2>
+Parser
+</H2>
+<P>
+When !internalCharsetIsDocCharset, need to check that every
+significant character is an SGML character.
+<P>
+Treat "ISO Registration Number NNN//" public ids specially.  Warn if
+they use designating sequence inconsistently.
+<P>
+Pass non-declared attributes through to application.
+<P>
+Avoid expensive overflow test in stringToNumber when length of number
+is less then something guaranteed not to overflow.
+<P>
+Allow external character set to be complete character set description.
+<P>
+Maybe distinguish non-SGML characters as separate event even when
+internalCharsetIsDocCharset.
+<P>
+Supporting caching across multiple runs of parser in single
+process.
+<P>
+Make Dtd copiable.
+<P>
+?Subdoc parser needs character set for system id (should be system
+character set).
+<P>
+Recover better from non-existent documents or subdocuments.
+<P>
+Think about entity declarations/references in inactive LPDs.
+<P>
+Don't allow name groups in parameter entity references in document
+type specifications in start-/end-tags.
+<P>
+With link, don't do a pass 2 unless we replace a referenced entity
+(what about default entity?).
+<P>
+Options to warn about things that HTML disallows: marked sections in
+instance, explicit subsets.
+<P>
+Option to warn about MDCs in comments in comment declarations.
+<P>
+Option to warn about omitted REFC.
+<P>
+Check that names of added functions are valid names in concrete syntax
+(both characters and lengths).  Also need to do upper-case
+substitution on them?
+<P>
+Recover from nested doctype declaration intelligently.
+<P>
+Recover from missing doctype declaration intelligently. 
+<P>
+Could optimize parsing of attribute literals using technique similar
+to extendData().
+<P>
+attributeValueLength error should give actual length of value.
+<P>
+Recover better from entity reference with name group in literal.
+<P>
+At start of pass 2 clear everything in pass1LPDs except entity sets.
+<P>
+Give an error if EXPLICIT > 1 and LPDs don't chain as required by
+436:5-7 and 436:18-20.
+<P>
+Handle quantity errors by reporting at the end of the prolog and the
+end of the instance any quantities that need to be increased.
+<P>
+Make noSuchReservedName error more helpful.
+<P>
+Function characters should perform their function even when markup
+recognition is suppressed. (I think I've handled this.)
+<P>
+Give a warning for notation attribute that is #CONREF.
+<P>
+Try to separate out Parser::compileModes().
+<P>
+In CompiledModelGroup have vector that gives an index for each element type
+that occurs in the model group.  Then in each leaf content token have a
+vector that maps this index to a LeafContentToken *, if there
+is a simple transition (no and groups involved) to that element type.
+<P>
+MatchState::minAndDepth and MatchState::AndInfo should be separated
+off info object pointed to from MatchState; pointer would be null for
+elements with no AND groups.
+<P>
+What to do if we encounter USELINK or USEMAP declaration after DTD in
+prolog?  Should stop prolog and start DTD.  If we have SCOPE INSTANCE
+then if we get an unknown declaration type in prolog, don't give
+error, but unget token and start instance.
+<P>
+?Have separate version of reportNonSgml() for case where datachar is allowed.
+<P>
+Implement CONCUR.
+<P>
+AttributeDefinition constructors should have Owner&lt;DeclaredValue> &,
+arguments to avoid storage leaks when exceptions are thrown.
+<P>
+Create a list like IList but which keeps track of length.  Then
+combine tagLevel into openElement stack, and inputLevel into
+inputStack.
+<P>
+AttributeDefinition::makeValue should return
+ConstResourcePointer&lt;AttributeValue>.
+<P>
+Syntax member functions should use reference for result.
+<P>
+Have a LocationKey data structure that can be used to determine the
+relative order of locations in possibly different concurrent
+instances.  Contains: offset in document instance; is it a replacement
+of named character reference; for each entity and numeric character
+reference: location in entity and index of dtd in which instance is
+declared.
+<P>
+On systems with fixed stacks, avoid unlimited stack growth: hard
+limits on number of SUBDOCS and GRPLVL.
+<P>
+With extendData and extendS don't extend more than some fixed amount
+(eg 1024), otherwise could overrun InputSource buffer on 16-bit
+system.
+<P>
+Have a location in ElementType saying where the first mention of the
+element name was.  Useful for giving warnings about undefined
+elements.
+<P>
+How to detect 310:8-10?
+<P>
+AttributeSemantics should return const pointers rather than ResourcePointer's
+<P>
+Rename Parser -> ParserImpl SgmlParser -> Parser
+Syntax::isB -> Syntax::isBlank
+<P>
+What mode should be used for parsing other prolog after document element?
+<P>
+Flag out of context data.
+<P>
+Provide mechanism to allow character names to be mapped onto universal
+character numbers.
+<P>
+Provide mechanism to allow specification of wbat characters are
+control characters (for the purposes of SHUNCHAR controls).
+<P>
+With SCOPE INSTANCE, which syntax should be used for delimiters in
+bracketed text entities?
+<P>
+Better error messages for ambiguous delimiters.
+<P>
+Do we need both EndLpd and ComplexLink/SimpleLink events?
+<P>
+What to do about 457:19-21?
+<P>
+Rename lpd_ to activeLpd_; allLpd_ to lpd_.
+<P>
+Test for validity of character numbers in syn ref charset (perhaps
+unnecessary, because bad numbers won't be translateable into doc
+charset).
+<P>
+Option to read bootstrap character set from entity.
+<P>
+In AttributeDefinitionList have a flag that is true if any checking of
+unspecified values in attribute list is needed (ie CURRENT, REQUIRED,
+non-implied ENTITY, non-implied NOTATION).  In this case can avoid
+running over attributes in AttributeList::finish, by computing value
+only when user calls Attribute::value().
+<P>
+Construct link attributes from definition if no applicable link rule.
+(RAST maybe doesn't want this.  Make it a separate method in LinkProcess and
+use in SgmlsEventHandler. Very useful with ArcEngine.)
+<P>
+Shouldn't have OpenElementInfo in Message.  Instead use RTTI.
+<P>
+noSuchAttribute: include gi in message; if element is undefined, don't
+give error at all
+<P>
+noSuchAttributeToken: say what element or entity
+<P>
+nonExistentEntityRef should say document/link type
+<P>
+Distinguish errors that are totally recoverable.
+<P>
+Find better way to unpack entity information in entity attribute.
+
+<H2>
+Entity Manager
+</H2>
+<P>
+Build document<->internal translation tables once per document not
+once per entity.
+<P>
+Avoid document<->internal translations when one is the subset of the other
+(or something like that).
+<P>
+In cases where it won't cause problems, don't translate
+non-SGML/unrepresentable characters when doing document<->internal
+translations, so that user gets better error message.
+<P>
+Recover better from unknown document character sets (shouldn't report
+them as non-SGML characters).
+<P>
+Maybe need to keep track of set of SGML characters as numbers in document
+character set.
+<P>
+Optimize TranslateDecoder where underlying codingSystem is identity by
+using simple lookup table.
+<P>
+Make use of charset parameter in MIME header for HTTP.  Also generate
+AcceptCharsets line in request.
+<P>
+Implement .mim files (if extension of file is same as environment variable
+SP_MIME_EXT assume it has a MIME header).
+<P>
+Avoid using TranslateCodingSystem when translation is a no-op.
+<P>
+Make SP_CONVERT when !SP_MULTI_BYTE.
+<P>
+Avoid requiring that BASE sysid exist.
+<P>
+When FSI has only a single storage manager and that is a literal,
+return an InternalInputSource.
+<P>
+Allow user of InputSource to specify what bit combinations they
+want to see for RS and RE.
+<P>
+Have environment variable SP_INPUT_BCTF that overrides SP_BCTF for
+input.
+<P>
+Avoid using numeric character references for all characters in storage
+object identifier of literal storage manager in effective system
+identifier.
+<P>
+Instead of registering coding system pass CodingSystemKit that can create
+that can create coding systems.
+<P>
+Need BCTF entry in catalog that specifies default BCTF.
+<P>
+Allow encodings to be externally specified (eg in a catalog) as a
+combination of a BCTF and a character set.
+<P>
+An SOEntityCatalog should consist of a Vector&lt;ConstPtr&lt;EntityCatalog>
+> which can be shared between several catalogs.  This would facilitate
+> caching.
+<P>
+Maybe need to be able to specify two types of catalog entry file: one
+used for all documents; one used for this document alone.
+<P>
+Allow end-tags in FSIs.  Support alternative SOSs.
+<P>
+Character sets in the catalog need rethinking.  Also character set of
+ParsedSystemId::Map::publicId.
+<P>
+Allow for HTTP proxy.
+<P>
+Cache catalogs.
+<P>
+Use Microsoft ActiveX (formerly Sweeper) DLL on Win95 or NT.
+<P>
+Implement DTDDECL catalog entry.
+<P>
+Support FILE URLs.
+<P>
+Perhaps don't want to do searching for catalog files (and perhaps
+command line files).
+<P>
+Provide mechanism for specifying when (if at all) base dir is searched
+relative to other dirs.
+<P>
+Provide extension to catalog format to distinguish entities declared
+in non-base DTDs. Perhaps precede entity name by document type name
+surrounded by GRPO/GRPC delimiters.
+<P>
+URLStorageManager should use a DescriptorManager shared with
+PosixStorageManager.
+<P>
+URLStorageManager::resolveRelative should delete "xxx/../" and "./"
+components.  Might also be a good idea to resolve host names.
+<P>
+Implement JIS encoding system (what should be done with half-width yen
+and overbar in JIS-Roman? translate to Unicode).
+<P>
+ExternalInfoImpl::convertOffset: when the position is the character
+past the last character and the last character was a newline, line
+number should be number of lines + 1.
+<P>
+Try harder to rewind in StdioStorageObject.
+
+<H2>
+Generic
+</H2>
+<P>
+Provide mechanism to access data entities using generated system id.
+<P>
+Support IMPLICIT/SIMPLE LINK.
+<P>
+Character set information.
+<P>
+Need to know space character that separates token.  Alternatively
+provide broken down view of tokens.
+<P>
+Need to know IDREF (and other declared values)?
+
+<H2>
+nsgmls
+</H2>
+<P>
+Problem with "\#n;" escape sequence is that it might get used other
+than in data.  Probably should get rid of this feature, and give
+a warning when there's an unencodable character.
+
+<H2>
+Internal
+</H2>
+<P>
+Make sure all files use #pragma i/i.
+<P>
+Get rid of assumption that Vector&lt;T>::size_type, String&lt;T>::size_type
+is size_t.
+<P>
+Maybe align Owner with auto_ptr.
+<P>
+Get rid of uses of string as identifier.
+<P>
+?Maybe support non-const copy constructors for NCVector/Owner.
+<P>
+Get rid of asEntityOrigin (as far as possible).  Make
+InputSourceOrigin::defLocation virtual on origin.  Avoid excessive use
+of asInputSourceOrigin.
+<P>
+Hash should define Hash(String&lt;unsigned char>),
+Hash(String&lt;unsigned short>) etc.
+<P>
+Invert sense of SP_HAVE_BOOL define.
+<P>
+Get rid of OutputCharStream::open.  Instead have
+OutputCharStream::setEncoding.  (Perhaps make a friend so we can use
+ostream if we're not interested in encodings.)  Allow use of ostream
+instead of OutputCharStream.  Change ParserToolkit::errorStream_'s coding
+system when we change the coding system.
+<P>
+Support 32-bit Char. Need to fix XcharMap and SubstTable.
+Detemplatize SubstTable.  Then support UTF-16.
+<P>
+Have a common version of Ptr for things that have a virtual
+destructor.
+<P>
+Have a common version of Owner for all things that have a virtual
+destructor.
+<P>
+Inheritance in AttributeSemantics unnecesary.
+<P>
+Rename ISet -> RangeSet.
+<P>
+ISet and RangeMap should use binary search.
+<P>
+Better hash function for wide characters.
+<P>
+OutputCharStream should canonically use RS/RE and translate to system
+newline char with raw option that prevents this.
+<P>
+Avoid having Entity.h depend on ParserState, perhaps by double
+dispatching.
+<P>
+Add uses of explicit keyword.
+<P>
+When generating message.h file; if we don't have .cxx file and
+namespaces are supported, use anonymous namespace.
+
+<H2>
+Application framework
+</H2>
+<P>
+Only use static programName for outOfMemory message.
+<P>
+Need to use AppChar *const * not AppChar ** in CmdLineApp.
+<P>
+When reporting message with MessageEventHandler need to be able to
+update error count.
+<P>
+Option argument names need to be internationalized.
+<P>
+Support response files for DOS.
+<P>
+Sort options in usage message.
+<P>
+StringMessageArg should be associated with a character set (in
+particular, need to distinguish parser character sets from
+StorageManager character sets).
+<P>
+Should translate StringMessageArg from document character set to
+system character set.  Have MessageReporter::setDocumentCharacter
+function.
+<P>
+In MessageReporter, maybe distinguish messages coming from the parser.
+<P>
+Don't ever give a non-existent file as a location in a error message.
+<P>
+Text of messages should be able to specify that an open quote or close
+quote should be inserted at a particular point.
+<P>
+When outputting a StringMessageArg translate \r to \n.
+<P>
+Make sure wild cards work in VC++ and MS-DOS.
+
+<H2>
+Win32
+</H2>
+<P>
+Remove path and extension from program name in error messages.
+<P>
+Compilers can typically eliminate unused templates.  Reengineer Vector
+to reduce code size with such compilers.
+<P>
+Store messages in resources; requires numeric tags for messages.
+<P>
+Should automatically register all available code pages.
+<P>
+Make use of IsTextUnicode() API.
+<P>
+Have StorageManager that uses Win32 API directly.  Would avoid limits
+on number of open files. Also use flag that says file is being
+accessed sequentially.
+<P>
+Allow DTDs to be compiled into binary by having storage manager that
+uses resource ids.
+
+<H2>
+Architecture engine
+</H2>
+<P>
+Should give an error with -A if the specified arch does not exist.
+<P>
+Interpret APPINFO parameter, and automatically enable architectural
+processing based on this.
+<P>
+Handle derived architecture support attributes.
+<P>
+When doing architectural processing in link type, not possible to have
+notation declaration, so need some other way to specify public
+identifier for architecture.
+<P>
+Allow DOCTYPE to be declared inline (as with CONCUR or EXPLICIT LINK).
+<P>
+Grok conventional comments.
+<P>
+Make work automatically with EventHandlers that process subdoc.  Make
+references to subdocs architectural.
+<P>
+Support different SGML declaration for meta-DTD.
+<P>
+Maybe should map internal sdata/cdata entities to copies in meta-DTD.
+<P>
+Perhaps when getting open element info should indicate that gis are
+architectural.
+<P>
+Think about references to SDATA entities in default values in meta-DTD.
+<P>
+Add default entity from real DTD to meta-DTD.
+<P>
+Tokenize ArcForm attribute appropriately.
+<P>
+Make special case for parsing DTD when entity can't be accessed.
+<P>
+Try to provide extension that would allow architecture elements be
+asynchronous with actual elements?  This would provide CONCUR
+functionality.
+
+<H2>
+sgmlnorm
+</H2>
+<P>
+Avoid bogus newline from invalid empty document.
+<P>
+Avoid always escaping >.
+<P>
+Option to say whether to use character references for 8-bit characters.
+<P>
+Option to output implied attributes.
+<P>
+Option to output all non-implied attributes.
+<P>
+Option to omit attribute name with name tokens.
+<P>
+Protect against recognition of short references.
+<P>
+Option to preserve CDATA entity references.
+<P>
+Option to output general entity declarations in DTD subset
+(but what about data attributes)?
+
+<H2>
+spam
+</H2>
+<P>
+Option to normalize names.
+<P>
+Add comments round expanded entities to prevent false delimiter
+recognition.
+<P>
+Add newline at the end if last thing was omitted tag.
+<P>
+Option to warn about changes in internal entities when not expanding.
+
+<H2>
+Documentation
+</H2>
+<P>
+Error message format.
+<P>
+&lt;catalog&gt; FSI tag.
+<P>
+<ADDRESS>
+James Clark<BR>
+jjc@jclark.com
+</ADDRESS>
+</BODY>
+</HTML>
diff --git a/doc/index.htm b/doc/index.htm
new file mode 100644 (file)
index 0000000..f3016ae
--- /dev/null
@@ -0,0 +1,96 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML Strict//EN">
+<HTML>
+<HEAD>
+<TITLE>SP</TITLE>
+</HEAD>
+<BODY>
+<H1>SP</H1>
+<H3>
+An SGML System Conforming to International Standard ISO 8879 --
+Standard Generalized Markup Language
+</H3>
+<P>
+The following documents are available:
+<P>
+<UL>
+<LI>
+<A HREF="features.htm">Summary of SP's features</A>
+<LI>
+<A HREF="http://www.jclark.com/sp/howtoget.htm">How to get SP</A>
+<LI>
+<A HREF="build.htm">How to build and install SP from source</A>
+<LI>
+Using SP
+<UL>
+<LI>
+<A HREF="new.htm">What's new in SP?</A>
+<LI>
+<A HREF="nsgmls.htm">nsgmls</A>, a replacement for sgmls
+<LI>
+<A HREF="sgmlsout.htm">nsgmls output format</A>,
+an extension to the output format of sgmls
+<LI>
+<A HREF="spam.htm">spam</A>, a sophisticated normalizer,
+perhaps better thought of as a markup stream editor
+<LI>
+<A HREF="sgmlnorm.htm">sgmlnorm</A>, a simpler normalizer
+that focuses on producing the same ESIS rather than
+preserving details of the markup
+<LI>
+<A HREF="sx.htm">sx</A>, a converter from SGML to XML
+<LI>
+<A HREF="spent.htm">spent</A>, a program providing access
+to SP's entity manager
+<LI>
+<A HREF="xml.htm">XML support</A>
+<LI>
+<A HREF="sysdecl.htm">System declaration</A>
+<LI>
+<A HREF="sgmldecl.htm">Handling of SGML declarations</A>
+<LI>
+<A HREF="charset.htm">Handling of character sets</A>
+<LI>
+<A HREF="sysid.htm">System identifiers</A>
+<LI>
+<A HREF="catalog.htm">Using SGML Open catalogs to generate
+system identifiers</A>
+<LI>
+<A HREF="archform.htm">Architectural form support</A>
+</UL>
+<LI>
+Programming with SP
+<UL>
+<LI>
+<A HREF="generic.htm">Generic API to SP</A>
+<LI>
+<A HREF="ideas.htm">Ideas for improving SP</A>
+</UL>
+</UL>
+<P>
+There is a mailing list for programmer-level discussions of SP.  Mail
+subscription requests <A
+HREF="mailto:sp-prog-request@jclark.com">sp-prog-request@jclark.com</A>.
+Messages for the list should go to <A
+HREF="mailto:sp-prog@jclark.com">sp-prog@jclark.com</A>.
+<P>
+For information about SGML, see
+<UL>
+<LI>
+<A href="http://www.oasis-open.org/cover/">The SGML/XML Web Page</A>.
+<LI>
+<A HREF="http://www.iso.ch/cate/d16387.html">ISO 8879:1986</A>
+<LI>
+The SGML Handbook, Charles F. Goldfarb
+</UL>
+<P>
+I would like to hear about any bugs you find in SP.  When reporting a
+bug, please always include a complete self-contained file that will
+enable me to reproduce the bug.  I am also interested in receiving
+suggestions for improvements to SP no matter how small.
+<P>
+<ADDRESS>
+James Clark<BR>
+jjc@jclark.com
+</ADDRESS>
+</BODY>
+</HTML>
diff --git a/doc/new.htm b/doc/new.htm
new file mode 100644 (file)
index 0000000..db2ed22
--- /dev/null
@@ -0,0 +1,199 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML Strict//EN">
+<HTML>
+<HEAD>
+<TITLE>What's new in SP?</TITLE>
+</HEAD>
+<BODY>
+<H1>What's new?</H1>
+<P>
+This document describes recent user-visible changes in SP.  Bug fixes
+are not described.
+
+<H2>Version 1.3</H2>
+<P>
+Better <A HREF="xml.htm">support for XML</A> based on the Web SGML
+Adaptations Annex to ISO 8879.
+<P>
+New <A HREF="sx.htm">SX</A> application that converts SGML to XML.
+<P>
+The architecture engine has been updated to match HyTime 2nd Edition
+(This means that you must use
+<CODE>&lt;?IS10744 ArcBase <VAR>arch</VAR>&gt;</CODE>
+rather than
+<CODE>&lt;?ArcBase <VAR>arch</VAR>&gt;</CODE>.)
+
+<H2>Version 1.2</H2>
+<P>
+The Extended Naming Rules TC is supported.
+The extensions supported in external concrete syntaxes have been
+changed for compatibility with this.
+<P>
+The handling of character sets in the multi-byte version is more
+sophisticated.
+The <A HREF="charset.htm">character sets</A> HTML page
+gives more information.
+<P>
+SP has built-in knowledge of many <A HREF="sgmldecl.htm#charset">more
+base character sets</A>.
+<P>
+nsgmls will report empty elements if the <CODE>-oempty</CODE>
+option is used.
+<P>
+DTD-less parsing is possible, by using the <CODE>-wno-valid</CODE>
+option to allow undefined elements and attributes.  This allows
+parsing of well-formed XML documents, whether or not valid.
+
+<H2>Version 1.1</H2>
+<P>
+There is now generalized support for <A
+HREF="archform.htm">architectural form processing</A>.
+<P>
+Documentation is now in HTML format.
+<P>
+A BASE catalog entry can be used to specify a base system identifier
+for resolving relative storage object identifiers occurring in the
+catalog.
+<P>
+A LITERAL storage manager is now provided.
+<P>
+Programs have a -E option that sets the maximum number of errors.
+<P>
+A DELEGATE catalog entry allows distributed resolution of public
+identifiers.
+<P>
+nsgmls has a -B (batch mode) option that allows you to parse multiple
+documents with a single invocation of nsgmls.
+<P>
+In nsgmls the -c option now specifies a catalog as it does in spam and
+sgmlnorm, in addition to the -m option that previously did this.
+<P>
+The <SAMP>-n</SAMP> option has been replaced by a
+<SAMP>-onotation-sysid</SAMP> which applies to nsgmls only, and a
+<SAMP>-wnotation-sysid</SAMP> which applies generally.
+<P>
+SP can be built as a DLL under Win32.
+
+<H2>Version 1.0</H2>
+<P>
+The syntax of system identifiers has completely changed.  The new
+syntax is based on the syntax of formal system identifiers defined in
+ISO/IEC 10744 (HyTime) Technical Corrigendum 1, Annex D.
+<P>
+The NSGMLS_CODE environment variable has been renamed to SP_BCTF.
+nsgmls has a -b option to specify the bit combination transformation
+format to be used for output.
+<P>
+A list of directories in which files specified in system identifiers
+should be searched for can be specified using the environment variable
+SGML_SEARCH_PATH or the option -D.
+<P>
+Individual SYSTEM identifiers in external identifiers can be
+overridden using SYSTEM entries in the catalog.
+<P>
+The OVERRIDE catalog entry now takes a YES/NO argument.  (This change
+was required for conformance to the SGML Open TR.)  It applies to each
+entry individually rather than to the entire catalog.
+<P>
+The -w options of nsgmls and spam have been enhanced.  In spam, the -w
+option takes an argument as with nsgmls.  There are new warnings for
+minimized start and end tags (-wunclosed, -wempty, -wnet and
+-wmin-tag); for unused short reference maps (-wunused-maps); for
+unused parameter entities (-wunused-param).  -wall now doesn't include
+those warnings that are about conditions that, in the opinion of the
+author, there is no reason to avoid.  A warning can be turned off by
+using its name prefixed by no-; thus -wmin-tag -wno-net is equivalent
+to -wunclosed -wempty.  The -w option is also used to turn off errors:
+-wno-idref replaces the -x option; -wno-significant replaces the -X
+option.
+<P>
+In the output of nsgmls, characters that cannot be represented in the
+encoding translation specified by the NSGMLS_BCTF environment variable
+are represented using an escape sequence of the form \#N; when N is a
+decimal integer.
+<P>
+In the multi-byte versions of nsgmls there are new BCTFs is8859-N
+for N = 1,...,9.
+<P>
+There is a -o option to nsgmls which makes it output additional
+information: -oentity outputs information about all entities; -oid
+distinguish attributes with a declared value of id; -oincluded
+distinguishes included subelements.
+<P>
+nsgmls now automatically searches for a catalog entry file called
+"catalog" in the same place as the document entity.  Note that when
+the document entity is specified with a URL, this matches the
+behaviour of Panorama.
+<P>
+A catalog entry file can contain CATALOG entries specifying additional
+catalog entry files.  This matches the behaviour of Panorama.
+<P>
+The parser can now make available to an application complete
+information about the markup of prologs and SGML declarations.  It
+would now be possible, for example, to use SP to write a DTD editor.
+spam exploits this to a limited extent: if the -p option is specified
+twice, then parameter entity references between declarations will be
+expanded; the -mreserved option puts all reserved names in upper-case;
+with the -mshortref option short reference use declarations and short
+reference mapping declarations will be removed; attribute
+specification lists in data attribute specifications in entity
+declarations can be normalized like attribute specification lists in
+start-tags; with -mms it resolves IGNORE/INCLUDE marked sections.
+<P>
+nsgmls has a -C option which causes the command line filenames to be
+treated as a catalog whose DOCUMENT entry specifies the document
+entity.
+<P>
+nsgmls has a -n option which causes it to generate system identifiers
+for notations in the same way as it does for entities.
+<P>
+spam now has a -f option like nsgmls.
+<P>
+The interface between the parser and entity manager has been
+redesigned so that the entity manager can be used independently of the
+parser.  This is exploited by a new program called spent that prints
+an entity with a specified system identifier on the standard output.
+<P>
+In most cases, a Control-Z occurring as the last byte in a file will
+be stripped.  This is controlled by the zapeof attribute in formal
+system identifiers.
+
+<H2>Version 0.4</H2>
+<P>
+External concrete syntaxes, character sets and capacity sets are
+supported using PUBLIC entries in catalog files.  The multicode code
+core and reference syntaxes are no longer built-in.  Only a few
+character sets are now built-in.
+<P>
+Within external concrete syntaxes, various useful extensions are
+permitted.  In particular, an ellipsis syntax is allowed for the
+specification of name characters and single character short
+references.  It is now practical to specify tens of thousands of
+additional name characters.
+<P>
+The default SGML declaration is more permissive.
+<P>
+nsgmls has a -x option that inhibits checking of idrefs.
+<P>
+nsgmls has a -w option that can enable additional warnings.  In
+particular, -wmixed will warn about mixed content models that do not
+allow #pcdata everywhere.
+<P>
+The meaning of the f command in the output of nsgmls has changed
+slightly.  It now gives the effective system identifier of the entity.
+<P>
+The functionality of the rast program has been merged into the nsgmls
+program and the rast program has been removed.  The -t option makes
+nsgmls generate a RAST result.
+<P>
+spam has a -l option that uses lower-case for added names that were
+subject to upper-case substitution.
+<P>
+spam has a -mcurrent option that adds omitted attribute specifications
+for current attributes.
+<P>
+<ADDRESS>
+James Clark<BR>
+jjc@jclark.com
+</ADDRESS>
+</BODY>
+</HTML>
diff --git a/doc/nsgmls.htm b/doc/nsgmls.htm
new file mode 100644 (file)
index 0000000..8c3cfb6
--- /dev/null
@@ -0,0 +1,465 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML Strict//EN">
+<HTML>
+<HEAD>
+<TITLE>NSGMLS</TITLE>
+</HEAD>
+<BODY>
+<H1>NSGMLS</H1>
+<H4>
+An SGML System Conforming to
+International Standard ISO 8879 --<BR>
+Standard Generalized Markup Language
+</H4>
+<H2>
+SYNOPSIS
+</H2>
+<P>
+<SAMP>nsgmls</SAMP>
+[
+<SAMP>-BCdeglprsuv</SAMP>
+]
+[
+<SAMP>-a<VAR>linktype</VAR></SAMP>
+]
+[
+<SAMP>-b<VAR>bctf</VAR></SAMP>
+]
+[
+<SAMP>-c<VAR>sysid</VAR></SAMP>
+]
+[
+<SAMP>-D<VAR>directory</VAR></SAMP>
+]
+[
+<SAMP>-E<VAR>max_errors</VAR></SAMP>
+]
+[
+<SAMP>-f<VAR>file</VAR></SAMP>
+]
+[
+<SAMP>-i<VAR>name</VAR></SAMP>
+]
+[
+<SAMP>-o<VAR>output_option</VAR></SAMP>
+]
+[
+<SAMP>-t<VAR>file</VAR></SAMP>
+]
+[
+<SAMP>-w<VAR>warning_type</VAR></SAMP>
+]
+[
+<SAMP><VAR>sysid</VAR>...</SAMP>
+]
+<H2>DESCRIPTION</H2>
+<P>
+Nsgmls parses and validates
+the SGML document whose document entity is specified by the
+<A HREF="sysid.htm">system identifiers</A>
+<SAMP><VAR>sysid</VAR>...</SAMP>
+and prints on the standard output a simple text representation of its
+Element Structure Information Set.
+(This is the information set which a structure-controlled
+conforming SGML application should act upon.)
+If more than one system identifier is specified,
+then the corresponding entities will be concatenated to form
+the document entity.
+Thus the document entity may be spread amongst several files;
+for example, the SGML declaration, prolog and document
+instance set could each be in a separate file.
+If no system identifiers are specified, then
+nsgmls
+will read the document entity from the standard input.
+A command line system identifier of
+<SAMP>-</SAMP>
+can be used to refer to the standard input.
+(Normally in a system identifier,
+<SAMP>&lt;osfd>0</SAMP>
+is used to refer to standard input.)
+<H2>OPTIONS</H2>
+<P>
+The following options are available:
+<DL>
+<DT>
+<SAMP>-a<VAR>linktype</VAR></SAMP>
+<DD>
+Make link type
+<SAMP><VAR>linktype</VAR></SAMP>
+active.
+Not all ESIS information is output in this case:
+the active LPDs are not explicitly reported,
+although each link attribute is qualified with
+its link type name;
+there is no information about result elements;
+when there are multiple link rules applicable to the
+current element,
+nsgmls
+always chooses the first.
+<DT>
+<SAMP>-b<VAR>bctf</VAR></SAMP>
+<DT>
+<SAMP>-b<VAR>encoding</VAR></SAMP>
+<DD>
+This determines the encoding used for output.
+If in <A HREF="charset.htm#fixed">fixed character set mode</A>
+it specifies the name of an encoding;
+if not, it specifies the name of a BCTF.
+<DT>
+<SAMP>-B</SAMP>
+<DD>
+Batch mode.
+Parse each <SAMP><VAR>sysid...</VAR></SAMP> specified on the command
+line separately, rather than concatenating them.
+This is useful mainly with <SAMP>-s</SAMP>.
+<P>
+If <SAMP>-t<VAR>filename</VAR></SAMP> is also specified, then
+the specified <SAMP><VAR>filename</VAR></SAMP> will be prefixed
+to the <SAMP><VAR>sysid</VAR></SAMP> to make the filename
+for the RAST result for each <SAMP><VAR>sysid</VAR></SAMP>.
+<DT>
+<SAMP>-c<VAR>sysid</VAR></SAMP>
+<DD>
+Map public identifiers and entity names to system identifiers
+using the catalog entry file whose system identifier is
+<SAMP><VAR>sysid</VAR></SAMP>.
+Multiple
+<SAMP>-c</SAMP>
+options are allowed.
+If there is a catalog entry file called
+<SAMP>catalog</SAMP>
+in the same place as the document entity,
+it will be searched for immediately after those specified by
+<SAMP>-c</SAMP>.
+<DT>
+<A NAME="optC"><SAMP>-C</SAMP></A>
+<DD>
+The
+<SAMP><VAR>filename</VAR>...</SAMP>
+arguments specify catalog files rather than the document entity.
+The document entity is specified by the first
+<SAMP>DOCUMENT</SAMP>
+entry in the catalog files.
+<DT>
+<A NAME="optD"><SAMP>-D<VAR>directory</VAR></SAMP></A>
+<DD>
+Search
+<SAMP><VAR>directory</VAR></SAMP>
+for files specified in system identifiers.
+Multiple
+<SAMP>-D</SAMP> options
+are allowed.
+See the description of the
+<SAMP>osfile</SAMP>
+storage manager for more information about file searching.
+<DT>
+<SAMP>-e</SAMP>
+<DD>
+Describe open entities in error messages.
+Error messages always include the position of the most recently
+opened external entity.
+<DT>
+<SAMP>-E<VAR>max_errors</VAR></SAMP>
+<DD>
+Nsgmls
+will exit after
+<SAMP><VAR>max_errors</VAR></SAMP>
+errors.
+If
+<SAMP><VAR>max_errors</VAR></SAMP>
+is 0, there is no limit on the number of errors.
+The default is 200.
+<DT>
+<SAMP>-f<VAR>file</VAR></SAMP>
+<DD>
+Redirect errors to
+<SAMP><VAR>file</VAR></SAMP>.
+This is useful mainly with shells that do not support redirection
+of stderr.
+<DT>
+<SAMP>-g</SAMP>
+<DD>
+Show the generic identifiers of open elements in error messages.
+<DT>
+<A NAME="opti"><SAMP>-i<VAR>name</VAR></SAMP></A>
+<DD>
+Pretend that
+<PRE>
+&lt;!ENTITY % <VAR>name</VAR> "INCLUDE">
+</PRE>
+<P>
+occurs at the start of the document type declaration subset
+in the SGML document entity.
+Since repeated definitions of an entity are ignored,
+this definition will take precedence over any other definitions
+of this entity in the document type declaration.
+Multiple
+<SAMP>-i</SAMP>
+options are allowed.
+If the SGML declaration replaces the reserved name
+<SAMP>INCLUDE</SAMP>
+then the new reserved name will be the replacement text of the entity.
+Typically the document type declaration will contain
+<PRE>
+&lt;!ENTITY % <VAR>name</VAR> "IGNORE">
+</PRE>
+<P>
+and will use
+<SAMP>%<VAR>name</VAR>;</SAMP>
+in the status keyword specification of a marked section declaration.
+In this case the effect of the option will be to cause the marked
+section not to be ignored.
+<DT>
+<SAMP>-o<VAR>output_option</VAR></SAMP>
+<DD>
+Output additional information accordig to
+<SAMP><VAR>output_option</VAR></SAMP>:
+<DL>
+<DT>
+<SAMP>entity</SAMP>
+<DD>
+Output definitions of all general entities
+not just for data or subdoc entities that are referenced or named in an
+ENTITY or ENTITIES attribute.
+<DT>
+<SAMP>id</SAMP>
+<DD>
+Distinguish attributes whose declared value is ID.
+<DT>
+<SAMP>line</SAMP>
+<DD>
+Output
+<SAMP>L</SAMP>
+commands giving the current line number and filename.
+<DT>
+<SAMP>included</SAMP>
+<DD>
+Output an
+<SAMP>i</SAMP>
+command for included subelements.
+<DT>
+<SAMP>empty</SAMP>
+<DD>
+Output an <SAMP>e</SAMP> command for elements which are not allowed to
+have an end-tag, that is those with a declared content of empty or
+with a content reference attribute.
+<DT>
+<SAMP>notation-sysid</SAMP>
+<DD>
+Output an <SAMP>f</SAMP> command before an <SAMP>N</SAMP> command,
+if a system identifier could be generated for that notation.
+<DT>
+<SAMP>nonsgml</SAMP>
+<DD>
+In <A HREF="charset.htm#fixed">fixed character set mode</A>,
+output <SAMP>\%</SAMP> escape sequences for non-SGML data characters.
+Non-SGML data characters can result from numeric character references.
+</DL>
+<P>
+Multiple
+<SAMP>-o</SAMP>
+options are allowed.
+<DT>
+<SAMP>-p</SAMP>
+<DD>
+Parse only the prolog.
+Nsgmls
+will exit after parsing the document type declaration.
+Implies
+<SAMP>-s</SAMP>.
+<DT>
+<SAMP>-s</SAMP>
+<DD>
+Suppress output.
+Error messages will still be printed.
+<DT>
+<SAMP>-t<VAR>file</VAR></SAMP>
+<DD>
+Output to
+<SAMP><VAR>file</VAR></SAMP>
+the RAST result as defined by
+ISO/IEC 13673:1995 (actually this isn't quite an IS yet;
+this implements the Intermediate Editor's Draft of 1994/08/29,
+with changes to implement ISO/IEC JTC1/SC18/WG8 N1777).
+The normal output is not produced.
+<DT>
+<SAMP>-v</SAMP>
+<DD>
+Print the version number.
+<DT>
+<A NAME="optw"><SAMP>-w<VAR>type</VAR></SAMP></A>
+<DD>
+Control warnings and errors.
+Multiple
+<SAMP>-w</SAMP>
+options are allowed.
+The following values of
+<SAMP><VAR>type</VAR></SAMP>
+enable warnings:
+<DL>
+<DT>
+<SAMP>xml</SAMP>
+<DD>
+Warn about constructs that are not allowed by <A
+HREF="http://www.w3.org/TR/1998/REC-xml-19980210">XML</A>.
+<DT>
+<SAMP>mixed</SAMP>
+<DD>
+Warn about mixed content models that do not allow #pcdata anywhere.
+<DT>
+<SAMP>sgmldecl</SAMP>
+<DD>
+Warn about various dubious constructions in the SGML declaration.
+<DT>
+<SAMP>should</SAMP>
+<DD>
+Warn about various recommendations made in ISO 8879 that the document
+does not comply with.
+(Recommendations are expressed with ``should'', as distinct from
+requirements which are usually expressed with ``shall''.)
+<DT>
+<SAMP>default</SAMP>
+<DD>
+Warn about defaulted references.
+<DT>
+<SAMP>duplicate</SAMP>
+<DD>
+Warn about duplicate entity declarations.
+<DT>
+<SAMP>undefined</SAMP>
+<DD>
+Warn about undefined elements: elements used in the DTD but not defined.
+<DT>
+<SAMP>unclosed</SAMP>
+<DD>
+Warn about unclosed start and end-tags.
+<DT>
+<SAMP>empty</SAMP>
+<DD>
+Warn about empty start and end-tags.
+<DT>
+<SAMP>net</SAMP>
+<DD>
+Warn about net-enabling start-tags and null end-tags.
+<DT>
+<SAMP>min-tag</SAMP>
+<DD>
+Warn about minimized start and end-tags.
+Equivalent to combination of
+<SAMP>unclosed</SAMP>,
+<SAMP>empty</SAMP>
+and
+<SAMP>net</SAMP>
+warnings.
+<DT>
+<SAMP>unused-map</SAMP>
+<DD>
+Warn about unused short reference maps: maps that are declared with a
+short reference mapping declaration but never used in a short
+reference use declaration in the DTD.
+<DT>
+<SAMP>unused-param</SAMP>
+<DD>
+Warn about parameter entities that are defined but not used in a DTD.
+Unused internal parameter entities whose text is
+<SAMP>INCLUDE</SAMP>
+or
+<SAMP>IGNORE</SAMP>
+won't get the warning.
+<DT>
+<SAMP>notation-sysid</SAMP>
+<DD>
+Warn about notations for which no system identifier could be generated.
+<DT>
+<SAMP>all</SAMP>
+<DD>
+Warn about conditions that should usually be avoided
+(in the opinion of the author).
+Equivalent to:
+<SAMP>mixed</SAMP>,
+<SAMP>should</SAMP>,
+<SAMP>default</SAMP>,
+<SAMP>undefined</SAMP>,
+<SAMP>sgmldecl</SAMP>,
+<SAMP>unused-map</SAMP>,
+<SAMP>unused-param</SAMP>,
+<SAMP>empty</SAMP>
+and
+<SAMP>unclosed</SAMP>.
+</DL>
+<P>
+A warning can be disabled by using its name prefixed with
+<SAMP>no-</SAMP>.
+Thus
+<SAMP>-wall -wno-duplicate</SAMP>
+will enable all warnings except those about duplicate entity
+declarations.
+<P>
+The following values for
+<SAMP><VAR>warning_type</VAR></SAMP>
+disable errors:
+<DL>
+<DT>
+<SAMP>no-idref</SAMP>
+<DD>
+Do not give an error for an ID reference value
+which no element has as its ID.
+The effect will be as if each attribute declared as
+an ID reference value had been declared as a name.
+<DT>
+<SAMP>no-significant</SAMP>
+<DD>
+Do not give an error when a character that is not a significant
+character in the reference concrete syntax occurs in a literal in the
+SGML declaration.  This may be useful in conjunction with certain
+buggy test suites.
+<DT>
+<SAMP>no-valid</SAMP>
+<DD>
+Do not require the document to be type-valid.  This has the effect of
+changing the SGML declaration to specify <SAMP>VALIDITY
+NOASSERT</SAMP> and <SAMP>IMPLYDEF ATTLIST YES ELEMENT YES</SAMP>.
+An option of <SAMP>-wvalid</SAMP> has the effect of changing
+the SGML declaration to specify <SAMP>VALIDITY
+TYPE</SAMP> and <SAMP>IMPLYDEF ATTLIST NO ELEMENT NO</SAMP>.
+If neither <SAMP>-wvalid</SAMP> nor <SAMP>-wno-valid</SAMP> are
+specified,
+then the <SAMP>VALIDITY</SAMP> and <SAMP>IMPLYDEF</SAMP> specified
+in the SGML declaration will be used.
+</DL>
+</DL>
+<P>
+The following options are also supported for backwards compatibility
+with sgmls:
+<DL>
+<DT>
+<SAMP>-d</SAMP>
+<DD>
+Same as
+<SAMP>-wduplicate</SAMP>.
+<DT>
+<SAMP>-l</SAMP>
+<DD>
+Same as
+<SAMP>-oline</SAMP>.
+<DT>
+<SAMP>-m<VAR>sysid</VAR></SAMP>
+<DD>
+Same as <SAMP>-c</SAMP>.
+<DT>
+<SAMP>-r</SAMP>
+<DD>
+Same as
+<SAMP>-wdefault</SAMP>.
+<DT>
+<SAMP>-u</SAMP>
+<DD>
+Same as
+<SAMP>-wundef</SAMP>.
+</DL>
+<P>
+<ADDRESS>
+James Clark<BR>
+jjc@jclark.com
+</ADDRESS>
+</BODY>
+</HTML>
diff --git a/doc/sgmldecl.htm b/doc/sgmldecl.htm
new file mode 100644 (file)
index 0000000..3edd56a
--- /dev/null
@@ -0,0 +1,297 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML Strict//EN">
+<HTML>
+<HEAD>
+<TITLE>SP - SGML declaration</TITLE>
+</HEAD>
+<BODY>
+<H1>Handling of the SGML declaration in SP</H1>
+<H2>Extended Naming Rules</H2>
+<P>
+SP supports the Extended Naming Rules as specified in Annex J
+of ISO 8879:1986 (added by the 1996 technical corrigendum).
+
+<H2>Default SGML declaration</H2>
+<P>
+If the SGML declaration is omitted
+and there is no applicable
+<A HREF="catalog.htm#sgmldecl"><SAMP>SGMLDECL</SAMP></A>
+entry in a catalog,
+the following declaration will be implied:
+<PRE>
+                   &lt;!SGML "ISO 8879:1986"
+                           CHARSET
+BASESET  "ISO 646-1983//CHARSET
+         International Reference Version (IRV)//ESC 2/5 4/0"
+DESCSET    0  9 UNUSED
+          9  2  9
+         11  2 UNUSED
+         13  1 13
+         14 18 UNUSED
+         32 95 32
+        127  1 UNUSED
+CAPACITY PUBLIC    "ISO 8879:1986//CAPACITY Reference//EN"
+SCOPE    DOCUMENT
+SYNTAX
+SHUNCHAR CONTROLS 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
+        18 19 20 21 22 23 24 25 26 27 28 29 30 31 127 255
+BASESET  "ISO 646-1983//CHARSET International Reference Version
+         (IRV)//ESC 2/5 4/0"
+DESCSET  0 128 0
+FUNCTION RE                    13
+        RS                    10
+        SPACE                 32
+        TAB       SEPCHAR     9
+NAMING   LCNMSTRT  ""
+        UCNMSTRT  ""
+        LCNMCHAR  "-."
+        UCNMCHAR  "-."
+        NAMECASE  GENERAL     YES
+                  ENTITY      NO
+DELIM    GENERAL   SGMLREF
+        SHORTREF  SGMLREF
+NAMES    SGMLREF
+QUANTITY SGMLREF
+        ATTCNT    99999999
+        ATTSPLEN  99999999
+        DTEMPLEN  24000
+        ENTLVL    99999999
+        GRPCNT    99999999
+        GRPGTCNT  99999999
+        GRPLVL    99999999
+        LITLEN    24000
+        NAMELEN   99999999
+        PILEN     24000
+        TAGLEN    99999999
+        TAGLVL    99999999
+                          FEATURES
+MINIMIZE DATATAG   NO
+        OMITTAG   YES
+        RANK      YES
+        SHORTTAG  YES
+LINK     SIMPLE    YES 1000
+        IMPLICIT  YES
+        EXPLICIT  YES 1
+OTHER    CONCUR    NO
+        SUBDOC    YES 99999999
+        FORMAL    YES
+                         APPINFO NONE>
+</PRE>
+<P>
+with the exception that all characters that are neither significant
+nor shunned will be assigned to DATACHAR.
+<H2><A NAME="charset">Character sets</A></H2>
+<P>
+A character in a base character set is described either by giving its
+number in a <i>universal</i> character set, or by specifying a minimum
+literal.
+The first 65536 character numbers in the <i>universal</i> character
+set are assumed to be the same as in Unicode 2.0 (ISO/IEC 10646).
+The remaining character numbers can be assigned in any way convenient.
+<P>
+The public identifier of a base character set can be associated
+with an entity that describes it by using a
+<SAMP>PUBLIC</SAMP>
+entry in the catalog entry file.
+The entity must be a fragment
+of an SGML declaration
+consisting of the
+portion of a character set description,
+following the DESCSET keyword,
+that is, it must be a sequence of character descriptions,
+where each character description specifies a described character
+number, the number of characters and
+either a character number in the universal character set, a minimum literal
+or the keyword
+<SAMP>UNUSED</SAMP>.
+Character numbers in the universal character set can be as big as
+99999999.
+<P>
+In addition SP has built in knowledge of many character sets.
+These are identified using the designating sequence in the
+public identifier.  The following designating sequences are
+recognized:
+<DL>
+<DT>
+<SAMP>ESC 2/5 4/0</SAMP>
+<DD>
+The full set of ISO 646 IRV.
+This is not a registered character set,
+but is recommended by ISO 8879 (clause 10.2.2.4).
+<DT>
+<SAMP>ESC 2/8 4/0</SAMP>
+<DD>
+G0 set of ISO 646 IRV,
+ISO Registration Number 2.
+<DT>
+<SAMP>ESC 2/8 4/2</SAMP>
+<DD>
+G0 set of ASCII,
+ISO Registration Number 6.
+<DT>
+<SAMP>ESC 2/1 4/0</SAMP>
+<DD>
+C0 set of ISO 646,
+ISO Registration Number 1.
+<DT>
+<SAMP>ESC 2/13 4/1</SAMP>
+<DD>
+G1 set of ISO 8859-1
+<DT>
+<SAMP>ESC 2/13 4/2</SAMP>
+<DD>
+G1 set of ISO 8859-2
+<DT>
+<SAMP>ESC 2/13 4/3</SAMP>
+<DD>
+G1 set of ISO 8859-3
+<DT>
+<SAMP>ESC 2/13 4/4</SAMP>
+<DD>
+G1 set of ISO 8859-4
+<DT>
+<SAMP>ESC 2/13 4/12</SAMP>
+<DD>
+G1 set of ISO 8859-5
+<DT>
+<SAMP>ESC 2/13 4/7</SAMP>
+<DD>
+G1 set of ISO 8859-6
+<DT>
+<SAMP>ESC 2/13 4/6</SAMP>
+<DD>
+G1 set of ISO 8859-7
+<DT>
+<SAMP>ESC 2/13 4/8</SAMP>
+<DD>
+G1 set of ISO 8859-8
+<DT>
+<SAMP>ESC 2/13 4/13</SAMP>
+<DD>
+G1 set of ISO 8859-9
+<DT>
+<SAMP>ESC 2/8 4/10</SAMP>
+<DD>
+Roman set from JIS-X-0202.
+JIS version of ISO 646.
+ISO Registration Number 14.
+<DT>
+<SAMP>ESC 2/8 4/9</SAMP>
+<DD>
+Katakana set from JIS X 0201.
+ISO Registration Number 13.
+<DT>
+<SAMP>ESC 2/4 4/2</SAMP>
+<DT>
+<SAMP>ESC 2/6 4/0 ESC 2/4 4/2</SAMP>
+<DD>
+JIS X 0208-1990.
+ISO Registration Numbers 87 and 168.
+<DT>
+<SAMP>ESC 2/4 2/8 4/4</SAMP>
+<DD>
+JIS X 0212-1990.
+ISO Registration Number 159.
+<DT>
+<SAMP>ESC 2/4 4/1</SAMP>
+<DD>
+GB 2312-80.
+ISO Registration Number 58.
+<DT>
+<SAMP>ESC 2/4 2/8 4/3</SAMP>
+<DD>
+KS C 5601-1992.
+ISO Registration Number 149.
+<DT>
+<SAMP>ESC 2/5 2/15 4/0</SAMP>
+<DT>
+<SAMP>ESC 2/5 2/15 4/3</SAMP>
+<DT>
+<SAMP>ESC 2/5 2/15 4/5</SAMP>
+<DD>
+ISO/IEC 10646 UCS-2
+<DT>
+<SAMP>ESC 2/5 2/15 4/1</SAMP>
+<DT>
+<SAMP>ESC 2/5 2/15 4/4</SAMP>
+<DT>
+<SAMP>ESC 2/5 2/15 4/6</SAMP>
+<DD>
+ISO/IEC 10646 UCS-4
+</DL>
+
+<H2>Concrete syntaxes</H2>
+<P>
+The public identifier for a public concrete syntax can be associated
+with an entity that describes using a
+<SAMP>PUBLIC</SAMP>
+entry in the catalog entry file.
+The entity must be a fragment of an SGML declaration
+consisting of a concrete syntax description
+starting with the
+<SAMP>SHUNCHAR</SAMP>
+keyword
+as in an SGML declaration.
+The entity can also make use of the following extensions:
+<UL>
+<LI>
+The Extended Naming Rules extensions can be used regardless of the minimum
+literal used in the SGML declaration.
+<LI>
+An
+<I>added function</I>
+can be expressed as a parameter literal
+instead of a name.
+<LI>
+The replacement for a reference reserved name
+can be expressed as a parameter literal instead of a name.
+<LI>
+The total number of characters specified for
+<SAMP>UCNMCHAR</SAMP>
+or
+<SAMP>UCNMSTRT</SAMP>
+may exceed the total number of characters specified for
+<SAMP>LCNMCHAR</SAMP>
+or
+<SAMP>LCNMSTRT</SAMP>
+respectively.
+Each character in
+<SAMP>UCNMCHAR</SAMP>
+or
+<SAMP>UCNMSTRT</SAMP>
+which does not have a corresponding character in the same position in
+<SAMP>LCNMCHAR</SAMP>
+or
+<SAMP>LCNMSTRT</SAMP>
+is simply assigned to <SAMP>UCNMCHAR</SAMP> or <SAMP>UCNMSTRT</SAMP>
+without making it the upper-case form of any character.
+<LI>
+Within the specification of the short reference delimiters,
+a parameter literal containing exactly one character
+may be followed by the delimiter <SAMP>-</SAMP>
+and another parameter literal containing exactly one character.
+This has the same meaning as a sequence of parameter literals
+one for each character number that is greater than or equal
+to the number of the character in the first parameter literal
+and less than or equal to the number of the character in the
+second parameter literal.
+<LI>
+A number may be used as a delimiter in the
+<SAMP>DELIM</SAMP>
+section with the same meaning as a parameter literal
+containing just a numeric character reference with that number.
+</UL>
+<H2>Capacity sets</H2>
+<P>
+The public identifier for a public capacity set can be associated
+with an entity that describes using a
+<SAMP>PUBLIC</SAMP>
+entry in the catalog entry file.
+The entity must be a fragment of an SGML declaration
+consisting of a sequence of capacity names and numbers.
+<P>
+<ADDRESS>
+James Clark<BR>
+jjc@jclark.com
+</ADDRESS>
+</BODY>
+</HTML>
diff --git a/doc/sgmlnorm.htm b/doc/sgmlnorm.htm
new file mode 100644 (file)
index 0000000..c38e6f9
--- /dev/null
@@ -0,0 +1,150 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML Strict//EN">
+<HTML>
+<HEAD>
+<TITLE>SGMLNORM</TITLE>
+</HEAD>
+<BODY>
+<H1>SGMLNORM</H1>
+<H4>
+An SGML System Conforming to
+International Standard ISO 8879 --<BR>
+Standard Generalized Markup Language
+</H4>
+<H2>SYNOPSIS</H2>
+<P>
+<SAMP>sgmlnorm</SAMP>
+[
+<SAMP>-Cdemnv</SAMP>
+]
+[
+<SAMP>-b<VAR>bctf</VAR></SAMP>
+]
+[
+<SAMP>-c<VAR>catalog</VAR></SAMP>
+]
+[
+<SAMP>-D<VAR>dir</VAR></SAMP>
+]
+[
+<SAMP>-i<VAR>name</VAR></SAMP>
+]
+[
+<SAMP>-w<VAR>warning</VAR></SAMP>
+]
+<SAMP><VAR>sysid...</VAR></SAMP>
+
+<H2>DESCRIPTION</H2>
+<P>
+Sgmlnorm prints on the standard output a <I>normalized</I> document instance
+for the SGML document contained in the concatenation of the entities
+with <A HREF="sysid.htm">system identifiers</A>
+<SAMP><VAR>sysid...</VAR></SAMP>.
+<P>
+When the normalized instance is prefixed with the original SGML declaration
+and prolog, it will have the same ESIS as the original SGML document,
+with the following exceptions:
+<UL>
+<LI>
+The output of sgmlnorm does not protect against the recognition of
+short reference delimiters, so any <SAMP>USEMAP</SAMP> declarations
+must be removed from the DTD.
+<LI>
+The normalized instance will use the reference delimiters, even if the
+original instance did not.
+<LI>
+If marked sections are included in the output using the
+<SAMP>-m</SAMP> option, the reference reserved names will be used for
+the status keywords even if the original instance did not.
+<LI>
+Any ESIS information relating to the SGML LINK feature will be lost.
+</UL>
+<P>
+The normalized instance will not use any markup minimization features
+except that:
+<UL>
+<LI>
+Any attributes that were not specified in the original instance
+will not be included in the normalized instance.
+(Current attributes will be included.)
+<LI>
+If the declared value of an attribute was a name token group,
+and a value was specified that was the same as the name of
+the attribute, then the attribute name and value indicator will be
+omitted.
+For example, with HTML sgmlnorm would output <CODE>&lt;DL COMPACT&gt;</CODE>
+rather than <CODE>&lt;DL COMPACT="COMPACT"&gt;</CODE>
+</UL>
+<P>
+The following options are available:
+<DL>
+<DT>
+<SAMP>-b<VAR>bctf</VAR></SAMP>
+<DD>
+Use the <A HREF="sysid.htm#bctf">BCTF</A> with name
+<SAMP><VAR>bctf</VAR></SAMP>
+for output.
+<DT>
+<SAMP>-c<VAR>file</VAR></SAMP>
+<DD>
+Use the catalog entry file
+<SAMP><VAR>file</VAR></SAMP>.
+<DT>
+<SAMP>-C</SAMP>
+<DD>
+This has the same effect as in <A HREF="nsgmls#optC">nsgmls</A>.
+<DT>
+<SAMP>-d</SAMP>
+<DD>
+Output a document type declaration with the same external
+identifier as the input document, and with no
+internal declaration subset.
+No check is performed that the document instance is valid
+with respect to this DTD.
+<DT>
+<SAMP>-D<VAR>directory</VAR></SAMP>
+<DD>
+Search
+<SAMP><VAR>directory</VAR></SAMP>
+for files specified in system identifiers.
+This has the same effect as in <A HREF="nsgmls.htm#optD">nsgmls</A>.
+<DT>
+<SAMP>-e</SAMP>
+<DD>
+Describe open entities in error messages.
+<DT>
+<SAMP>-i<VAR>name</VAR></SAMP>
+<DD>
+This has the same effect as in <A HREF="nsgmls.htm#opti">nsgmls</A>.
+<DT>
+<SAMP>-m</SAMP>
+<DD>
+Output any marked sections that were in the input document instance.
+<DT>
+<SAMP>-n</SAMP>
+<DD>
+Output any comments that were in the input document instance.
+<DT>
+<SAMP>-r</SAMP>
+<DD>
+Raw output.
+Don't perform any conversion on RSs and REs when printing the entity.
+The entity would typically have the storage manager attribute
+<SAMP>records=asis</SAMP>.
+<DT>
+<SAMP>-v</SAMP>
+<DD>
+Print the version number.
+<DT>
+<SAMP>-w<VAR>type</VAR></SAMP>
+<DD>
+Control warnings and errors according to
+<SAMP><VAR>type</VAR></SAMP>.
+This has the same effect as in <A HREF="nsgmls.htm#optw">nsgmls</A>.
+</DL>
+<P>
+<ADDRESS>
+James Clark<BR>
+jjc@jclark.com
+</ADDRESS>
+</BODY>
+</HTML>
diff --git a/doc/sgmlsout.htm b/doc/sgmlsout.htm
new file mode 100644 (file)
index 0000000..1348143
--- /dev/null
@@ -0,0 +1,440 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML Strict//EN">
+<HTML>
+<HEAD>
+<TITLE>Nsgmls Output Format</TITLE>
+</HEAD>
+<BODY>
+<H1>Nsgmls Output Format</H1>
+<P>
+The output is a series of lines.
+Lines can be arbitrarily long.
+Each line consists of an initial command character
+and one or more arguments.
+Arguments are separated by a single space,
+but when a command takes a fixed number of arguments
+the last argument can contain spaces.
+There is no space between the command character and the first argument.
+Arguments can contain the following escape sequences:
+<DL>
+<DT>
+<CODE>\\</CODE>
+<DD>
+A
+<CODE>\</CODE>.
+<DT>
+<CODE>\n</CODE>
+<DD>
+A record end character.
+<DT>
+<CODE>\|</CODE>
+<DD>
+Internal SDATA entities are bracketed by these.
+<DT>
+<CODE>\<VAR>nnn</VAR></CODE>
+<DD>
+The character whose code is
+<CODE><VAR>nnn</VAR></CODE>
+octal.
+<P>
+A record start character will be represented by
+<CODE>\012</CODE>.
+Most applications will need to ignore
+<CODE>\012</CODE>
+and translate
+<CODE>\n</CODE>
+into newline.
+<DT>
+<CODE>\#<VAR>n</VAR>;</CODE>
+<DD>
+The character whose number is
+<CODE><VAR>n</VAR></CODE>
+decimal in the internal character set.
+<CODE><VAR>n</VAR></CODE>
+can have any number of digits.
+This is used for characters that are not representable by the
+encoding used for output.
+This will only occur with the multibyte version of nsgmls.
+<DT>
+<CODE>\%<VAR>n</VAR>;</CODE>
+<DD>
+The character whose number is
+<CODE><VAR>n</VAR></CODE>
+decimal in the document character set.
+<CODE><VAR>n</VAR></CODE>
+can have any number of digits.
+This is used for data characters resulting from numeric
+character references to non-SGML characters
+in <A HREF="charset.htm#fixed">fixed character set mode</A>.
+</DL>
+<P>
+The possible command characters and arguments are as follows:
+<DL>
+<DT>
+<CODE>(<VAR>gi</VAR></CODE>
+<DD>
+The start of an element whose generic identifier is
+<CODE><VAR>gi</VAR></CODE>.
+Any attributes for this element
+will have been specified with
+<CODE>A</CODE>
+commands.
+<DT>
+<CODE>)<VAR>gi</VAR></CODE>
+<DD>
+The end of an element whose generic identifier is
+<CODE><VAR>gi</VAR></CODE>.
+<DT>
+<CODE>-<VAR>data</VAR></CODE>
+<DD>
+Data.
+<DT>
+<CODE>&amp;<VAR>name</VAR></CODE>
+<DD>
+A reference to an external data entity
+<CODE><VAR>name</VAR></CODE>;
+<CODE><VAR>name</VAR></CODE>
+will have been defined using an
+<CODE>E</CODE>
+command.
+<DT>
+<CODE>?<VAR>pi</VAR></CODE>
+<DD>
+A processing instruction with data
+<CODE><VAR>pi</VAR></CODE>.
+<DT>
+<CODE>A<VAR>name</VAR> <VAR>val</VAR></CODE>
+<DD>
+The next element to start has an attribute
+<CODE><VAR>name</VAR></CODE>
+with value
+<CODE><VAR>val</VAR></CODE>
+which takes one of the following forms:
+<DL>
+<DT>
+<CODE>IMPLIED</CODE>
+<DD>
+The value of the attribute is implied.
+<DT>
+<CODE>CDATA <VAR>data</VAR></CODE>
+<DD>
+The attribute is character data.
+This is used for attributes whose declared value is
+<CODE>CDATA</CODE>.
+<DT>
+<CODE>NOTATION <VAR>nname</VAR></CODE>
+<DD>
+The attribute is a notation name;
+<CODE><VAR>nname</VAR></CODE>
+will have been defined using a
+<CODE>N</CODE>
+command.
+This is used for attributes whose declared value is
+<CODE>NOTATION</CODE>.
+<DT>
+<CODE>ENTITY <VAR>name...</VAR></CODE>
+<DD>
+The attribute is a list of general entity names.
+Each entity name will have been defined using an
+<CODE>I</CODE>,
+<CODE>E</CODE>
+or
+<CODE>S</CODE>
+command.
+This is used for attributes whose declared value is
+<CODE>ENTITY</CODE>
+or
+<CODE>ENTITIES</CODE>.
+<DT>
+<CODE>TOKEN <VAR>token...</VAR></CODE>
+<DD>
+The attribute is a list of tokens.
+This is used for attributes whose declared value is anything else.
+<DT>
+<CODE>ID <VAR>token</VAR></CODE>
+<DD>
+The attribute is an ID value.
+This will be output only if the
+<CODE>-oid</CODE>
+option is specified.
+Otherwise
+<CODE>TOKEN</CODE>
+will be used for ID values.
+</DL>
+<DT>
+<CODE>D<VAR>ename</VAR> <VAR>name</VAR> <VAR>val</VAR></CODE>
+<DD>
+This is the same as the
+<CODE>A</CODE>
+command, except that it specifies a data attribute for an
+external entity named
+<CODE><VAR>ename</VAR></CODE>.
+Any
+<CODE>D</CODE>
+commands will come after the
+<CODE>E</CODE>
+command that defines the entity to which they apply, but
+before any
+<CODE>&amp;</CODE>
+or
+<CODE>A</CODE>
+commands that reference the entity.
+<DT>
+<CODE>a<VAR>type</VAR> <VAR>name</VAR> <VAR>val</VAR></CODE>
+<DD>
+The next element to start has a link attribute with link type
+<CODE><VAR>type</VAR></CODE>,
+name
+<CODE><VAR>name</VAR></CODE>,
+and value
+<CODE><VAR>val</VAR></CODE>,
+which takes the same form as with the
+<CODE>A</CODE>
+command.
+<DT>
+<CODE>N<VAR>nname</VAR></CODE>
+<DD>
+Define a notation <CODE><VAR>nname</VAR></CODE>.
+This command will be preceded by a
+<CODE>p</CODE>
+command if the notation was declared with a public identifier,
+and by a
+<CODE>s</CODE>
+command if the notation was declared with a system identifier.
+If the
+<CODE>-onotation-sysid</CODE>
+option was specified,
+this command will also be preceded by an
+<CODE>f</CODE>
+command giving the system identifier generated by the entity manager
+(unless it was unable to generate one).
+A notation will only be defined if it is to be referenced
+in an
+<CODE>E</CODE>
+command or in an
+<CODE>A</CODE>
+command for an attribute with a declared value of
+<CODE>NOTATION</CODE>.
+<DT>
+<CODE>E<VAR>ename</VAR> <VAR>typ</VAR> <VAR>nname</VAR></CODE>
+<DD>
+Define an external data entity named
+<CODE><VAR>ename</VAR></CODE>
+with type
+<CODE><VAR>typ</VAR></CODE>
+(<CODE>CDATA</CODE>, <CODE>NDATA</CODE> or <CODE>SDATA</CODE>)
+and notation <CODE><VAR>not</VAR></CODE>.
+Thiscommand will be preceded by an
+<CODE>f</CODE>
+command giving the system identifier generated by the entity manager
+(unless it was unable to generate one),
+by a
+<CODE>p</CODE>
+command if a public identifier was declared for the entity,
+and by a
+<CODE>s</CODE>
+command if a system identifier was declared for the entity.
+<CODE><VAR>not</VAR></CODE>
+will have been defined using a
+<CODE>N</CODE>
+command.
+Data attributes may be specified for the entity using
+<CODE>D</CODE>
+commands.
+If the
+<CODE>-oentity</CODE>
+option is not specified,
+an external data entity will only be defined if it is to be referenced in a
+<CODE>&amp;</CODE>
+command or in an
+<CODE>A</CODE>
+command for an attribute whose declared value is
+<CODE>ENTITY</CODE>
+or
+<CODE>ENTITIES</CODE>.
+<DT>
+<CODE>I<VAR>ename</VAR> <VAR>typ</VAR> <VAR>text</VAR></CODE>
+<DD>
+Define an internal data entity named
+<CODE><VAR>ename</VAR></CODE>
+with type
+<CODE><VAR>typ</VAR></CODE>
+and entity text
+<CODE><VAR>text</VAR></CODE>.
+The
+<CODE><VAR>typ</VAR></CODE>
+will be
+<CODE>CDATA</CODE>
+or
+<CODE>SDATA</CODE>
+unless the
+<CODE>-oentity</CODE>
+option was specified,
+in which case it can also be
+<CODE>PI</CODE>
+or
+<CODE>TEXT</CODE>
+(for an SGML text entity).
+If the
+<CODE>-oentity</CODE>
+option is not specified,
+an internal data entity will only be defined if it is referenced in an
+<CODE>A</CODE>
+command for an attribute whose declared value is
+<CODE>ENTITY</CODE>
+or
+<CODE>ENTITIES</CODE>.
+<DT>
+<CODE>S<VAR>ename</VAR></CODE>
+<DD>
+Define a subdocument entity named
+<CODE><VAR>ename</VAR></CODE>.
+This command will be preceded by an
+<CODE>f</CODE>
+command giving the system identifier generated by the entity manager
+(unless it was unable to generate one),
+by a
+<CODE>p</CODE>
+command if a public identifier was declared for the entity,
+and by a
+<CODE>s</CODE>
+command if a system identifier was declared for the entity.
+If the
+<CODE>-oentity</CODE>
+option is not specified,
+a subdocument entity will only be defined if it is referenced
+in a
+<CODE>{</CODE>
+command
+or in an
+<CODE>A</CODE>
+command for an attribute whose declared value is
+<CODE>ENTITY</CODE>
+or
+<CODE>ENTITIES</CODE>.
+<DT>
+<CODE>T<VAR>ename</VAR></CODE>
+<DD>
+Define an external SGML text entity named
+<CODE><VAR>ename</VAR></CODE>.
+This command will be preceded by an
+<CODE>f</CODE>
+command giving the system identifier generated by the entity manager
+(unless it was unable to generate one),
+by a
+<CODE>p</CODE>
+command if a public identifier was declared for the entity,
+and by a
+<CODE>s</CODE>
+command if a system identifier was declared for the entity.
+This command will be output only if the
+<CODE>-oentity</CODE>
+option is specified.
+<DT>
+<CODE>s<VAR>sysid</VAR></CODE>
+<DD>
+This command applies to the next
+<CODE>E</CODE>,
+<CODE>S</CODE>,
+<CODE>T</CODE>
+or
+<CODE>N</CODE>
+command and specifies the associated system identifier.
+<DT>
+<CODE>p<VAR>pubid</VAR></CODE>
+<DD>
+This command applies to the next
+<CODE>E</CODE>,
+<CODE>S</CODE>,
+<CODE>T</CODE>
+or
+<CODE>N</CODE>
+command and specifies the associated public identifier.
+<DT>
+<CODE>f<VAR>sysid</VAR></CODE>
+<DD>
+This command applies to the next
+<CODE>E</CODE>,
+<CODE>S</CODE>,
+<CODE>T</CODE>
+or, if the
+<CODE>-onotation-sysid</CODE>
+option was specified,
+<CODE>N</CODE>
+command and specifies the system identifier
+generated by the entity manager from the specified external identifier
+and other information about the entity or notation.
+<DT>
+<CODE>{<VAR>ename</VAR></CODE>
+<DD>
+The start of the SGML subdocument entity
+<CODE><VAR>ename</VAR></CODE>;
+<CODE><VAR>ename</VAR></CODE>
+will have been defined using a
+<CODE>S</CODE>
+command.
+<DT>
+<CODE>}<VAR>ename</VAR></CODE>
+<DD>
+The end of the SGML subdocument entity
+<CODE><VAR>ename</VAR></CODE>.
+<DT>
+<CODE>L<VAR>lineno</VAR> <VAR>file</VAR></CODE>
+<DT>
+<CODE>L<VAR>lineno</VAR></CODE>
+<DD>
+Set the current line number and filename.
+The
+<CODE><VAR>file</VAR></CODE>
+argument will be omitted if only the line number has changed.
+This will be output only if the
+<CODE>-l</CODE>
+option has been given.
+<DT>
+<CODE>#<VAR>text</VAR></CODE>
+<DD>
+An APPINFO parameter of
+<CODE><VAR>text</VAR></CODE>
+was specified in the SGML declaration.
+This is not strictly part of the ESIS, but a structure-controlled
+application is permitted to act on it.
+No
+<CODE>#</CODE>
+command will be output if
+<CODE>APPINFO NONE</CODE>
+was specified.
+A
+<CODE>#</CODE>
+command will occur at most once,
+and may be preceded only by a single
+<CODE>L</CODE>
+command.
+<DT>
+<CODE>C</CODE>
+<DD>
+This command indicates that the document was a conforming SGML document.
+If this command is output, it will be the last command.
+An SGML document is not conforming if it references a subdocument entity
+that is not conforming.
+<DT>
+<CODE>i</CODE>
+<DD>
+The next element to start is an included subelement.
+This will be output only if the
+<CODE>-oincluded</CODE>
+option is specified.
+<DT>
+<CODE>e</CODE>
+<DD>
+The next element to start has a declared content of EMPTY or a content
+reference attribute, and so its end-tag must be omitted.
+This will be output only if the
+<CODE>-oempty</CODE>
+option is specified.
+</DL>
+<P>
+<ADDRESS>
+James Clark<BR>
+jjc@jclark.com
+</ADDRESS>
+</BODY>
+</HTML>
diff --git a/doc/spam.htm b/doc/spam.htm
new file mode 100644 (file)
index 0000000..78d0f3d
--- /dev/null
@@ -0,0 +1,271 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML Strict//EN">
+<HTML>
+<HEAD>
+<TITLE>SPAM</TITLE>
+</HEAD>
+<BODY>
+<H1>SPAM</H1>
+<H4>
+An SGML System Conforming to
+International Standard ISO 8879 --<BR>
+Standard Generalized Markup Language
+</H4>
+<H2>
+SYNOPSIS
+</H2>
+<P>
+<CODE>spam</CODE>
+[
+<CODE>-Cehilprvx</CODE>
+]
+[
+<CODE>-c<VAR>catalog_file</VAR></CODE>
+]
+[
+<CODE>-D<VAR>directory</VAR></CODE>
+]
+[
+<CODE>-f<VAR>file</VAR></CODE>
+]
+[
+<CODE>-m<VAR>markup_option</VAR></CODE>
+]
+[
+<CODE>-o<VAR>entity_name</VAR></CODE>
+]
+[
+<CODE>-w<VAR>warning_type</VAR></CODE>
+]
+<CODE><VAR>sysid...</VAR></CODE>
+<H2>DESCRIPTION</H2>
+<P>
+Spam (SP Add Markup)
+is an SGML markup stream editor implemented using the SP parser.
+Spam parses the SGML document contained in
+<CODE><VAR>sysid...</VAR></CODE>
+and copies to the standard output
+the portion of the document entity containing the document
+instance, adding or changing markup as specified by the
+<CODE>-m</CODE> options.
+The <CODE>-p</CODE>
+option can be used to include the SGML declaration and prolog
+in the output.
+The <CODE>-o</CODE>
+option can be used to output other entities.
+The
+<CODE>-x</CODE>
+option can be used to expand entity references.
+<P>
+The following options are available:
+<DL>
+<DT>
+<CODE>-c<VAR>file</VAR></CODE>
+<DD>
+Use the catalog entry file
+<CODE><VAR>file</VAR></CODE>.
+<DT>
+<CODE>-C</CODE>
+<DD>
+This has the same effect as in <A HREF="nsgmls.htm#optC">nsgmls</A>.
+<DT>
+<CODE>-D<VAR>directory</VAR></CODE>
+<DD>
+Search
+<CODE><VAR>directory</VAR></CODE>
+for files specified in system identifiers.
+This has the same effect as in <A HREF="nsgmls.htm#optD">nsgmls</A>.
+<DT>
+<CODE>-e</CODE>
+<DD>
+Describe open entities in error messages.
+<DT>
+<CODE>-f<VAR>file</VAR></CODE>
+<DD>
+Redirect errors to
+<CODE><VAR>file</VAR></CODE>.
+This is useful mainly with shells that do not support redirection
+of stderr.
+<DT>
+<CODE>-h</CODE>
+<DD>
+Hoist omitted tags out from the start of internal entities.
+If the text at the beginning of an internal entity causes
+a tag to be implied,
+the tag will usually be treated as being in that internal entity;
+this option will instead cause it to be treated as being in the entity
+that referenced the internal entity.
+This option makes a difference in conjunction with
+<CODE>-momittag</CODE>
+or
+<CODE>-x -x</CODE>.
+<DT>
+<CODE>-i<VAR>name</VAR></CODE>
+<DD>
+This has the same effect as in <A HREF="nsgmls.htm#opti">nsgmls</A>.
+<DT>
+<CODE>-l</CODE>
+<DD>
+Prefer lower-case.
+Added names that were subject to upper-case substitution
+will be converted to lower-case.
+<DT>
+<CODE>-m<VAR>markup_option</VAR></CODE>
+<DD>
+Change the markup in the output according to the value
+of
+<CODE><VAR>markup_option</VAR></CODE>
+as follows:
+<DL>
+<DT>
+<CODE>omittag</CODE>
+<DD>
+Add tags that were omitted using omitted tag minimization.
+End tags that were omitted because the element has
+a declared content of <SAMP>EMPTY</SAMP>
+or an explicit content reference
+will not be added.
+<DT>
+<CODE>shortref</CODE>
+<DD>
+Replace short references by named entity references.
+<DT>
+<CODE>net</CODE>
+<DD>
+Change null end-tags
+into unminimized end-tags,
+and change net-enabling start-tags
+into unminimized start-tags.
+<DT>
+<CODE>emptytag</CODE>
+<DD>
+Change empty tags into unminimized tags.
+<DT>
+<CODE>unclosed</CODE>
+<DD>
+Change unclosed tags into unminimized tags.
+<DT>
+<CODE>attname</CODE>
+<DD>
+Add omitted attribute names and
+<CODE>vi</CODE>s.
+<DT>
+<CODE>attvalue</CODE>
+<DD>
+Add literal delimiters omitted from attribute values.
+<DT>
+<CODE>attspec</CODE>
+<DD>
+Add omitted attribute specifications.
+<DT>
+<CODE>current</CODE>
+<DD>
+Add omitted attribute specifications for current attributes.
+This option is implied by the
+<CODE>attspec</CODE>
+option.
+<DT>
+<CODE>shorttag</CODE>
+<DD>
+Equivalent to combination of
+<CODE>net</CODE>,
+<CODE>emptytag</CODE>,
+<CODE>unclosed</CODE>,
+<CODE>attname</CODE>,
+<CODE>attvalue</CODE>
+and
+<CODE>attspec</CODE>
+options.
+<DT>
+<CODE>rank</CODE>
+<DD>
+Add omitted rank suffixes.
+<DT>
+<CODE>reserved</CODE>
+<DD>
+Put reserved names in upper-case.
+<DT>
+<CODE>ms</CODE>
+<DD>
+Remove marked section declarations whose effective status
+is IGNORE, and replace each marked section declaration
+whose effective status is INCLUDE by its marked section.
+In the document instance, empty comments will be added
+before or after the marked section declaration to ensure
+that ignored record ends remain ignored.
+</DL>
+<P>
+Multiple
+<CODE>-m</CODE>
+options are allowed.
+<DT>
+<CODE>-o<VAR>name</VAR></CODE>
+<DD>
+Output the general entity
+<CODE><VAR>name</VAR></CODE>
+instead of the document entity.
+The output will correspond to the first time
+that the entity is referenced in content.
+<DT>
+<CODE>-p</CODE>
+<DD>
+Output the part of the document entity containing the SGML declaration
+(if it was explicitly present in the document entity)
+and the prolog before anything else.
+If this option is specified two or more times,
+then all entity references occurring between declarations
+in the prolog will be expanded;
+this includes the implicit reference to the entity
+containing the external subset of the DTD, if there is one.
+Note that the SGML declaration will not be included if it was
+specified by an SGMLDECL entry in a catalog.
+<DT>
+<CODE>-r</CODE>
+<DD>
+Don't perform any conversion on RSs and REs when outputting the entity.
+The entity would typically have the storage manager attribute
+<CODE>records=asis</CODE>.
+<DT>
+<CODE>-v</CODE>
+<DD>
+Print the version number.
+<DT>
+<CODE>-w<VAR>type</VAR></CODE>
+<DD>
+Control warnings and errors according to
+<CODE><VAR>type</VAR></CODE>.
+This has the same effect as in <A HREF="nsgmls.htm#optw">nsgmls</A>.
+<DT>
+<CODE>-x</CODE>
+<DD>
+Expand references to entities that are changed.
+If this option is specified two or more times,
+then all references to entities that contain tags
+will be expanded.
+</DL>
+
+<H2>BUGS</H2>
+<P>
+Omitted tags are added at the point where they are
+implied by the SGML parser (except as modified
+by the
+<CODE>-h</CODE>
+option); this is often not quite where they are wanted.
+<P>
+The case of general delimiters is not preserved.
+<P>
+Incorrect results may be produced if a variant concrete syntax is used
+which is such that there are delimiters in markup to be added that have a
+prefix that is a proper suffix of some other delimiter.
+<P>
+If an entity reference in a default value uses the default entity and
+an entity with that name is subsequently defined and that default
+value is added to the document instance, then the resulting document
+may not be equivalent to the original document.
+Spam will give a warning when the first two conditions are met.
+<P>
+<ADDRESS>
+James Clark<BR>
+jjc@jclark.com
+</ADDRESS>
+</BODY>
+</HTML>
diff --git a/doc/spent.htm b/doc/spent.htm
new file mode 100644 (file)
index 0000000..6039242
--- /dev/null
@@ -0,0 +1,75 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML Strict//EN">
+<HTML>
+<HEAD>
+<TITLE>SPENT</TITLE>
+</HEAD>
+<BODY>
+<H1>SPENT</H1>
+<H2>SYNOPSIS</H2>
+<P>
+<CODE>spent</CODE>
+[
+<CODE>-Cnrv</CODE>
+]
+[
+<CODE>-b<VAR>bctf</VAR></CODE>
+]
+[
+<CODE>-D<VAR>directory</VAR></CODE>
+]
+<CODE><VAR>sysid...</VAR></CODE>
+
+<H2>DESCRIPTION</H2>
+<P>
+Spent (SGML print entity)
+prints the concatenation of the entities with
+<A HREF="sysid">system identifiers</A>
+<CODE><VAR>sysid...</VAR></CODE>
+on the standard output.
+<P>
+The following options are available:
+<DL>
+<DT>
+<CODE>-b<VAR>bctf</VAR></CODE>
+<DD>
+Use the <A HREF="sysid.htm#bctf">BCTF</A> with name
+<CODE><VAR>bctf</VAR></CODE>
+for output.
+<DT>
+<CODE>-C</CODE>
+<DD>
+This has the same effect as in <A HREF="nsgmls#optC">nsgmls</A>.
+<DT>
+<CODE>-D<VAR>directory</VAR></CODE>
+<DD>
+Search
+<CODE><VAR>directory</VAR></CODE>
+for files specified in system identifiers.
+This has the same effect as in <A HREF="nsgmls.htm#optD">nsgmls</A>.
+<DT>
+<CODE>-n</CODE>
+<DD>
+The entity is a non-SGML data entity.
+This option forces the octets in the storage objects comprising the entity
+to be copied exactly without any of the conversions that are done for
+text entities.
+Implies <CODE>-r</CODE>.
+<DT>
+<CODE>-r</CODE>
+<DD>
+Raw output.
+Don't perform any conversion on RSs and REs when printing the entity.
+The entity would typically have the storage manager attribute
+<CODE>records=asis</CODE>.
+<DT>
+<CODE>-v</CODE>
+<DD>
+Print the version number.
+</DL>
+<P>
+<ADDRESS>
+James Clark<BR>
+jjc@jclark.com
+</ADDRESS>
+</BODY>
+</HTML>
diff --git a/doc/sx.htm b/doc/sx.htm
new file mode 100644 (file)
index 0000000..a8ebbfe
--- /dev/null
@@ -0,0 +1,170 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML Strict//EN">
+<HTML>
+<HEAD>
+<TITLE>SX</TITLE>
+</HEAD>
+<BODY>
+<H1>SX</H1>
+<H4>
+An SGML System Conforming to
+International Standard ISO 8879 --<BR>
+Standard Generalized Markup Language
+</H4>
+<H2>
+SYNOPSIS
+</H2>
+<P>
+<CODE>sx</CODE>
+[
+<CODE>-Cehilprvx</CODE>
+]
+[
+<CODE>-b<VAR>encoding</VAR></CODE>
+]
+[
+<CODE>-c<VAR>catalog_file</VAR></CODE>
+]
+[
+<CODE>-D<VAR>directory</VAR></CODE>
+]
+[
+<CODE>-f<VAR>file</VAR></CODE>
+]
+[
+<CODE>-w<VAR>warning_type</VAR></CODE>
+]
+[
+<CODE>-x<VAR>xml_output_option</VAR></CODE>
+]
+<CODE><VAR>sysid...</VAR></CODE>
+<H2>DESCRIPTION</H2>
+<P>
+SX converts SGML to XML.
+SX parses and validates the SGML document contained in
+<CODE><VAR>sysid...</VAR></CODE>
+and writes an equivalent XML document to the standard output.
+SX will warn about SGML constructs which have no XML equivalent.
+<P>
+The following options are available:
+<DL>
+<DT>
+<CODE>-b<VAR>encoding</VAR></CODE>
+<DD>
+Use <A HREF="charset.htm#encodings"><CODE><VAR>encoding</VAR></CODE></A> for output.
+By default SX uses UTF-8.
+<DT>
+<CODE>-c<VAR>file</VAR></CODE>
+<DD>
+Use the catalog entry file
+<CODE><VAR>file</VAR></CODE>.
+<DT>
+<CODE>-C</CODE>
+<DD>
+This has the same effect as in <A HREF="nsgmls.htm#optC">nsgmls</A>.
+<DT>
+<CODE>-D<VAR>directory</VAR></CODE>
+<DD>
+Search
+<CODE><VAR>directory</VAR></CODE>
+for files specified in system identifiers.
+This has the same effect as in <A HREF="nsgmls.htm#optD">nsgmls</A>.
+<DT>
+<CODE>-e</CODE>
+<DD>
+Describe open entities in error messages.
+<DT>
+<CODE>-f<VAR>file</VAR></CODE>
+<DD>
+Redirect errors to
+<CODE><VAR>file</VAR></CODE>.
+This is useful mainly with shells that do not support redirection
+of stderr.
+<DT>
+<CODE>-i<VAR>name</VAR></CODE>
+<DD>
+This has the same effect as in <A HREF="nsgmls.htm#opti">nsgmls</A>.
+<DT>
+<CODE>-v</CODE>
+<DD>
+Print the version number.
+<DT>
+<CODE>-w<VAR>type</VAR></CODE>
+<DD>
+Control warnings and errors according to
+<CODE><VAR>type</VAR></CODE>.
+This has the same effect as in <A HREF="nsgmls.htm#optw">nsgmls</A>.
+<DT>
+<CODE>-x<VAR>xml_output_option</VAR></CODE>
+<DD>
+Control the XML output according to the value of
+<CODE><VAR>xml_output_option</VAR></CODE> as follows:
+<DL>
+<DT>
+<CODE>no-nl-in-tag</CODE>
+<DD>
+Don't use newlines inside start-tags.
+Usually SX uses newlines inside start-tags so as to reduce the
+probability of excessively long lines.
+<DT>
+<CODE>id</CODE>
+<DD>
+Output attribute declarations for ID attributes.
+<DT>
+<CODE>notation</CODE>
+<DD>
+Output declarations for notations.
+<DT>
+<CODE>ndata</CODE>
+<DD>
+Output declarations for external data entities.
+XML requires these to be NDATA.
+SX will warn about CDATA and SDATA external data entities and
+output them as NDATA entities.
+<DT>
+<CODE>cdata</CODE>
+<DD>
+Use XML CDATA sections for CDATA marked sections and for elements with a
+declared content of CDATA.
+<DT>
+<CODE>comment</CODE>
+<DD>
+Output comment declarations.  Comment declarations in the DTD will not
+be output.
+<DT>
+<CODE>lower</CODE>
+<DD>
+Prefer lower case.
+Names that were subjected to upper-case substitution by SGML will be folded
+to lower case.
+This does not include reserved names; XML requires these to be in upper-case.
+<DT>
+<CODE>pi-escape</CODE>
+<DD>
+Escape <CODE>&amp;&lt;&gt;</CODE> in the contents of processing
+instructions using the <CODE>amp</CODE>, <CODE>lt</CODE> and
+<CODE>gt</CODE> entities.  This allows processing instructions to
+contain the string <CODE>&gt;?</CODE>, but requires that applications
+handle the escapes.
+<DT>
+<CODE>empty</CODE>
+<DD>
+Use the <CODE>&lt;<VAR>e</VAR>/&gt;</CODE> syntax for element types
+<CODE><VAR>e</VAR></CODE> declared as EMPTY.
+<DT>
+<CODE>attlist</CODE>
+<DD>
+Output a ATTLIST declaration for every element specifying the type of
+all attributes.  The default will always be <CODE>#IMPLIED</CODE>.
+</DL>
+<P>
+Multiple
+<CODE>-x</CODE>
+options are allowed.
+</DL>
+<P>
+<ADDRESS>
+James Clark<BR>
+jjc@jclark.com
+</ADDRESS>
+</BODY>
+</HTML>
diff --git a/doc/sysdecl.htm b/doc/sysdecl.htm
new file mode 100644 (file)
index 0000000..febd4e6
--- /dev/null
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML Strict//EN">
+<HTML>
+<HEAD>
+<TITLE>SP - System declaration</TITLE>
+</HEAD>
+<BODY>
+<H1>SP System Declaration</H1>
+<P>
+The system declaration for SP is as follows:
+<PRE>
+                       &lt;!SYSTEM "ISO 8879:1986"
+                               CHARSET
+BASESET  "ISO 646-1983//CHARSET
+         International Reference Version (IRV)//ESC 2/5 4/0"
+DESCSET  0 128 0
+CAPACITY PUBLIC  "ISO 8879:1986//CAPACITY Reference//EN"
+                              FEATURES
+MINIMIZE DATATAG NO        OMITTAG  YES     RANK     YES   SHORTTAG YES
+LINK     SIMPLE  YES 65535 IMPLICIT YES     EXPLICIT YES 1
+OTHER    CONCUR  NO        SUBDOC   YES 100 FORMAL   YES
+SCOPE    DOCUMENT
+SYNTAX   PUBLIC  "ISO 8879:1986//SYNTAX Reference//EN"
+SYNTAX   PUBLIC  "ISO 8879:1986//SYNTAX Core//EN"
+                              VALIDATE
+        GENERAL YES       MODEL    YES     EXCLUDE  YES   CAPACITY NO
+        NONSGML YES       SGML     YES     FORMAL   YES
+                                SDIF
+        PACK    NO        UNPACK   NO&gt;
+</PRE>
+<P>
+The limit for the SUBDOC parameter is memory dependent.
+<P>
+Any legal concrete syntax may be used.
+<P>
+<ADDRESS>
+James Clark<BR>
+jjc@jclark.com
+</ADDRESS>
+</BODY>
+</HTML>
diff --git a/doc/sysid.htm b/doc/sysid.htm
new file mode 100644 (file)
index 0000000..38dd141
--- /dev/null
@@ -0,0 +1,257 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML Strict//EN">
+<HTML>
+<HEAD>
+<TITLE>SP - System identifiers</TITLE>
+</HEAD>
+<BODY>
+<H1>System identifiers</H1>
+<P>
+There are two kinds of system identifier: formal system identifiers
+and simple system identifiers.  A system identifier that does not
+start with <SAMP>&lt;</SAMP> will always be interpreted as a simple
+system identifier.  A simple system identifier will always be
+interpreted either as a filename or as a URL.
+
+<H2>Formal system identifiers</H2>
+<P>
+Formal system identifiers are based on the
+System Identifier facility defined in ISO/IEC 10744 (HyTime) Technical
+Corrigendum 1, Annex D.
+A system identifier that is a formal system
+identifier consists of a sequence of one or more storage object
+specifications.  The objects specified by the storage object
+specifications are concatenated to form the entity.  A storage object
+specification consists of an SGML start-tag in the reference concrete
+syntax followed by character data content.  The generic identifier of
+the start-tag is the name of a storage manager.  The content is a
+storage object identifier which identifies the storage object in a
+manner dependent on the storage manager.  The start-tag can also
+specify attributes giving additional information about the storage
+object.  Numeric character references are recognized in storage object
+identifiers and attribute value literals in the start-tag.  Record
+ends are ignored in the storage object identifier as with SGML.  A
+system identifier will be interpreted as a formal system identifier if
+it starts with a <SAMP>&lt;</SAMP> followed by a storage manager name,
+followed by either <SAMP>></SAMP> or white-space; otherwise it will be
+interpreted as a simple system identifier.  A storage object
+identifier extends until the end of the system identifier or until the
+first occurrence of <SAMP>&lt;</SAMP> followed by a storage manager
+name, followed by either <SAMP>></SAMP> or white-space.
+<P>
+The following storage managers are available:
+<DL>
+<DT>
+<A NAME="osfile"><SAMP>osfile</SAMP></A>
+<DD>
+The storage object identifier is a filename.  If the filename is
+relative it is resolved using a base filename.  Normally the base
+filename is the name of the file in which the storage object
+identifier was specified, but this can be changed using the
+<SAMP>base</SAMP> attribute.  The filename will be searched for first
+in the directory of the base filename.  If it is not found there, then
+it will be searched for in directories specified with the
+<SAMP>-D</SAMP> option in the order in which they were specified on
+the command line, and then in the list of directories specified by the
+environment variable <SAMP>SGML_SEARCH_PATH</SAMP>.  The list
+is separated by colons under Unix and by semi-colons under MSDOS.
+<DT>
+<SAMP>osfd</SAMP>
+<DD>
+The storage object identifier is an integer specifying a file
+descriptor. Thus a system identifier of <SAMP>&lt;osfd>0</SAMP> will
+refer to the standard input.
+<DT>
+<SAMP>url</SAMP>
+<DD>
+The storage object identifier is a URL.  Only the <SAMP>http</SAMP>
+scheme is currently supported and not on all systems.
+<DT>
+<SAMP>neutral</SAMP>
+<DD>
+The storage manager is the storage manager of storage object in which
+the system identifier was specified (the <I>underlying storage
+manager</I>).  However if the underlying storage manager does not
+support named storage objects (ie it is <SAMP>osfd</SAMP>), then the
+storage manager will be <SAMP>osfile</SAMP>.  The storage object
+identifier is treated as a relative, hierarchical name separated by
+slashes (<SAMP>/</SAMP>) and will be transformed as appropriate for
+the underlying storage manager.
+<DT>
+<SAMP>literal</SAMP>
+<DD>
+The bit combinations of the storage object identifier are
+the contents of the storage object.
+</DL>
+<P>
+The following attributes are supported:
+<DL>
+<DT>
+<SAMP>records</SAMP>
+<DD>
+This describes how records are delimited in the storage object:
+<DL>
+<DT><SAMP>cr</SAMP>
+<DD>
+Records are terminated by a carriage return.
+<DT>
+<SAMP>lf</SAMP>
+<DD>
+Records are terminated by a line feed.
+<DT>
+<SAMP>crlf</SAMP>
+<DD>
+Records are terminated by a carriage return followed by a line feed.
+<DT>
+<SAMP>find</SAMP>
+<DD>
+Records are terminated by whichever of
+<SAMP>cr</SAMP>,
+<SAMP>lf</SAMP>
+or
+<SAMP>crlf</SAMP>
+is first encountered in the storage object.
+<DT>
+<SAMP>asis</SAMP>
+<DD>
+No recognition of records is performed.
+</DL>
+<P>
+The default is <SAMP>find</SAMP> except for NDATA entities for which
+the default is <SAMP>asis</SAMP>.  This attribute is not applicable to
+the <SAMP>literal</SAMP> storage manager.
+<P>
+When records are recognized in a storage object, a record start is
+inserted at the beginning of each record, and a record end at the end
+of each record.  If there is a partial record (a record that doesn't
+end with the record terminator) at the end of the entity, then a
+record start will be inserted before it but no record end will be
+inserted after it.
+<P>
+The attribute name and <SAMP>=</SAMP> can be omitted for this attribute.
+<DT>
+<SAMP>zapeof</SAMP>
+<DD>
+This specifies whether a Control-Z character that occurs as the final byte
+in the storage object should be stripped.
+The following values are allowed:
+<DL>
+<DT><SAMP>zapeof</SAMP>
+<DD>
+A final Control-Z should be stripped.
+<DT><SAMP>nozapeof</SAMP>
+<DD>
+A final Control-Z should not be stripped.
+</DL>
+<P>
+The default is <SAMP>zapeof</SAMP> except for NDATA entities, entities
+declared in storage objects with <SAMP>zapeof=nozapeof</SAMP> and
+storage objects with <SAMP>records=asis</SAMP>.  This attribute is not
+applicable to the <SAMP>literal</SAMP> storage manager.
+<P>
+The attribute name and <SAMP>=</SAMP> can be omitted for this
+attribute.
+<DT>
+<A NAME="encoding"><SAMP>encoding</SAMP></A>
+<DD>
+The encoding attribute specifies the encoding of the storage object.
+This attribute is used when the encoding is independent of the
+document character set.
+The value must be the <A HREF="charset.htm#encodings">name of an encoding</A>.
+This attribute is not applicable to the
+<SAMP>literal</SAMP> storage manager.
+<DT>
+<A NAME="bctf"><SAMP>bctf</SAMP></A>
+<DD>
+The BCTF attribute specifies that the encoding of the storage
+object.
+This attribute is used when the encoding is
+document character set dependent.
+The value must be the <A HREF="charset.htm#bctfs">name of a BCTF</A>.
+This attribute is not applicable to the
+<SAMP>literal</SAMP> storage manager.
+<DT>
+<SAMP>tracking</SAMP>
+<DD>
+This specifies whether line boundaries should be tracked for this
+object: a value of <SAMP>track</SAMP> specifies that they should; a
+value of <SAMP>notrack</SAMP> specifies that they should not.  The
+default value is <SAMP>track</SAMP>.  Keeping track of where line
+boundaries occur in a storage object requires approximately one byte
+of storage per line and it may be desirable to disable this for very
+large storage objects.
+<P>
+The attribute name and
+<SAMP>=</SAMP>
+can be omitted for this attribute.
+<DT>
+<SAMP>base</SAMP>
+<DD>
+When the storage object identifier specified in the content of the
+storage object specification is relative, this specifies the base
+storage object identifier relative to which that storage object
+identifier should be resolved.
+When not specified a storage object identifier is interpreted
+relative to the storage object in which it is specified,
+provided that this has the same storage manager.
+This applies both to system identifiers specified in SGML
+documents and to system identifiers specified in the catalog entry
+files.
+<DT>
+<SAMP>smcrd</SAMP>
+<DD>
+The value is a single character that will be recognized in storage
+object identifiers (both in the content of storage object
+specifications and in the value of <SAMP>base</SAMP> attributes) as a
+storage manager character reference delimiter when followed by a
+digit.  A storage manager character reference is like an SGML numeric
+character reference except that the number is interpreted as a
+character number in the inherent character set of the storage manager
+rather than the document character set.  The default is for no
+character to be recognized as a storage manager character reference
+delimiter.  Numeric character references cannot be used to prevent
+recognition of storage manager character reference delimiters.
+<DT>
+<SAMP>fold</SAMP>
+<DD>
+This applies only to the <SAMP>neutral</SAMP> storage manager.  It
+specifies whether the storage object identifier should be folded to
+the customary case of the underlying storage manager if storage object
+identifiers for the underlying storage manager are case sensitive.
+The following values are allowed:
+<DL>
+<DT><SAMP>fold</SAMP>
+<DD>
+The storage object identifier will be folded.
+<DT>
+<SAMP>nofold</SAMP>
+<DD>
+The storage object identifier will not be folded.
+</DL>
+<P>
+The default value is <SAMP>fold</SAMP>.  The attribute name and
+<SAMP>=</SAMP> can be omitted for this attribute.
+<P>
+For example, on Unix filenames are case-sensitive and the customary
+case is lower-case.  So if the underlying storage manager were
+<SAMP>osfile</SAMP> and the system was a Unix system, then
+<SAMP>&lt;neutral>FOO.SGM</SAMP> would be equivalent to
+<SAMP>&lt;osfile>foo.sgm</SAMP>.
+</DL>
+<H2>Simple system identfiers</H2>
+<P>
+A simple system identifier is interpreted as a storage object
+identifier with a storage manager that depends on where the system
+identifier was specified: if it was specified in a storage object
+whose storage manager was <SAMP>url</SAMP> or if the system identifier
+looks like an absolute URL in a supported scheme, the storage manager
+will be <SAMP>url</SAMP>; otherwise the storage manager will be
+<SAMP>osfile</SAMP>.  The storage manager attributes are defaulted as
+for a formal system identifier.  Numeric character references are not
+recognized in simple system identifiers.
+<P>
+<ADDRESS>
+James Clark<BR>
+jjc@jclark.com
+</ADDRESS>
+</BODY>
+</HTML>
diff --git a/doc/xml.htm b/doc/xml.htm
new file mode 100644 (file)
index 0000000..58c9052
--- /dev/null
@@ -0,0 +1,81 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML Strict//EN">
+<HTML>
+<HEAD>
+<TITLE>SP - XML support</TITLE>
+</HEAD>
+<BODY>
+<H1>XML support</H1>
+<H2>Using SP to parse XML</H2>
+<P>
+To enable SP's support for <A
+HREF="http://www.w3.org/TR/1998/REC-xml-19980210">XML 1.0</A>:
+<UL>
+<LI>
+Set the <SAMP>SP_CHARSET_FIXED</SAMP> environment variable to <SAMP>YES</SAMP>.
+<LI>
+Set the <SAMP>SP_ENCODING</SAMP> environment variable to <SAMP>XML</SAMP>.
+<LI>
+Set the <SAMP>SGML_CATALOG_FILES</SAMP> environment variable to
+point to the file <SAMP>pubtext/xml.soc</SAMP>.
+<LI>
+Use the <SAMP>-wxml</SAMP> option.
+<LI>
+If the document is not supposed to be valid, use <SAMP>-wno-valid</SAMP>
+option.
+</UL>
+
+<H2>Limitations</H2>
+<P>
+SP does not enforce the following XML constraints:
+<UL>
+<LI>
+XML constrains processing instructions
+with a target matching <CODE>[Xx][Mm][Ll]</CODE>,
+both in terms of where they can occur and their content.
+<LI>
+XML does not allow a parameter separator that is adjacent to a
+delimiter to be omitted.
+<LI>
+XML has constraints on the use of <CODE>&amp;</CODE> in parameter
+literals.  In SGML terms, XML says that the <b>ero</b> delimiter is
+recognized in a parameter literal, and that it must be followed by an
+entity reference, but the entity reference is not expanded.
+</UL>
+<P>
+Line ends are normalized using SGML conventions to a CR/LF character
+pair rather than using the XML convention of a single LF character.
+<P>
+There is no support for characters outside the basic multilingual plane
+(ie those with scalar values greater than U+FFFF).
+<P>
+SP does not enforce XML's rules on not continuing normal processing
+after an error.  Applications can enforce these if they choose.
+
+<H2>Web SGML Adaptations Annex</H2>
+<P>
+SP's support for SGML is based on <A
+HREF="http://www.ornl.gov/sgml/wg8/document/1955.htm">Annex K of ISO
+8879</A> (the Web SGML Adaptations Annex).
+The following features of Annex K are not yet implemented:
+<UL>
+<LI>
+Checking of <SAMP>ENTITIES REF</SAMP> assertions
+<LI>
+<SAMP>#IMPLIED</SAMP> document type name
+<LI>
+Implying definitions of notations and entities
+(<CODE>IMPLYDEF ENTITY YES</CODE> and <CODE>NOTATION YES</CODE>)
+<LI>
+SGML declarations on subdocuments
+<LI>
+<SAMP>DATA</SAMP> declared value
+<LI>
+URN feature
+</UL>
+<P>
+<ADDRESS>
+James Clark<BR>
+jjc@jclark.com
+</ADDRESS>
+</BODY>
+</HTML>
diff --git a/docsrc/.cvsignore b/docsrc/.cvsignore
new file mode 100644 (file)
index 0000000..61c64fc
--- /dev/null
@@ -0,0 +1,12 @@
+onsgmls.1
+openjade.1
+osgmlnorm.1
+ospam.1
+osx.1
+ospent.1
+releasenotes.pdf
+releasenotes.html
+releasenotes.ps
+releasenotes.log
+releasenotes.aux
+releasenotes.out
diff --git a/docsrc/Makefile b/docsrc/Makefile
new file mode 100644 (file)
index 0000000..2a04640
--- /dev/null
@@ -0,0 +1,47 @@
+MAX_TEX_RECURSION=4
+JADE=openjade
+JADETEX=jadetex
+PDFJADETEX=pdfjadetex
+XMLDECL=/usr/share/sgml/xml.dcl
+
+MAN_PAGES=openjade.1
+
+all: $(MAN_PAGES) releasenotes.pdf releasenotes.html releasenotes.ps
+
+%.tex: %.xml %.dsl
+       $(JADE) -v -t tex -V tex-backend -d $*.dsl#print $(XMLDECL) $*.xml
+
+%.pdf: %.tex
+       $(PDFJADETEX) $<
+       if ! cmp $(shell basename $< .tex).aux prior.aux 2>/dev/null && \
+               expr $(MAKELEVEL) '<' $(MAX_TEX_RECURSION); then \
+               cp -pf $(shell basename $< .tex).aux prior.aux ; \
+               rm -f $@ ; \
+               $(MAKE) $@ ; \
+       fi
+       rm -f prior.aux
+
+%.dvi: %.tex
+       $(JADETEX) $<
+       if ! cmp $(shell basename $< .tex).aux prior.aux 2>/dev/null && \
+               expr $(MAKELEVEL) '<' $(MAX_TEX_RECURSION); then \
+               cp -pf $(shell basename $< .tex).aux prior.aux ; \
+               rm -f $@ ; \
+               $(MAKE) $@ ; \
+       fi
+       rm -f prior.aux
+
+%.ps: %.pdf
+       acroread -toPostScript -pairs $< $@
+
+%.html: %.xml %.dsl
+       $(JADE) -v -t sgml -i html -V nochunks -V rootchunk -V "%root-filename%=$*" -V "%html-ext%=.html" -d $*.dsl#html $(XMLDECL) $*.xml
+
+%.1: %.xml
+       xmlto man -x /usr/share/xmlto/xsl/db2man/docbook.xsl $*.xml
+   
+clean:
+       -rm -f *.out *.aux *.log *.dvi *.tex
+
+realclean: clean
+       -rm -f *.html *.pdf $(MAN_PAGES) *.ps
diff --git a/docsrc/jade.1 b/docsrc/jade.1
new file mode 100644 (file)
index 0000000..b91d339
--- /dev/null
@@ -0,0 +1 @@
+.so man1/openjade.1
diff --git a/docsrc/jadetex.cfg b/docsrc/jadetex.cfg
new file mode 100644 (file)
index 0000000..7593fab
--- /dev/null
@@ -0,0 +1,2 @@
+\hypersetup{pdfpagemode=None,  pdfauthor=OpenJade Project,  colorlinks=false,  linkcolor=black,  pdfstartview=FitH}
+\def\Gin@extensions{.pdf,.png,.jpg,.mps,.tif}
diff --git a/docsrc/logo.png b/docsrc/logo.png
new file mode 100644 (file)
index 0000000..378fb8f
Binary files /dev/null and b/docsrc/logo.png differ
diff --git a/docsrc/nsgmls.1 b/docsrc/nsgmls.1
new file mode 100644 (file)
index 0000000..5e31861
--- /dev/null
@@ -0,0 +1 @@
+.so man1/onsgmls.1
diff --git a/docsrc/openjade.1 b/docsrc/openjade.1
new file mode 100644 (file)
index 0000000..70438f6
--- /dev/null
@@ -0,0 +1,402 @@
+.\"Generated by db2man.xsl. Don't modify this, modify the source.
+.de Sh \" Subsection
+.br
+.if t .Sp
+.ne 5
+.PP
+\fB\\$1\fR
+.PP
+..
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Ip \" List item
+.br
+.ie \\n(.$>=3 .ne \\$3
+.el .ne 3
+.IP "\\$1" \\$2
+..
+.TH "OPENJADE" 1 "January 2002" "OpenJade" ""
+.SH NAME
+openjade \- apply a DSSSL stylesheet to an SGML or XML document
+.SH "SYNOPSIS"
+
+.nf
+\fBopenjade\fR [\fB-vCegG2s\fR] [\fB-b \fIencoding\fR\fR] [\fB-f \fIerror_file\fR\fR]
+         [\fB-c \fIcatalog_sysid\fR\fR] [\fB-D \fIdir\fR\fR] [\fB-a \fIlink_type\fR\fR]
+         [\fB-A \fIarch\fR\fR] [\fB-E \fImax_errors\fR\fR] [\fB-i \fIentity\fR\fR]
+         [\fB-w \fIwarning_type\fR\fR] [\fB-d \fIdsssl_spec\fR\fR] [\fB-V \fIvariable\fB=\fIvalue\fR\fR\fR\fR]
+         [\fB-t \fIoutput_type\fR\fR] [\fB-o \fIoutput_file\fR\fR] [\fB\fIsysid\fR\fR...]
+        
+.fi
+
+.SH "DESCRIPTION"
+
+.PP
+\fBopenjade\fR is an implementation of the ISO/IEC 10179:1996 standard DSSSL language. The DSSSL engine receives as input an SGML or XML document and transforms it into formats like:
+
+.PP
+* XML representation of the flow object tree.
+
+.PP
+* RTF format that can be rendered and printed with Microsoft's free Word Viewer 97
+
+.PP
+* TeX format
+
+.PP
+* MIF format that can be rendered and printed with Framemaker
+
+.PP
+* SGML or XML format. This is used in conjunction with non-standard flow object classes to generate SGML, thus allowing \fBopenjade\fR to be used for SGML/XML transformations.
+
+.PP
+The system identifier of the document to be processed is specified as an argument to \fBopenjade\fR. If this is omitted, standard input will be read.
+
+.PP
+\fBopenjade\fR determines the system identifier for the DSSSL specification as follows:
+
+.PP
+1. If the -d option is specified, it will use the argument as the system identifier.
+
+.PP
+2. Otherwise, it will look for processing instructions in the prolog of the document. Two kinds of processing instruction are recognized:
+
+.PP
+<?stylesheet href="sysid" type="text/dsssl">
+
+.PP
+The system data of the processing instruction is parsed like an SGML start-tag. It will be parsed using the reference concrete syntax whatever the actual concrete syntax of the document. The name that starts the processing instruction can be either stylesheet, xml-stylesheet or xml:stylesheet. The processing instruction will be ignored unless the value of the type attribute is one of text/dsssl, text/x-dsssl, application/dsssl, or application/x-dsssl. The value of href attribute is the system identifier of the DSSSL specification.
+
+.PP
+<?dsssl sysid>
+
+.PP
+The system identifier is the portion of the system data of the processing instruction following the initial name and any whitespace.
+
+.PP
+Although the processing instruction is only recognized in the prolog, it need not occur in the document entity. For example, it could occur in a DTD. The system identifier will be interpreted relative to where the the processing instruction occurs.
+
+.PP
+3. Otherwise, it will use the system identifier of the document with any extension changed to .dsl.
+
+.PP
+A DSSSL specification document can contain more than one style-specification. If the system identifier of the DSSSL specification is followed by #id, then \fBopenjade\fR will use the style-specification whose unique identifier is id. This is allowed both with the \fB-d\fR option and with the processing instructions.
+
+.PP
+The DSSSL specification must be an SGML document conforming to the DSSSL architecture. For an example, see \fIdsssl/demo.dsl\fR.
+
+.PP
+\fBopenjade\fR supports the following options in addition to the normal OpenSP (see \fBonsgmls(1)\fR) options (note that all options are case-sensitive, ie \fB-g\fR and \fB-G\fR are different options):
+
+.TP
+\fB-d \fIdsssl_spec\fR\fR
+This specifies that dsssl_spec is the system identifier of the DSSSL specification to be used.
+
+.TP
+\fB-G\fR
+Debug mode. When an error occurs in the evaluation of an expression, \fBopenjade\fR will display a stack trace. Note that this disables tail-call optimization.
+
+.TP
+\fB-c \fIfilename\fR\fR
+The filename arguments specify catalog files rather than the document entity. The document entity is specified by the first DOCUMENT entry in the catalog files.
+
+.TP
+\fB-s\fR
+Strict compliance mode. Currently the only effect is that jade doesn't use any predefined character names, sdata-entity mappings or name-characters. This is useful for checking that your stylesheet is portable to other DSSSL implementations and that it is strictly compliant to the DSSSL specifications.
+
+.TP
+\fB-t \fIoutput_type\fR\fR
+\fIoutput_type\fR specifies the type of output as follows:
+
+\fBfot \fR An XML representation of the flow object tree
+
+\fBrtf\fR \fBrtf-95 \fR RTF (used for SGML/XML to RTF transformations) Microsoft's Rich Text Format. rtf-95 produces output optimized for Word 95 rather than Word 97.
+
+\fBtex\fR TeX (used for SGML/XML to TeX transformations)
+
+\fBsgml\fR \fBsgml-raw\fR SGML (used for SGML/XML to SGML transformations). sgml-raw doesn't emit linebreaks in tags.
+
+\fBxml\fR \fBxml-raw\fR XML (used for SGML/XML to XML transformations). xml-raw doesn't emit linebreaks in tags.
+
+\fBhtml \fR HTML (used for SGML/XML to HTML transformations)
+
+\fBmif\fR MIF (used for SGML/XML to MIF transformations)
+
+.TP
+\fB-o \fIoutput_file\fR\fR
+Write output to \fIoutput_file\fR instead of the default. The default filename is the name of the last input file with its extension replaced by the name of the type of output. If there is no input filename, then the extension is added onto jade-out.
+
+.TP
+\fB-V \fIvariable\fR\fR
+This is equivalent to doing (define variable #t) except that this definition will take priority over any definition of variable in a style-sheet.
+
+.TP
+\fB-V \fIvariable=value\fR\fR
+This is equivalent to doing (define \fIvariable\fR "\fIvalue\fR") except that this definition will take priority over any definition of variable in a style-sheet.
+
+.TP
+\fB-V (define \fIvariable\fR value)\fR
+This is equivalent to doing (define variable value) except that this definition will take priority over any definition of variable in a style-sheet. Note that you will probably have to use some escaping mechanism for the spaces to get the entire scheme expression parsed as one cmdline argument.
+
+.TP
+\fB-w\fItype\fR\fR
+Control warnings and errors. Multiple \fB-w\fR options are allowed. The following values of type enable warnings:
+
+\fBxml\fR Warn about constructs that are not allowed by XML.
+
+\fBmixed\fR Warn about mixed content models that do not allow #pcdata anywhere.
+
+\fBsgmldecl\fR Warn about various dubious constructions in the SGML declaration.
+
+\fBshould\fR Warn about various recommendations made in ISO 8879 that the document does not comply with. (Recommendations are expressed with ``should'', as distinct from requirements which are usually expressed with ``shall''.)
+
+\fBdefault\fR Warn about defaulted references.
+
+\fBduplicate\fR Warn about duplicate entity declarations.
+
+\fBundefined\fR Warn about undefined elements: elements used in the DTD but not defined.
+
+\fBunclosed\fR Warn about unclosed start and end-tags.
+
+\fBempty\fR Warn about empty start and end-tags.
+
+\fBnet\fR Warn about net-enabling start-tags and null end-tags.
+
+\fBmin-tag\fR Warn about minimized start and end-tags. Equivalent to combination of unclosed, empty and net warnings.
+
+\fBunused-map\fR Warn about unused short reference maps: maps that are declared with a short reference mapping declaration but never used in a short reference use declaration in the DTD.
+
+\fBunused-param\fR Warn about parameter entities that are defined but not used in a DTD. Unused internal parameter entities whose text is INCLUDE or IGNORE won't get the warning.
+
+\fBnotation-sysid\fR Warn about notations for which no system identifier could be generated.
+
+\fBall\fR Warn about conditions that should usually be avoided (in the opinion of the author). Equivalent to: mixed, should, default, undefined, sgmldecl, unused-map, unused-param, empty and unclosed.
+
+A warning can be disabled by using its name prefixed with no-. Thus \fB-wall\fR \fB-wno-duplicate\fR will enable all warnings except those about duplicate entity declarations.
+
+The following values for \fIwarning_type\fR disable errors:
+
+\fBno-idref\fR Do not give an error for an ID reference value which no element has as its ID. The effect will be as if each attribute declared as an ID reference value had been declared as a name.
+
+\fBno-significant\fR Do not give an error when a character that is not a significant character in the reference concrete syntax occurs in a literal in the SGML declaration. This may be useful in conjunction with certain buggy test suites.
+
+\fBno-valid\fR Do not require the document to be type-valid. This has the effect of changing the SGML declaration to specify VALIDITY NOASSERT and IMPLYDEF ATTLIST YES ELEMENT YES. An option of \fB-wvalid\fR has the effect of changing the SGML declaration to specify VALIDITY TYPE and IMPLYDEF ATTLIST NO ELEMENT NO. If neither \fB-wvalid\fR nor \fB-wno-valid\fR are specified, then the VALIDITY and IMPLYDEF specified in the SGML declaration will be used.
+
+.SH "ENVIRONMENT"
+
+.PP
+OpenJade ignores the SP_CHARSET_FIXED and SP_SYSTEM_CHARSET environment variables and always uses Unicode as its internal character set, as if SP_CHARSET_FIXED was 1 and SP_SYSTEM_CHARSET was unset. Thus only the SP_ENCODING environment variable is relevant to OpenJade's handling of character sets.
+
+.SH "OPENJADE EXTENSIONS"
+
+.PP
+The following external procedures are available. These external procedures are defined by a prototype in the same manner as in the standard. To use one of these external procedures, you must make use of the standard external-procedure procedure, using a public identifier of "UNREGISTERED::James Clark//Procedure::name" where name is the name given here, typically by including the following in the DSSSL specification:
+
+.PP
+(define name (external-procedure "UNREGISTERED::James Clark//Procedure::name"))
+
+.PP
+Note that external-procedure returns #f if it doesn't know about the specified public identifier. You can use this to enable your DSSSL specifications to work gracefully with other implementations which do not support these extensions.
+
+.PP
+For external procedures added by the OpenJade team, use a public identifier of the form "UNREGISTERED::OpenJade//Procedure::name".
+
+.PP
+An easy way to get access to all external procedures is to use the style specification dsssl/extensions.dsl#procedures. The file dsssl/extensions.dsl also contains style specifications which make the nonstandard flow object classes and inherited characteristics supported by the backends available in a convenient way.
+
+.PP
+\fBDebugging\fR
+
+.PP
+(debug obj)
+
+.PP
+Generates a message including the value of obj and then returns obj.
+
+.PP
+\fBSimple-page-sequence header/footer control\fR
+
+.PP
+(if-first-page sosofo1 sosofo2)
+
+.PP
+This can be used only in the specification of the value of one of the header/footer characteristics of simple-page-sequence. It returns a sosofo that will display as sosofo1 if the page is the first page of the simple-page-sequence and as sosofo2 otherwise.
+
+.PP
+(if-front-page sosofo1 sosofo2)
+
+.PP
+This can be used only in the specification of the value of one of the header/footer characteristics of simple-page-sequence. It returns a sosofo that will display as sosofo1 if the page is a front (ie recto, odd-numbered) page and as sosofo2 if it is a back (ie verso, even-numbered) page.
+
+.PP
+\fBNumbering\fR
+
+.PP
+(all-element-number)
+
+.PP
+(all-element-number osnl)
+
+.PP
+This is the same as element-number except it counts elements with any generic identifier. If osnl is not an element returns #f, otherwise returns 1 plus the number of elements that started before osnl. This provides an efficient way of creating a unique identifier for any element in a document.
+
+.PP
+\fBExternal entity access\fR
+
+.PP
+(read-entity string)
+
+.PP
+This returns a string containing the contents of the external entity with system identifier string. This should be used only for textual entities (CDATA and SDATA), and not for binary entities (NDATA).
+
+.PP
+\fBPOSIX locale access\fR
+
+.PP
+(language lang country)
+
+.PP
+This procedure returns an object of type language, if the system supports the specified language. lang is a string or symbol giving the two letter language code. country is a string or symbol giving the two letter country code.
+
+.PP
+This procedure uses POSIX locales. It is an OpenJade addition. It is not supported on all operating systems.
+
+.PP
+\fBExtended standard procedures\fR
+
+.PP
+(sgml-parse sysid #!key active: parent: architecture:)
+
+.PP
+This allows you to specify an SGML architecture with respect to which the document should be parsed. It is an OpenJade addition.
+
+.PP
+(expt q k)
+
+.PP
+This allows you to raise a quantity to an integral power. It is an OpenJade addition.
+
+.SH "LIMITATIONS"
+
+.PP
+This section describes the limitations of the front-end (the general-purpose DSSSL engine); each backend also has its own limitations.
+
+.PP
+\fBopenjade\fR doesn't allow internal definitions at the beginning of bodies and the (test => recipient) variant of cond clauses.
+
+.PP
+\fBopenjade\fR supports only a single, fixed grove plan which comprises the following modules:
+
+.PP
+* baseabs
+
+.PP
+* prlgabs0
+
+.PP
+* prlgabs1
+
+.PP
+* instabs
+
+.PP
+* basesds0
+
+.PP
+* instsds0
+
+.PP
+* subdcabs
+
+.PP
+It doesn't implement the following parts of SDQL: HyTime support, auxiliary parsing, node regular expressions.
+
+.PP
+Query rules, sosofo synchronization, indirect sosofos, reference values, decoration areas and font properties are not supported.
+
+.PP
+Note that only inherited characteristics that are applicable to some supported flow object can be specified.
+
+.PP
+\fBCharacter/glyph handling\fR
+
+.PP
+It only supports a single pre-defined character repertoire. A character name of the form U-XXXX where XXXX are four upper-case hexadecimal digits, is recognized as referring to the Unicode character with that code. For many characters, it is also possible to use the ISO/IEC 10646 name in lower-case with words separated by hyphens.
+
+.PP
+Some common SDATA entity names from the ISO entity sets are recognized and mapped to characters. In addition an SDATA entity name of the form U-XXXX, where XXXX are four upper-case hexadecimal digits, is mapped to the Unicode character with that code.
+
+.PP
+OpenJade now supports the standard-chars, map-sdata-entity, add-name-chars, add-separator-chars and char-repertoire declaration element forms, allowing a style-sheet to define additional character names, sdata entity mappings, name characters (i.e. characters allowed in identifiers) and separator characters. Currently the only recognized character repertoire is the built-in repertoire. It has the public identifier "UNREGISTERED::OpenJade//Character Repertoire::OpenJade".
+
+.PP
+\fBValidation\fR
+
+.PP
+Several things that it would be desirable to have checked aren't checked:
+
+.PP
+* When the allowed value of an inherited characteristic is a symbol, OpenJade checks only that the value is a symbol that is allowed as the value of some characteristic; #t and #f are treated as a special kind of symbol in this case.
+
+.PP
+* OpenJade doesn't check whether a flow object is occurring in a context where it is allowed.
+
+.PP
+* OpenJade does not prevent flow objects being attached to the principal port of a flow object when the flow object shouldn't have a principal port.
+
+.PP
+* Most type-checking is done at run-time not compile-time.
+
+.PP
+* OpenJade does not check for non-inherited characteristics that are required to be specified.
+
+.PP
+* It doesn't check that optional features that have been used were declared in the features form.
+
+.PP
+\fBOther limitations\fR
+
+.PP
+The following primitives are just stubs:
+
+.PP
+\fBchar-script-case\fR Always returns last argument.
+
+.PP
+\fBaddress-visited?\fR Always returns #f.
+
+.SH "EXAMPLES"
+
+.PP
+Given an SGML file \fBfile.sgml\fR, use the stylesheet \fBfile.dsl\fR and publish as an rtf file.
+
+.PP
+openjade -t rtf file.sgml
+
+.PP
+Using a different stylesheet:
+
+.PP
+openjade -t rtf -d docbook.dsl file.sgml
+
+.PP
+Using the \fBprint\fR style specification contained within the stylesheet
+
+.PP
+openjade -t rtf -d docbook.dsl#print file.sgml
+
+.PP
+And use the html specification within the style sheet to convert to html
+
+.PP
+openjade -t sgml -i html -d docbook.dsl#html file.sgml
+
+.SH "SEE ALSO"
+
+.PP
+\fBonsgmls(1)\fR
+
+.SH AUTHORS
+James Clark, Ian Castle <ian.castle@looksystems.co.uk>.
diff --git a/docsrc/openjade.xml b/docsrc/openjade.xml
new file mode 100644 (file)
index 0000000..623afdc
--- /dev/null
@@ -0,0 +1,533 @@
+<?xml version='1.0'?>
+<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
+ "/usr/share/sgml/docbook/xml-dtd-4.1.2/docbookx.dtd">
+<article>
+  <articleinfo>
+    <title>openjade</title>
+    <author>
+      <firstname>James</firstname>
+      <surname>Clark</surname>
+    </author>
+    <author>
+      <firstname>Ian</firstname>
+      <surname>Castle</surname>
+      <affiliation><email>ian.castle@looksystems.co.uk</email></affiliation>
+    </author>
+   <copyright> 
+     <year>2002</year>
+     <holder>OpenJade Project</holder>
+   </copyright>
+ </articleinfo>
+
+ <section>
+   <title>Reference</title>
+  
+   <refentry>
+     <refentryinfo>
+          <date>January 2002</date>
+          <productname>OpenJade</productname>
+     </refentryinfo>
+     <refmeta>
+       <refentrytitle>openjade</refentrytitle>
+       <manvolnum>1</manvolnum>
+     </refmeta>
+
+     <refnamediv>
+       <refname>openjade</refname>
+       <refpurpose>apply a DSSSL stylesheet to an SGML or XML document</refpurpose>
+     </refnamediv>
+
+     <refsynopsisdiv>
+       <cmdsynopsis>
+         <command>openjade</command>
+         <arg choice="opt"><option>-vCegG2s</option></arg>
+         <arg choice="opt"><option>-b <replaceable>encoding</replaceable></option></arg>
+         <arg choice="opt"><option>-f <replaceable>error_file</replaceable></option></arg>
+         <arg choice="opt"><option>-c <replaceable>catalog_sysid</replaceable></option></arg>
+         <arg choice="opt"><option>-D <replaceable>dir</replaceable></option></arg>
+         <arg choice="opt"><option>-a <replaceable>link_type</replaceable></option></arg>
+         <arg choice="opt"><option>-A <replaceable>arch</replaceable></option></arg>
+         <arg choice="opt"><option>-E <replaceable>max_errors</replaceable></option></arg>
+         <arg choice="opt"><option>-i <replaceable>entity</replaceable></option></arg>
+         <arg choice="opt"><option>-w <replaceable>warning_type</replaceable></option></arg>
+         <arg choice="opt"><option>-d <replaceable>dsssl_spec</replaceable></option></arg>
+         <arg choice="opt"><option>-V <replaceable>variable<option>=<replaceable>value</replaceable></option></replaceable></option></arg>
+         <arg choice="opt"><option>-t <replaceable>output_type</replaceable></option></arg>
+         <arg choice="opt"><option>-o <replaceable>output_file</replaceable></option></arg>
+         <arg choice="opt" rep="repeat"><option><replaceable>sysid</replaceable></option></arg>
+       </cmdsynopsis>
+     </refsynopsisdiv>
+<!--
+openjade [-vCegG2s] [-b encoding] [-f error_file] [-c catalog_sysid] [-D dir] [-a link_type] [-A arch] [-E max_errors] [-i entity] [-w warning_type] [-d dsssl_spec] [-V variable[=value]] [-t (fot|rtf|tex|mif|sgml|xml)] [-o output_file] sysid...
+-->
+   
+     <refsect1>
+       <title>Description</title>
+  
+<para>
+     <command>openjade</command> is an implementation of the ISO/IEC 10179:1996 standard DSSSL   
+     language.  The DSSSL engine receives as input an SGML or XML document and transforms it into formats like:</para>
+<para>* XML representation of the flow object tree.</para>
+       <para>* RTF format that can be rendered and printed with Microsoft's free    Word Viewer 97</para>
+       <para>* TeX format</para>
+       <para>* MIF format that can be rendered and printed with Framemaker</para>
+       <para>* SGML or XML format. This is used in conjunction with non-standard    
+         flow object classes to generate SGML, thus allowing <command>openjade</command> to be   
+         used for SGML/XML transformations.                                   </para>
+                                                                              
+     <para>The system identifier of the document to be processed is specified as an 
+     argument to <command>openjade</command>. If this is omitted, standard input will be read.   </para>
+                                                                              
+     <para><command>openjade</command> determines the system identifier for the DSSSL specification as 
+     follows: </para>
+                                                                              
+     <para>1. If the -d option is specified, it will use the argument as the       
+         system identifier.                                                   </para>
+     <para>2. Otherwise, it will look for processing instructions in the prolog of 
+         the document. Two kinds of processing instruction are recognized:    </para>
+<para>
+              &lt;?stylesheet href="sysid" type="text/dsssl"&gt;                    </para>
+<para>                 The system data of the processing instruction is parsed like 
+                 an SGML start-tag. It will be parsed using the reference     
+                 concrete syntax whatever the actual concrete syntax of the   
+                 document. The name that starts the processing instruction    
+                 can be either stylesheet, xml-stylesheet or xml:stylesheet.  
+                 The processing instruction will be ignored unless the value  
+                 of the type attribute is one of text/dsssl, text/x-dsssl,    
+                 application/dsssl, or application/x-dsssl. The value of href 
+                 attribute is the system identifier of the DSSSL              
+                 specification.                                               </para>
+<para>
+              &lt;?dsssl sysid&gt;                                                  </para>
+<para>                 The system identifier is the portion of the system data of   
+                 the processing instruction following the initial name and    
+                 any whitespace.                                              </para>
+                                                                              
+<para>         Although the processing instruction is only recognized in the        
+         prolog, it need not occur in the document entity. For example, it    
+         could occur in a DTD. The system identifier will be interpreted      
+         relative to where the the processing instruction occurs.             </para>
+                                                                              
+<para>     3. Otherwise, it will use the system identifier of the document with    
+         any extension changed to .dsl.                                       </para>
+                                                                              
+<para>     A DSSSL specification document can contain more than one                 
+     style-specification. If the system identifier of the DSSSL specification 
+     is followed by #id, then <command>openjade</command> will use the style-specification whose 
+     unique identifier is id. This is allowed both with the <option>-d</option> option and     
+     with the processing instructions.                                        </para>
+                                                                              
+<para>     The DSSSL specification must be an SGML document conforming to the DSSSL 
+     architecture. For an example, see <filename>dsssl/demo.dsl</filename>.                        </para>
+                                                                              
+     <para><command>openjade</command> supports the following options in addition to the normal OpenSP (see <command>onsgmls(1)</command>)    
+     options (note that all options are case-sensitive, ie <option>-g</option> and <option>-G</option> are      
+     different options):</para>
+
+     <variablelist>
+       <varlistentry>
+         <term><option>-d <replaceable>dsssl_spec</replaceable></option></term>
+         <listitem>
+<para>        This specifies that dsssl_spec is the system identifier of the DSSSL  
+        specification to be used.                                             </para>
+         </listitem>
+       </varlistentry>
+
+       <varlistentry>
+         <term><option>-G</option></term>
+         <listitem>
+        <para>Debug mode. When an error occurs in the evaluation of an expression,  
+        <command>openjade</command> will display a stack trace. Note that this disables          
+        tail-call optimization.</para>
+         </listitem>
+       </varlistentry>
+       <varlistentry>
+         <term><option>-c <replaceable>filename</replaceable></option></term>
+         <listitem>
+           <para>The filename arguments specify catalog files rather than the document 
+        entity. The document entity is specified by the first DOCUMENT entry  
+        in the catalog files.                                                 </para>
+         </listitem>
+       </varlistentry>
+
+       <varlistentry>
+         <term><option>-s</option></term>
+         <listitem>
+          <para>
+        Strict compliance mode. Currently the only effect is that jade        
+        doesn't use any predefined character names, sdata-entity mappings or  
+        name-characters. This is useful for checking that your stylesheet is  
+        portable to other DSSSL implementations and that it is strictly       
+        compliant to the DSSSL specifications.                                </para>
+         </listitem>
+       </varlistentry>
+
+       <varlistentry>
+         <term><option>-t <replaceable>output_type</replaceable></option></term>
+         <listitem>
+        <para><replaceable>output_type</replaceable> specifies the type of output as follows:                  </para>
+             <para><option>fot                                                              </option>
+                An XML representation of the flow object tree                 </para>
+<para>             <option>rtf</option> <option>rtf-95                                                       </option>
+                RTF (used for SGML/XML to RTF transformations)                
+                Microsoft's Rich Text Format. rtf-95 produces output          
+                optimized for Word 95 rather than Word 97.</para>
+<para><option>tex</option>
+                TeX (used for SGML/XML to TeX transformations)</para>
+<para>             <option>sgml</option> <option>sgml-raw</option>
+                SGML (used for SGML/XML to SGML transformations). sgml-raw    
+                doesn't emit linebreaks in tags.                              </para>
+ <para>            <option>xml</option> <option>xml-raw</option>
+                XML (used for SGML/XML to XML transformations). xml-raw       
+                doesn't emit linebreaks in tags.</para>
+             <para><option>html                                                             </option>
+                HTML (used for SGML/XML to HTML transformations)</para>
+<para>             <option>mif</option>
+                MIF (used for SGML/XML to MIF transformations)                </para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><option>-o <replaceable>output_file</replaceable></option></term>
+            <listitem>
+        <para>Write output to <replaceable>output_file</replaceable> instead of the default. The default       
+        filename is the name of the last input file with its extension        
+        replaced by the name of the type of output. If there is no input      
+        filename, then the extension is added onto jade-out.</para>
+            </listitem>
+        </varlistentry>
+
+        <varlistentry> 
+          <term><option>-V <replaceable>variable</replaceable></option></term>
+        <listitem><para>This is equivalent to doing (define variable #t) except that this     
+        definition will take priority over any definition of variable in a    
+        style-sheet.</para></listitem>
+        </varlistentry>
+                                                                              
+        <varlistentry>
+          <term><option>-V <replaceable>variable=value</replaceable></option></term>
+        <listitem><para>This is equivalent to doing (define <replaceable>variable</replaceable> "<replaceable>value</replaceable>") except that     
+        this definition will take priority over any definition of variable in 
+        a style-sheet.</para></listitem>
+         </varlistentry>
+      
+        <varlistentry> 
+           <term><option>-V (define <replaceable>variable</replaceable> <replacable>value</replacable>)</option></term>
+        <listitem><para>This is equivalent to doing (define variable value) except that this  
+        definition will take priority over any definition of variable in a    
+        style-sheet. Note that you will probably have to use some escaping    
+        mechanism for the spaces to get the entire scheme expression parsed   
+        as one cmdline argument.</para></listitem>
+        </varlistentry>
+
+        <varlistentry> 
+          <term><option>-w<replaceable>type</replaceable></option></term>
+        <listitem><para>Control warnings and errors. Multiple <option>-w</option> options are allowed. The     
+        following values of type enable warnings:                             </para>
+                                                                              
+ <para>            <option>xml</option>
+                Warn about constructs that are not allowed by XML.</para>
+                                                                              
+             <para><option>mixed</option>
+                Warn about mixed content models that do not allow #pcdata     
+                anywhere.</para>
+                                                                              
+             <para><option>sgmldecl</option>
+                Warn about various dubious constructions in the SGML          
+                declaration.</para>
+                                                                              
+             <para><option>should</option>
+                Warn about various recommendations made in ISO 8879 that the  
+                document does not comply with. (Recommendations are expressed 
+                with ``should'', as distinct from requirements which are      
+                usually expressed with ``shall''.)</para>
+                                                                              
+             <para><option>default</option>
+                Warn about defaulted references.</para>
+                                                                              
+             <para><option>duplicate</option>
+                Warn about duplicate entity declarations.</para>
+
+             <para><option>undefined</option>
+                Warn about undefined elements: elements used in the DTD but   
+                not defined.</para>
+                                                                              
+<para><option>unclosed</option>
+                Warn about unclosed start and end-tags.</para>
+
+             <para><option>empty</option>
+                Warn about empty start and end-tags.</para>
+                                                                              
+             <para><option>net</option>
+                Warn about net-enabling start-tags and null end-tags.</para>
+                                                                              
+             <para><option>min-tag</option>
+                Warn about minimized start and end-tags. Equivalent to        
+                combination of unclosed, empty and net warnings.</para>
+                                                                              
+             <para><option>unused-map</option>
+                Warn about unused short reference maps: maps that are         
+                declared with a short reference mapping declaration but never 
+                used in a short reference use declaration in the DTD.</para>
+                                                                              
+             <para><option>unused-param</option>
+                Warn about parameter entities that are defined but not used   
+                in a DTD. Unused internal parameter entities whose text is    
+                INCLUDE or IGNORE won't get the warning.</para>
+                                                                              
+             <para><option>notation-sysid</option>
+                Warn about notations for which no system identifier could be  
+                generated.</para>
+                                                                              
+             <para><option>all</option>
+                Warn about conditions that should usually be avoided (in the  
+                opinion of the author). Equivalent to: mixed, should,         
+                default, undefined, sgmldecl, unused-map, unused-param, empty 
+                and unclosed.</para>
+                                                                              
+        <para>A warning can be disabled by using its name prefixed with no-. Thus   
+        <option>-wall</option> <option>-wno-duplicate</option> will enable all warnings except those about      
+        duplicate entity declarations.</para>
+                                                                              
+        <para>The following values for <replaceable>warning_type</replaceable> disable errors:</para>
+                                                                              
+             <para><option>no-idref</option>
+                Do not give an error for an ID reference value which no       
+                element has as its ID. The effect will be as if each          
+                attribute declared as an ID reference value had been declared 
+                as a name.</para>
+
+             <para><option>no-significant</option>
+                Do not give an error when a character that is not a           
+                significant character in the reference concrete syntax occurs 
+                in a literal in the SGML declaration. This may be useful in   
+                conjunction with certain buggy test suites.</para>
+                                                                              
+             <para><option>no-valid</option>
+                Do not require the document to be type-valid. This has the    
+                effect of changing the SGML declaration to specify VALIDITY   
+                NOASSERT and IMPLYDEF ATTLIST YES ELEMENT YES. An option of   
+                <option>-wvalid</option> has the effect of changing the SGML declaration to    
+                specify VALIDITY TYPE and IMPLYDEF ATTLIST NO ELEMENT NO. If  
+                neither <option>-wvalid</option> nor <option>-wno-valid</option> are specified, then the        
+                VALIDITY and IMPLYDEF specified in the SGML declaration will  
+                be used.                                                      </para>
+          </listitem>
+        </varlistentry>
+      </variablelist>
+    </refsect1>
+
+    <refsect1>
+      <title>Environment</title>
+                                                                              
+<para>     OpenJade ignores the SP_CHARSET_FIXED and SP_SYSTEM_CHARSET environment
+     variables and always uses Unicode as its internal character set, as if   
+     SP_CHARSET_FIXED was 1 and SP_SYSTEM_CHARSET was unset. Thus only the    
+     SP_ENCODING environment variable is relevant to OpenJade's handling of   
+     character sets.</para>
+    </refsect1>
+
+    <refsect1>
+      <title>OpenJade Extensions</title>
+                                                                              
+     <para>The following external procedures are available. These external
+     procedures are defined by a prototype in the same manner as in the
+     standard. To use one of these external procedures, you must make use of
+     the standard external-procedure procedure, using a public identifier of  
+     "UNREGISTERED::James Clark//Procedure::name" where name is the name
+     given here, typically by including the following in the DSSSL
+     specification:</para>
+                                                                              
+     <para>(define name                                                             
+       (external-procedure "UNREGISTERED::James Clark//Procedure::name"))</para>
+                                                                              
+     <para>Note that external-procedure returns #f if it doesn't know about the     
+     specified public identifier. You can use this to enable your DSSSL       
+     specifications to work gracefully with other implementations which do    
+     not support these extensions.</para>
+                                                                              
+     <para>For external procedures added by the OpenJade team, use a public         
+     identifier of the form "UNREGISTERED::OpenJade//Procedure::name".</para>
+                                                                              
+     <para>An easy way to get access to all external procedures is to use the style 
+     specification dsssl/extensions.dsl#procedures. The file                  
+     dsssl/extensions.dsl also contains style specifications which make the   
+     nonstandard flow object classes and inherited characteristics supported  
+     by the backends available in a convenient way.</para>
+                                                                              
+      <para><option>Debugging</option></para>
+                                                                              
+     <para>(debug obj)</para>
+                                                                              
+     <para>Generates a message including the value of obj and then returns obj.</para>
+                                                                              
+       <para><option>Simple-page-sequence header/footer control</option></para>
+                                                                              
+     <para>(if-first-page sosofo1 sosofo2)</para>
+                                                                              
+     <para>This can be used only in the specification of the value of one of the    
+     header/footer characteristics of simple-page-sequence. It returns a      
+     sosofo that will display as sosofo1 if the page is the first page of the 
+     simple-page-sequence and as sosofo2 otherwise.</para>
+                                                                              
+                                                                              
+     <para>(if-front-page sosofo1 sosofo2)</para>
+                                                                              
+     <para>This can be used only in the specification of the value of one of the    
+     header/footer characteristics of simple-page-sequence. It returns a      
+     sosofo that will display as sosofo1 if the page is a front (ie recto,    
+     odd-numbered) page and as sosofo2 if it is a back (ie verso,             
+     even-numbered) page.</para>
+                                                                              
+       <para><option>Numbering</option></para>
+                                                                              
+     <para>(all-element-number)</para>
+     <para>(all-element-number osnl)</para>
+                                                                              
+     <para>This is the same as element-number except it counts elements with any    
+     generic identifier. If osnl is not an element returns #f, otherwise      
+     returns 1 plus the number of elements that started before osnl. This     
+     provides an efficient way of creating a unique identifier for any        
+     element in a document.</para>
+                                                                              
+       <para><option>External entity access</option></para>
+                                                                              
+     <para>(read-entity string)</para>
+                                                                              
+     <para>This returns a string containing the contents of the external entity     
+     with system identifier string. This should be used only for textual      
+     entities (CDATA and SDATA), and not for binary entities (NDATA).</para>
+                                                                              
+       <para><option>POSIX locale access</option></para>
+                                                                              
+     <para>(language lang country)</para>
+                                                                              
+     <para>This procedure returns an object of type language, if the system         
+     supports the specified language. lang is a string or symbol giving the   
+     two letter language code. country is a string or symbol giving the two   
+     letter country code.</para>
+                                                                              
+     <para>This procedure uses POSIX locales. It is an OpenJade addition. It is not supported on all operating systems.</para>
+                                                                              
+       <para><option>Extended standard procedures</option></para>
+                                                                              
+     <para>(sgml-parse sysid #!key active: parent: architecture:)</para>
+                                                                              
+     <para>This allows you to specify an SGML architecture with respect to which
+     the document should be parsed. It is an OpenJade addition.</para>
+                                                                              
+     <para>(expt q k)</para>
+                                                                              
+     <para>This allows you to raise a quantity to an integral power. It is an       
+     OpenJade addition.</para>
+     </refsect1>
+
+     <refsect1>
+       <title>Limitations</title>
+                                                                              
+     <para>This section describes the limitations of the front-end (the             
+     general-purpose DSSSL engine); each backend also has its own             
+     limitations.</para>
+                                                                              
+     <para><command>openjade</command> doesn't allow internal definitions at the beginning of bodies and 
+     the (test => recipient) variant of cond clauses.</para>
+                                                                              
+     <para><command>openjade</command> supports only a single, fixed grove plan which comprises the    
+     following modules:</para>
+                                                                              
+       <para>* baseabs</para>
+       <para>* prlgabs0</para>
+       <para>* prlgabs1</para>
+       <para>* instabs</para>
+       <para>* basesds0</para>
+       <para>* instsds0</para>
+       <para>* subdcabs</para>
+                                                                              
+     <para>It doesn't implement the following parts of SDQL: HyTime support,        
+     auxiliary parsing, node regular expressions.</para>
+                                                                              
+     <para>Query rules, sosofo synchronization, indirect sosofos, reference values, 
+     decoration areas and font properties are not supported.</para>
+                                                                              
+     <para>Note that only inherited characteristics that are applicable to some     
+     supported flow object can be specified.</para>
+                                                                              
+       <para><option>Character/glyph handling</option></para>
+                                                                              
+     <para>It only supports a single pre-defined character repertoire. A character  
+     name of the form U-XXXX where XXXX are four upper-case hexadecimal       
+     digits, is recognized as referring to the Unicode character with that    
+     code. For many characters, it is also possible to use the ISO/IEC 10646  
+     name in lower-case with words separated by hyphens.</para>
+                                                                              
+     <para>Some common SDATA entity names from the ISO entity sets are recognized   
+     and mapped to characters. In addition an SDATA entity name of the form   
+     U-XXXX, where XXXX are four upper-case hexadecimal digits, is mapped to  
+     the Unicode character with that code.</para>
+                                                                              
+     <para>OpenJade now supports the standard-chars, map-sdata-entity,              
+     add-name-chars, add-separator-chars and char-repertoire declaration      
+     element forms, allowing a style-sheet to define additional character     
+     names, sdata entity mappings, name characters (i.e. characters allowed   
+     in identifiers) and separator characters. Currently the only recognized  
+     character repertoire is the built-in repertoire. It has the public       
+     identifier "UNREGISTERED::OpenJade//Character Repertoire::OpenJade".</para>
+                                                                              
+       <para><option>Validation</option></para>
+                                                                              
+     <para>Several things that it would be desirable to have checked aren't         
+     checked:</para>
+                                                                              
+       <para>* When the allowed value of an inherited characteristic is a symbol,   
+         OpenJade checks only that the value is a symbol that is allowed as   
+         the value of some characteristic; #t and #f are treated as a special 
+         kind of symbol in this case.</para>
+       <para>* OpenJade doesn't check whether a flow object is occurring in a       
+         context where it is allowed.</para>
+       <para>* OpenJade does not prevent flow objects being attached to the         
+         principal port of a flow object when the flow object shouldn't have  
+         a principal port.</para>
+       <para>* Most type-checking is done at run-time not compile-time.</para>
+       <para>* OpenJade does not check for non-inherited characteristics that are   
+         required to be specified.</para>
+       <para>* It doesn't check that optional features that have been used were     
+         declared in the features form.</para>
+                                                                              
+       <para><option>Other limitations</option></para>
+                                                                              
+     <para>The following primitives are just stubs:</para>
+                                                                              
+     <para><option>char-script-case</option>
+        Always returns last argument.</para>
+                                                                              
+     <para><option>address-visited?</option>
+        Always returns #f.</para>
+</refsect1>
+<refsect1>
+   <title>Examples</title>
+   <para>Given an SGML file <command>file.sgml</command>, use the stylesheet <command>file.dsl</command> and publish as an rtf file.</para>
+
+   <para>openjade -t rtf file.sgml</para>
+
+   <para>Using a different stylesheet:</para>
+
+   <para>openjade -t rtf -d docbook.dsl file.sgml</para>
+   
+   <para>Using the <command>print</command> style specification contained
+within the stylesheet</para>
+   <para>openjade -t rtf -d docbook.dsl#print file.sgml</para>
+
+   <para>And use the html specification within the style sheet to convert
+to html</para>
+
+    <para>openjade -t sgml -i html -d docbook.dsl#html file.sgml</para>
+</refsect1>
+
+    <refsect1>
+      <title>See Also</title>
+      <para><command>onsgmls(1)</command></para>
+    </refsect1>
+    </refentry>
+  </section>
+</article>
diff --git a/docsrc/releasenotes.dsl b/docsrc/releasenotes.dsl
new file mode 100644 (file)
index 0000000..9808643
--- /dev/null
@@ -0,0 +1,227 @@
+<!DOCTYPE style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN" [
+<!ENTITY html-ss 
+  PUBLIC "-//Norman Walsh//DOCUMENT DocBook HTML Stylesheet//EN" CDATA dsssl>
+<!ENTITY print-ss
+  PUBLIC "-//Norman Walsh//DOCUMENT DocBook Print Stylesheet//EN" CDATA dsssl>
+]>
+<style-sheet>
+<style-specification id="print" use="print-stylesheet">
+<style-specification-body> 
+
+;; This draws in version 1.74b of the module docbook DSSSL stylesheets
+;; together with sourceforge patch #502637
+
+;; customize the print stylesheet
+
+(define %hsize-bump-factor% 1.1)
+
+(define %chapter-autolabel%
+  ;; Are chapters enumerated?
+  #f)
+
+(define %two-side% #t)
+
+(define %graphic-extensions%
+;; List of graphic filename extensions
+'("pdf" "eps" "epsf" "gif" "tif" "tiff" "jpg" "jpeg" "png"))
+
+
+(define preferred-mediaobject-notations
+  (list "PDF" "EPS" "PS" "JPG" "JPEG" "PNG" "linespecific"))
+
+(define preferred-mediaobject-extensions
+  (list "pdf" "eps" "ps" "jpg" "jpeg" "png"))
+
+(define %titlepage-in-info-order% #f)
+
+;; Fix bug in numbering of the preface
+
+      (define ($component$)
+        (make simple-page-sequence
+          page-n-columns: %page-n-columns%
+          page-number-restart?: (or %page-number-restart%
+                                    (first-chapter?))
+          page-number-format: ($page-number-format$)
+          use: default-text-style
+          left-header:   ($left-header$)
+          center-header: ($center-header$)
+          right-header:  ($right-header$)
+          left-footer:   ($left-footer$)
+          center-footer: ($center-footer$)
+          right-footer:  ($right-footer$)
+          start-indent: %body-start-indent%
+          input-whitespace-treatment: 'collapse
+          quadding: %default-quadding%
+          (make sequence
+            ($component-title$)
+            (process-children))
+          (make-endnotes)))
+
+;; Customise the title page
+(element book 
+  (let* ((bookinfo  (select-elements (children (current-node)) 
+                                    (normalize "bookinfo")))
+        (dedication (select-elements (children (current-node)) 
+                                     (normalize "dedication")))
+        (nl        (titlepage-info-elements (current-node) bookinfo)))
+    (make sequence
+      (if %generate-book-titlepage%
+         (make simple-page-sequence
+           page-n-columns: %titlepage-n-columns%
+           input-whitespace-treatment: 'collapse
+           use: default-text-style
+               bottom-margin: 144pt
+               right-footer: ($title-right-footer$)
+           (book-titlepage nl 'recto)
+           (make display-group
+             break-before: 'page
+             (book-titlepage nl 'verso)))
+         (empty-sosofo))
+
+      (if (node-list-empty? dedication)
+         (empty-sosofo)
+         (with-mode dedication-page-mode
+           (process-node-list dedication)))
+
+      (if (not (generate-toc-in-front))
+         (process-children)
+         (empty-sosofo))
+
+      (if %generate-book-toc%
+         (make simple-page-sequence
+           page-n-columns: %page-n-columns%
+           page-number-format: ($page-number-format$ (normalize "toc"))
+           use: default-text-style
+           left-header:   ($left-header$ (normalize "toc"))
+           center-header: ($center-header$ (normalize "toc"))
+           right-header:  ($right-header$ (normalize "toc"))
+           left-footer:   ($left-footer$ (normalize "toc"))
+           center-footer: ($center-footer$ (normalize "toc"))
+           right-footer:  ($right-footer$ (normalize "toc"))
+           input-whitespace-treatment: 'collapse
+           (build-toc (current-node)
+                      (toc-depth (current-node))))
+         (empty-sosofo))
+           
+      (let loop ((gilist ($generate-book-lot-list$)))
+       (if (null? gilist)
+           (empty-sosofo)
+           (if (not (node-list-empty? 
+                     (select-elements (descendants (current-node))
+                                      (car gilist))))
+               (make simple-page-sequence
+                 page-n-columns: %page-n-columns%
+                 page-number-format: ($page-number-format$ (normalize "lot"))
+                 use: default-text-style
+                 left-header:   ($left-header$ (normalize "lot"))
+                 center-header: ($center-header$ (normalize "lot"))
+                 right-header:  ($right-header$ (normalize "lot"))
+                 left-footer:   ($left-footer$ (normalize "lot"))
+                 center-footer: ($center-footer$ (normalize "lot"))
+                 right-footer:  ($right-footer$ (normalize "lot"))
+                 input-whitespace-treatment: 'collapse
+                 (build-lot (current-node) (car gilist))
+                 (loop (cdr gilist)))
+               (loop (cdr gilist)))))
+
+      (if (generate-toc-in-front)
+         (process-children)
+         (empty-sosofo)))))
+
+(define %openjade-logo%
+   ;; The nice look systems logo
+    "logo.png" )
+
+(define ($title-right-footer$)
+  (if-first-page
+    (make external-graphic
+         scale:               1.0
+         entity-system-id:    %openjade-logo%
+         notation-system-id:  "PDF"
+         display?:            #f)
+    (empty-sosofo)))
+
+(define (book-titlepage-recto-elements)
+  (list (normalize "corpauthor")
+        (normalize "subtitle")
+        (normalize "title")
+        (normalize "graphic")))
+
+(define (book-titlepage-verso-elements)
+  (list (normalize "legalnotice")
+        (normalize "copyright")
+        (normalize "edition")
+        (normalize "pubdate")
+        (normalize "abstract")
+        (normalize "revhistory")))  
+
+(define (book-titlepage-before node side)
+(empty-sosofo)
+       )
+
+(mode book-titlepage-recto-mode
+
+    (element graphic
+        (make display-group
+             (make external-graphic
+                 entity-system-id: (attribute-string "fileref")
+                 display?:               #t
+             )
+        )
+    )                         
+    (element title
+        (make paragraph
+                font-size:      36pt
+                font-family-name:       "Palatino"
+                font-weight:    'bold
+                space-before:   12pt
+               line-spacing:   36pt
+                (make rule
+                       space-after: 4pt
+                        line-thickness: 1pt)
+                (process-children)
+        )                                                                       
+    )
+    (element subtitle
+        (make paragraph
+                font-size:      24pt
+               line-spacing:   24pt
+                font-family-name:       "Palatino"
+                font-weight:    'bold
+                (process-children)
+        )
+    ) 
+    (element corpauthor
+        (make paragraph
+                font-size:      24pt
+                line-spacing:      24pt
+                space-after:   6pt
+                font-family-name:       "Palatino"
+                font-weight:    'normal
+                (process-children)
+        )                                                                       
+    )
+)
+
+
+</style-specification-body>
+</style-specification>
+
+<style-specification id="html" use="html-stylesheet">
+<style-specification-body>
+
+;; customize the html stylesheet
+
+
+;; customize the html stylesheet
+(define %body-attr%
+  ;; What attributes should be hung off of BODY?
+  (list
+     (list "BGCOLOR" "#FFFFFF")
+     (list "TEXT" "#000000")))
+
+</style-specification-body>
+</style-specification>
+<external-specification id="print-stylesheet" document="print-ss">
+<external-specification id="html-stylesheet"  document="html-ss">
+</style-sheet>
diff --git a/docsrc/releasenotes.xml b/docsrc/releasenotes.xml
new file mode 100644 (file)
index 0000000..af89fc6
--- /dev/null
@@ -0,0 +1,1235 @@
+<?xml version='1.0'?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" [
+]>
+<book>
+<bookinfo>
+       <title>OpenJade 1.3.2</title>
+       <subtitle>Release Notes</subtitle>
+       <corpauthor>OpenJade Project</corpauthor>
+        <edition>Release 1.3.2</edition>
+        <pubdate>December 2002</pubdate>
+        <copyright>
+                <year>2002</year>
+                <holder>OpenJade Project</holder>
+        </copyright>
+</bookinfo>
+
+<chapter><title>OpenJade 1.3.2 Release Notes</title>
+
+<para>OpenJade is a suite of tools for validating, processing and applying DSSSL (Document Style Semantics and Specification Language) style sheets to SGML and XML documents.</para>
+<para>OpenJade is a project undertaken by the DSSSL community to maintain
+and extend James Clark's Jade, as well as the related SP suite of SGML/XML processing tools. OpenJade and OpenSP are distributed under the same license as Jade.</para>
+
+<sect1><title>Applications of OpenJade</title>
+<para>Many different projects, organizations and companies make use of OpenJade to publish documentation. The SGML/XML backend enables the generation of "world wide web ready" documents while the TeX backend allows high quality "ready for press" output to be obtained. The FreeBSD Handbook (second edition) ISBN: 1571763031 is one such example of a book created using OpenJade.</para>
+</sect1>
+
+<sect1><title>Obtaining OpenJade</title>
+<para>OpenJade is a project hosted at sourceforge.net and is available
+from the OpenJade web site at http://openjade.sourceforge.net or directly
+from the OpenJade project page at http://sourceforge.net/projects/openjade</para>
+<para>OpenJade is provided in source code form. However as a courtesy
+to Win32 users where development tools are not always available, a binary release for the Win32 platform is usually available.</para>
+</sect1>
+<sect1><title>Supported Platforms</title>
+<para>OpenJade is intended to be as portable as possible. It should be
+possible to compile and build on most contemporary UNIX type platforms. In
+addition OpenJade will also build on Microsoft's Win32 based operating systems.
+</para>
+<para>OpenJade is known to compile with both the GNU gcc c++ compiler and
+Microsoft Visual C++. Other compilers have not been extensively tested.</para>
+<para>OpenJade has been successfully built with the following GNU compilers: 
+Red Hat g++ 2.96, GCC g++ 2.95.3, GCC g++ 3.2</para>
+<para>OpenJade has been built on a number of architectures including Intel i386 and ia64, Alpha AXP, Sparc, PPC and S/390, S/390x.</para>
+<para>The following table details known successful builds</para>
+<table id="platforms" frame="topbot"><title>Platforms on which OpenJade 1.3.2 is known to build.</title>
+<tgroup cols="4" align="left" colsep="0" rowsep="0">
+<colspec align="left" colname="c1" colwidth="1*" />
+<colspec colname="c2" colwidth="2*" />
+<colspec colname="c3" colwidth="2*" />
+<colspec colname="c4" colwidth="3*" />
+<thead>
+<row rowsep="1">
+       <entry>Arch.</entry>
+       <entry>OS</entry>
+       <entry>Compiler</entry>
+       <entry>Notes</entry>
+</row>
+</thead>
+<tbody>
+<row>
+   <entry align="left">alpha</entry>
+   <entry>Debian 3.0</entry>
+   <entry>GNU gcc 3.2</entry>
+   <entry></entry>
+</row>
+<row>
+   <entry align="left">arm</entry>
+   <entry>Debian 3.0</entry>
+   <entry>GNU gcc 3.2</entry>
+   <entry></entry>
+</row>
+<row>
+   <entry align="left">hppa</entry>
+   <entry>Debian 3.0</entry>
+   <entry>GNU gcc 3.2</entry>
+   <entry></entry>
+</row>
+<row>
+   <entry align="left" morerows="3">i386</entry>
+   <entry>Debian 3.0</entry>
+   <entry>GNU gcc 3.2</entry>
+   <entry></entry>
+</row>
+<row>
+   <entry>Red Hat Linux 7.3</entry>
+   <entry>Red Hat gcc 2.96</entry>
+   <entry></entry>
+</row>
+<row>
+   <entry>Red Hat Linux 7.3</entry>
+   <entry>GNU gcc 3.2</entry>
+   <entry></entry>
+</row>
+<row>
+   <entry>SuSE Linux 8.1</entry>
+   <entry>GNU gcc 3.2</entry>
+   <entry></entry>
+</row>
+<row>
+   <entry align="left">ia64</entry>
+   <entry>Debian 3.0</entry>
+   <entry>GNU gcc 3.2</entry>
+   <entry></entry>
+</row>
+<row>
+   <entry align="left">m68k</entry>
+   <entry>Debian 3.0</entry>
+   <entry>GNU gcc 3.2</entry>
+   <entry></entry>
+</row>
+<row>
+   <entry align="left">mips, mipsel</entry>
+   <entry>Debian 3.0</entry>
+   <entry>GNU gcc 3.2</entry>
+   <entry></entry>
+</row>
+<row>
+   <entry align="left">powerpc</entry>
+   <entry>Debian 3.0</entry>
+   <entry>GNU gcc 3.2</entry>
+   <entry></entry>
+</row>
+<row>
+   <entry align="left">s390</entry>
+   <entry>Debian 3.0</entry>
+   <entry>GNU gcc 3.2</entry>
+   <entry></entry>
+</row>
+<row>
+   <entry align="left">sparc</entry>
+   <entry>Debian 3.0</entry>
+   <entry>GNU gcc 3.2</entry>
+   <entry></entry>
+</row>
+</tbody>
+</tgroup>
+</table>
+<para>Please report any successful builds not mentioned above to <email>openjade-devel@lists.sourceforge.net</email>, including any diffs/patches you have used.</para>
+</sect1>
+<sect1><title>Building OpenJade from Source</title>
+<para>OpenJade requires 40Mb to 50Mb of disk space to build. An installation
+will require around 15Mb to 20Mb depending on architecture.</para>
+<para>OpenJade makes use of the GNU software configuration tools (autoconf, libtool, automake etc).
+The GNU C++ compiler and make utility should also be used.
+The steps required to build the OpenJade tools (<command>onsgmls</command>, <command>openjade</command>, <command>osgmlnorm</command>, <command>ospam</command>, <command>ospent</command>, <command>osx</command>) and libraries are as follows:
+<screen>gzip -d openjade-1.3.2.tar.gz | tar xvf -
+cd openjade-1.3.2
+./configure <optional><option><replaceable>options&hellip;</replaceable></option></optional>
+make
+</screen>
+You may need to switch to the super user <command>root</command> to complete the installation
+<screen>
+make install
+</screen>
+If you wish to install man pages for the various commands you should then do
+<screen>
+make install-man</screen>
+The <command>configure</command> script supports many options. These can be displayed using the command
+<screen>
+./configure --help
+</screen>
+In addition to the standard options, the following table describes options specific to openjade.</para>
+<table id="configure" frame="topbot"><title>OpenJade specific configure options</title>
+<tgroup cols="3" align="left" colsep="0" rowsep="0">
+<colspec colname="c1" colwidth="1*" />
+<colspec colname="c2" colwidth="1*" />
+<colspec colname="c3" colwidth="2*" />
+<thead>
+<row rowsep="1">
+       <entry>Option</entry>
+       <entry>Default</entry>
+       <entry>Explanation</entry>
+</row>
+</thead>
+<tbody>
+<row>
+  <entry><option>--enable-spincludedir=path</option></entry>
+  <entry>/usr/include/OpenSP</entry>
+  <entry>Define the path where the OpenSP include files may be found.</entry>
+</row>
+<row>
+  <entry><option>--enable-splibdir=path</option></entry>
+  <entry>/usr/lib</entry>
+  <entry>Define the path where the OpenSP library (libosp) may be found.</entry>
+</row>
+<row>
+  <entry><option>--disable-mif</option></entry>
+  <entry>MIF support is enabled</entry>
+  <entry>disable support for FrameMaker MIF output (the <option>-t mif</option> option) to <command>openjade</command>.</entry>
+</row>
+<row>
+  <entry><option>--disable-html</option></entry>
+  <entry>html support enabled</entry>
+  <entry>disable support for HTML+CSS output (the <option>-t html</option> to <command>openjade</command>).</entry>
+</row>
+<row>
+  <entry><option>--enable-default-catalog=<replaceable>pathlist</replaceable></option></entry>
+  <entry>Not enabled</entry>
+  <entry>Provide one or more default catalog files or sysids, e.g. /usr/local/lib/sgml/catalog</entry>
+</row>
+<row>
+  <entry><option>--enable-default-search-path=<replaceable>pathlist</replaceable></option></entry>
+  <entry>Not enabled</entry>
+  <entry>Provide a default value for <varname>SGML_SEARCH_PATH</varname></entry>
+</row>
+</tbody>
+</tgroup>
+</table>
+<para>Please refer to the system documentation for details on building on the Win32 platform.</para>
+</sect1>
+<sect1><title>Binary Distributions</title>
+<para>Although the OpenJade project does not make binary distributions available, OpenJade has been a part of many software distributions, including the major Linux distributions as well as FreeBSD. Expect pre-compiled and packaged versions of the latest version of OpenJade to be available from your distributor in due course.</para>
+</sect1>
+<sect1><title>Installation</title>
+<para>In addition to the OpenJade executables and libraries you will also need various DTDs and stylesheets.
+Some DTDs and associated files (entity definitions) are available in the <filename>pubtext</filename> directory of the distribution.
+However, more authoritative sources should be referenced to ensure that up-to-date versions are used. If you wish to process XML files, then suitable SGML declarations for valid XML documents should be used. Again, a sample set of declarations (<filename>xml.dcl</filename>) is provided in the <filename>pubtext</filename>, but more complete or recent versions may be available from other sources.</para>
+<para>OpenJade supports the standard SGML catalog facility; it is
+recommended that you set up and use such a catalog system.
+Generally speaking
+you will create your own DSSSL stylesheets for use with OpenJade, however, users
+of the OASIS DocBook DTD should be aware that extensive, and modular, stylesheets are available from the DocBook project at http://docbook.sourceforge.net.</para>
+<para>If you wish to make use of the TeX backend you will require an up to
+date distribution of laTeX such as teTeX, TeXlive or fpTeX. In addition you
+will also require the jadetex package, available from http://jadetex.sourceforge.net.</para>
+</sect1>
+<sect1><title>Support</title>
+<para>If, after reading the documentation, you still have a problem, then you
+may require some additional help.
+The OpenJade project is a volunteer effort and as such does not provide any formal support.
+Instead, you should look to the community for support.
+Once part of the community, you, in turn, will be able to play your part in
+helping those that come after you. Here are some pointers to obtaining help:</para>
+
+<itemizedlist>
+<listitem>
+<para>If you obtained your OpenJade tools in binary form from your operating system distributor and you have a build related problem -
+such as openjade crashing, then your first port of call should be your distributor.</para>
+</listitem>
+
+<listitem>
+<para>If you have a problem with the usage of openjade and tools, or general queries about DSSSL then you should try the DSSSL mailing list, see http://www.mulberrytech.com/dsssl/dssslist/ for details.</para>
+</listitem>
+
+<listitem>
+<para>If you are using the DocBook DTD and especially if you are also using the Modular DocBook DSSSL stylesheets, then the docbook-apps mailing list is the place to go.
+See http://www.oasis-open.org/docbook/mailinglist/ for details.</para>
+</listitem>
+
+<listitem>
+<para>If you have a patch or bug fix for OpenJade, or are trying to use the OpenSP API then the openjade-devel mailing list is the appropriate forum.</para>
+</listitem>
+
+</itemizedlist>
+
+<para>Please choose only one mailing list to post to, as cross-posting is generally frowned upon.
+The various mailing lists are archived and searchable.
+It is always worth searching for your problem first, as it is often the case that someone has had the same problem before.</para>
+
+</sect1>
+<sect1><title>Version 1.3.2</title>
+<formalpara><title>Released December 2002.</title>
+<para>This release allows openjade to be built against the most recent OpenSP release - version 1.5. It also contains some fixes for the MIF backend which were omitted from the 1.3.1 release. OpenSP is now distributed in a separate package and made available on its own release cycle</para>
+</formalpara>
+<table id="openjade132fixes" frame="topbot"><title>Changes for release 1.3.2</title>
+<tgroup cols="2" align="left" colsep="0" rowsep="0">
+<colspec colname="c1" colwidth="1*" />
+<colspec colname="c2" colwidth="3*" />
+<thead>
+<row rowsep="1">
+       <entry>Item 1</entry>
+       <entry>MIF Backend Fixes</entry>
+</row>
+</thead>
+<tbody>
+<row>
+       <entry><para>References</para></entry>
+       <entry><para>G. Seshadri et al.</para></entry>
+</row>
+<row>
+       <entry><para>Category</para></entry>
+       <entry><para>Software Bug</para></entry>
+</row>
+<row>
+<entry><para>Problem</para></entry>
+<entry><para>Issues with page size and page header/footers</para></entry>
+</row>
+<row>
+<entry><para>Resolution</para></entry>
+<entry><para>Fix to make sure that right header is shown in documents and
+that document page size is initialised correctly.</para></entry>
+</row>
+</tbody>
+</tgroup>
+<tgroup cols="2" align="left" colsep="0" rowsep="0">
+<colspec colname="c1" colwidth="1*" />
+<colspec colname="c2" colwidth="3*" />
+<thead>
+<row rowsep="1">
+       <entry>Item 2</entry>
+       <entry>Support for building OpenSP 1.5</entry>
+</row>
+</thead>
+<tbody>
+<row>
+       <entry><para>References</para></entry>
+       <entry><para>Ian Castle, Karl Eichwalder</para></entry>
+</row>
+<row>
+       <entry><para>Category</para></entry>
+       <entry><para>Software Bug</para></entry>
+</row>
+<row>
+<entry><para>Problem</para></entry>
+<entry><para>OpenSP is now at version 1.5 which has many improvements
+over 1.3.4</para></entry>
+</row>
+<row>
+<entry><para>Resolution</para></entry>
+<entry><para>It is desirable to use OpenSP 1.5 which has many improvements
+over version 1.3.4 which shipped with openjade 1.3.1. However, it is
+awkward having to have two versions of OpenSP at the same time. OpenJade
+1.4 is not ready for release yet, so version 1.3.2 will link against
+OpenSP 1.5 and later - and no longer includes the old version 1.3.4 of OpenSP.  </para></entry>
+</row>
+</tbody>
+</tgroup>
+<tgroup cols="2" align="left" colsep="0" rowsep="0">
+<colspec colname="c1" colwidth="1*" />
+<colspec colname="c2" colwidth="3*" />
+<thead>
+<row rowsep="1">
+       <entry>Item 3</entry>
+       <entry>Correct definition of "attribute" in builtin.dsl</entry>
+</row>
+</thead>
+<tbody>
+<row>
+       <entry><para>References</para></entry>
+       <entry><para>Toby Speight, Debian Bug #145242</para></entry>
+</row>
+<row>
+       <entry><para>Category</para></entry>
+       <entry><para>Software Bug</para></entry>
+</row>
+<row>
+<entry><para>Problem</para></entry>
+<entry><para>The definition of "attribute" (ISO/IEC 10179:1996, section 10.2.5) for SGML property operations was not correct.</para></entry>
+</row>
+<row>
+<entry><para>Resolution</para></entry>
+<entry><para>The definition has been corrected in accordance
+with the standard.</para></entry>
+</row>
+</tbody>
+</tgroup>
+<tgroup cols="2" align="left" colsep="0" rowsep="0">
+<colspec colname="c1" colwidth="1*" />
+<colspec colname="c2" colwidth="3*" />
+<thead>
+<row rowsep="1">
+       <entry>Item 4</entry>
+       <entry>XML backend doesn't quote "&" in attribute values</entry>
+</row>
+</thead>
+<tbody>
+<row>
+       <entry><para>References</para></entry>
+       <entry><para>Toby Speight, Debian Bug #147073</para></entry>
+</row>
+<row>
+       <entry><para>Category</para></entry>
+       <entry><para>Software Bug</para></entry>
+</row>
+<row>
+<entry><para>Problem</para></entry>
+<entry><para>When using OpenJade with the XML or SGML backend to output
+attribute values containing the '&amp;' character, the output is not
+well-formed.</para></entry>
+</row>
+<row>
+<entry><para>Resolution</para></entry>
+<entry><para>Fixed the Transform FOT Builder so that for XML output the
+'&amp;' character is properly quoted.</para></entry>
+</row>
+</tbody>
+</tgroup>
+</table>
+</sect1>
+<sect1><title>Version 1.3.1</title>
+<formalpara><title>Released January 2002.</title>
+<para>This release is primarily a maintenance release. It delivers two key advantages over the OpenJade 1.3 release: Support for contemporary platforms (operating systems and compilers) and incorporates the various patches and improvements, especially to the TeX backend, which have been extensively used over the last few years. Probably the biggest benefit to TeX backend users are the enhanced table support and improved two sided output support (in conjunction with improvements to the companion jadetex package).</para>
+</formalpara>
+<para>The following table details the major improvements in Openjade 1.3.1</para>
+
+<table id="openjade131fixes" frame="topbot"><title>Changes for release 1.3.1</title>
+<tgroup cols="2" align="left" colsep="0" rowsep="0">
+<colspec colname="c1" colwidth="1*" />
+<colspec colname="c2" colwidth="3*" />
+<thead>
+<row rowsep="1">
+       <entry>Item 1</entry>
+       <entry>Support for MacOS X/ Darwin</entry>
+</row>
+</thead>
+<tbody>
+<row>
+       <entry><para>References</para></entry>
+       <entry><para>Fink Project; Kogul&eacute;, Ryo</para></entry>
+</row>
+<row>
+       <entry><para>Category</para></entry>
+       <entry><para>Software Bug</para></entry>
+</row>
+<row>
+<entry><para>Problem</para></entry>
+<entry><para>OpenJade 1.3 does not build and run on the Mac OS X/Darwin platform</para></entry>
+</row>
+<row>
+<entry><para>Resolution</para></entry>
+<entry><para>OpenJade 1.3.1 has been enhanced to support Mac OS X/Darwin 1.4. The
+autoconf configuration system has been upgraded and also includes specific
+platform support. Some minor code alterations to improve code portability (C++
+style changes). Note that the POSIX locale feature is not available on this platform.</para></entry>
+</row>
+</tbody>
+</tgroup>
+<tgroup cols="2" align="left" colsep="0" rowsep="0">
+<colspec colname="c1" colwidth="1*" />
+<colspec colname="c2" colwidth="3*" />
+<thead>
+<row rowsep="1">
+       <entry>Item 2</entry>
+       <entry>UNIX on-line manual pages</entry>
+</row>
+</thead>
+<tbody>
+<row>
+       <entry><para>References</para></entry>
+       <entry><para>None</para></entry>
+</row>
+<row>
+       <entry><para>Category</para></entry>
+       <entry><para>Documentation Bug</para></entry>
+</row>
+<row>
+<entry><para>Problem</para></entry>
+<entry><para>No on-line manual (man) pages available on UNIX platforms</para></entry>
+</row>
+<row>
+<entry><para>Resolution</para></entry>
+<entry><para>OpenJade 1.3.1 now has a man page for every command. Additionally, if
+OpenJade is used as a replacement for Jade, then compatibility man pages are included (i.e.
+man jade is synonymous with man openjade).</para></entry>
+</row>
+</tbody>
+</tgroup>
+<tgroup cols="2" align="left" colsep="0" rowsep="0">
+<colspec colname="c1" colwidth="1*" />
+<colspec colname="c2" colwidth="3*" />
+<thead>
+<row rowsep="1">
+       <entry>Item 3</entry>
+       <entry>Upgrade GNU source configuration tools</entry>
+</row>
+</thead>
+<tbody>
+<row>
+       <entry><para>References</para></entry>
+       <entry><para>Various sourceforge problem reports, SuSE Linux 7.3, Red Hat 7.2, Red Hat Bugzilla #46212</para></entry>
+</row>
+<row>
+       <entry><para>Category</para></entry>
+       <entry><para>Software Bug</para></entry>
+</row>
+<row>
+<entry><para>Problem</para></entry>
+<entry><para>The source configuration system is based on old versions of libtool and autoconf.
+In addition, there are problems with the generated Makefile files such that installation
+directories are not created.</para></entry>
+</row>
+<row>
+<entry><para>Resolution</para></entry>
+<entry><para>Upgraded to autoconf 2.52 and libtool 1.4. Upgraded the various support files.
+Included elements of automake support. Made the Makefiles more robust. These changes
+should facilitate porting to new/updated environments (i.e. those supported by
+newer versions of autoconf). Work has been done to enhance some of the custom autoconf tests to
+improve reliability.</para></entry>
+</row>
+</tbody>
+</tgroup>
+<tgroup cols="2" align="left" colsep="0" rowsep="0">
+<colspec colname="c1" colwidth="1*" />
+<colspec colname="c2" colwidth="3*" />
+<thead>
+<row rowsep="1">
+       <entry>Item 4</entry>
+       <entry>Support for XML Byte Order Marks (BOM)</entry>
+</row>
+</thead>
+<tbody>
+<row>
+       <entry><para>References</para></entry>
+       <entry><para>Source Forge bug #442560 (Terje Bless/Liam Quinn)</para></entry>
+</row>
+<row>
+       <entry><para>Category</para></entry>
+       <entry><para>Software Bug</para></entry>
+</row>
+<row>
+<entry><para>Problem</para></entry>
+<entry><para>Since OpenJade 1.3 was released, a second edition of the XML 1.0 specification
+has been released (REC-xml-20001006). This specification introduced the concept
+of Byte Order Marks to increase the sophistication of the detection of
+the character encoding system. OpenJade 1.3 would not recognize these, and rejected
+any XML file which included these as invalid.</para></entry>
+</row>
+<row>
+<entry><para>Resolution</para></entry>
+<entry><para>XML 1.0 Byte Order Marks are now accepted as valid XML.</para></entry>
+</row>
+</tbody>
+</tgroup>
+<tgroup cols="2" align="left" colsep="0" rowsep="0">
+<colspec colname="c1" colwidth="1*" />
+<colspec colname="c2" colwidth="3*" />
+<thead>
+<row rowsep="1">
+       <entry>Item 5</entry>
+       <entry>Fix missing white space problem in processing instruction flow object</entry>
+</row>
+</thead>
+<tbody>
+<row>
+       <entry><para>References</para></entry>
+       <entry><para>Source Forge Ref #505113, #505124 (Markus Hoenicka)</para></entry>
+</row>
+<row>
+       <entry><para>Category</para></entry>
+       <entry><para>Software Bug</para></entry>
+</row>
+<row>
+<entry><para>Problem</para></entry>
+<entry><para>No white space was emitted between the public-id and the system-id
+       causing a malformed XML file to be generated.</para></entry>
+       
+</row>
+<row>
+<entry><para>Resolution</para></entry>
+<entry><para>Fixed OpenJade to output a space between the public-id and the system-id.</para></entry>
+</row>
+</tbody>
+</tgroup>
+<tgroup cols="2" align="left" colsep="0" rowsep="0">
+<colspec colname="c1" colwidth="1*" />
+<colspec colname="c2" colwidth="3*" />
+<thead>
+<row rowsep="1">
+       <entry>Item 6</entry>
+       <entry>Jadetex is now distributed independently</entry>
+</row>
+</thead>
+<tbody>
+<row>
+       <entry><para>References</para></entry>
+       <entry><para>None</para></entry>
+</row>
+<row>
+       <entry><para>Category</para></entry>
+       <entry><para>Software Bug</para></entry>
+</row>
+<row>
+<entry><para>Problem</para></entry>
+<entry><para>OpenJade 1.3 shipped with Jadetex 2.7. Jadetex is developed and released
+separately from OpenJade.</para></entry>
+</row>
+<row>
+<entry><para>Resolution</para></entry>
+<entry><para>Removed jadetex files. Jadetex can be obtained from http://jadetex.sourceforge.net</para></entry>
+</row>
+</tbody>
+</tgroup>
+<tgroup cols="2" align="left" colsep="0" rowsep="0">
+<colspec colname="c1" colwidth="1*" />
+<colspec colname="c2" colwidth="3*" />
+<thead>
+<row rowsep="1">
+       <entry>Item 7</entry>
+       <entry>Support for FreeBSD 4.4</entry>
+</row>
+</thead>
+<tbody>
+<row>
+       <entry><para>References</para></entry>
+       <entry><para>FreeBSD 4.4 openjade port</para></entry>
+</row>
+<row>
+       <entry><para>Category</para></entry>
+       <entry><para>Software Bug</para></entry>
+</row>
+<row>
+<entry><para>Problem</para></entry>
+<entry><para>OpenJade 1.3 would not build on FreeBSD 4.x</para></entry>
+</row>
+<row>
+<entry><para>Resolution</para></entry>
+<entry><para>The source configuration system has been enhanced to support
+FreeBSD out of the box. Note that the POSIX locale feature of OpenJade is not
+available under FreeBSD.</para></entry>
+</row>
+</tbody>
+</tgroup>
+<tgroup cols="2" align="left" colsep="0" rowsep="0">
+<colspec colname="c1" colwidth="1*" />
+<colspec colname="c2" colwidth="3*" />
+<thead>
+<row rowsep="1">
+       <entry>Item 8</entry>
+       <entry>Allow non alpha numeric characters in Table of Contents</entry>
+</row>
+</thead>
+<tbody>
+<row>
+       <entry><para>References</para></entry>
+       <entry><para>Red Hat Bugzilla #31525</para></entry>
+</row>
+<row>
+       <entry><para>Category</para></entry>
+       <entry><para>Software Bug</para></entry>
+</row>
+<row>
+<entry><para>Problem</para></entry>
+<entry><para>
+Certain non alpha-numeric characters (such as $) do not appear correctly in the table of contents. This problem is confined to the TeX backend.
+</para></entry>
+</row>
+<row>
+<entry><para>Resolution</para></entry>
+<entry><para>Special characters are now correctly escaped in the TeX output file.</para></entry>
+</row>
+</tbody>
+</tgroup>
+<tgroup cols="2" align="left" colsep="0" rowsep="0">
+<colspec colname="c1" colwidth="1*" />
+<colspec colname="c2" colwidth="3*" />
+<thead>
+<row rowsep="1">
+       <entry>Item 9</entry>
+       <entry>Support for latest Win32 build environments</entry>
+</row>
+</thead>
+<tbody>
+<row>
+       <entry><para>References</para></entry>
+       <entry><para>None</para></entry>
+</row>
+<row>
+       <entry><para>Category</para></entry>
+       <entry><para>Software Bug</para></entry>
+</row>
+<row>
+<entry><para>Problem</para></entry>
+<entry><para>OpenJade 1.3 does not build with Visual C++ 6.0</para></entry>
+</row>
+<row>
+<entry><para>Resolution</para></entry>
+<entry><para>Fix C++ style to be compatible with Visual C++. Update build environment. OpenJade 1.3.1 should run in all Windows 32 environments from Windows 95 through Windows NT to Windows XP.</para></entry>
+</row>
+</tbody>
+</tgroup>
+<tgroup cols="2" align="left" colsep="0" rowsep="0">
+<colspec colname="c1" colwidth="1*" />
+<colspec colname="c2" colwidth="3*" />
+<thead>
+<row rowsep="1">
+       <entry>Item 10</entry>
+       <entry>Enhancements for Software Packaging</entry>
+</row>
+</thead>
+<tbody>
+<row>
+       <entry><para>References</para></entry>
+       <entry><para>SuSE Linux 7.3</para></entry>
+</row>
+<row>
+       <entry><para>Category</para></entry>
+       <entry><para>Software Bug</para></entry>
+</row>
+<row>
+<entry><para>Problem</para></entry>
+<entry><para>Numerous patches need to be applied to OpenJade 1.3 to enable packages to be built (RPM)</para></entry>
+</row>
+<row>
+<entry><para>Resolution</para></entry>
+<entry><para>Enhance Makefiles to ensure that packages are easy to build (including addition of <varname>DESTDIR</varname> environment variable). It should now be possible to build RPM packages and BSD ports without resorting to patches.</para></entry>
+</row>
+</tbody>
+</tgroup>
+<tgroup cols="2" align="left" colsep="0" rowsep="0">
+<colspec colname="c1" colwidth="1*" />
+<colspec colname="c2" colwidth="3*" />
+<thead>
+<row rowsep="1">
+       <entry>Item 11</entry>
+       <entry>Support for newer GNU C++ compilers</entry>
+</row>
+</thead>
+<tbody>
+<row>
+       <entry><para>References</para></entry>
+       <entry><para>SuSE Linux 7.3 (Andreas Schwab), Red Hat Linux 7.2, Connectiva Linux</para></entry>
+</row>
+<row>
+       <entry><para>Category</para></entry>
+       <entry><para>Software Bug</para></entry>
+</row>
+<row>
+<entry><para>Problem</para></entry>
+<entry><para>C++ is a shifting target. New compilers/standards demand changes.</para></entry>
+</row>
+<row>
+<entry><para>Resolution</para></entry>
+<entry><para>Various enhancements to allow OpenJade to build with the new GNU GCC 3.0 and the soon to be released GNU GCC 3.1 c++ compilers</para></entry>
+</row>
+</tbody>
+</tgroup>
+<tgroup cols="2" align="left" colsep="0" rowsep="0">
+<colspec colname="c1" colwidth="1*" />
+<colspec colname="c2" colwidth="3*" />
+<thead>
+<row rowsep="1">
+       <entry>Item 12</entry>
+       <entry>Support for jadetex 3.4 and greater macros for two sided support</entry>
+</row>
+</thead>
+<tbody>
+<row>
+       <entry><para>References</para></entry>
+       <entry><para>Sourceforge patch #439755,
+       http://iNdev.iNsu.COM/openjade/ (Francis J. Lacoste)</para></entry>
+</row>
+<row>
+       <entry><para>Category</para></entry>
+       <entry><para>Software Bug</para></entry>
+</row>
+<row>
+<entry><para>Problem</para></entry>
+<entry><para>Two Sided output support with the TeX backend is unreliable in OpenJade 1.3 and Jadetex 2.x.</para></entry>
+</row>
+<row>
+<entry><para>Resolution</para></entry>
+<entry><para>Enhance the TeX backend two sided output support and bring into line with advances in the jadetex latex front end. Two extension characteristics are introduced to allow control of <function>two-side</function> and <function>two-side-start-on-right</function>. This also fixes the "blank page at the end of the document" problem. The following new characteristics are available:
+<screen>
+  "UNREGISTERED::OpenJade//Characteristic::page-two-side?"
+
+  "UNREGISTERED::OpenJade//Characteristic::two-side-start-on-right?"
+</screen></para></entry>
+</row>
+</tbody>
+</tgroup>
+<tgroup cols="2" align="left" colsep="0" rowsep="0">
+<colspec colname="c1" colwidth="1*" />
+<colspec colname="c2" colwidth="3*" />
+<thead>
+<row rowsep="1">
+       <entry>Item 13</entry>
+       <entry>Prevent incorrect generation of ligatures in the TeX Backend</entry>
+</row>
+</thead>
+<tbody>
+<row>
+       <entry><para>References</para></entry>
+       <entry><para>Red Hat Bugzilla #11497, #11779</para></entry>
+</row>
+<row>
+       <entry><para>Category</para></entry>
+       <entry><para>Software Bug</para></entry>
+</row>
+<row>
+<entry><para>Problem</para></entry>
+<entry><para>Certain sequences of characters (such as --) are not correctly escaped in the TeX backend, so that TeX incorrectly creates ligatures out of them (so that -- becomes an em dash &mdash;).</para></entry>
+</row>
+<row>
+<entry><para>Resolution</para></entry>
+<entry><para>OpenJade 1.3.1 now correctly escapes these character sequences. This is a particular problem when representing program code where sequences such as -- are often operators.</para></entry>
+</row>
+</tbody>
+</tgroup>
+<tgroup cols="2" align="left" colsep="0" rowsep="0">
+<colspec colname="c1" colwidth="1*" />
+<colspec colname="c2" colwidth="3*" />
+<thead>
+<row rowsep="1">
+       <entry>Item 14</entry>
+       <entry>Improved time string handling</entry>
+</row>
+</thead>
+<tbody>
+<row>
+       <entry><para>References</para></entry>
+       <entry><para>http://iNdev.iNsu.COM/openjade/ (Francis J. Lacoste)</para></entry>
+</row>
+<row>
+       <entry><para>Category</para></entry>
+       <entry><para>Software Bug</para></entry>
+</row>
+<row>
+<entry><para>Problem</para></entry>
+<entry><para>OpenJade 1.3 does not support the <function>(time<=?)</function> comparison</para></entry>
+</row>
+<row>
+<entry><para>Resolution</para></entry>
+<entry><para>Various bugs fixed in the time string support of OpenJade.
+It is now possible to compare time, date and datetime.
+Also partial formats (such as YY-MM-DD, YYYY-MM or HH:MM) are now supported</para></entry>
+</row>
+</tbody>
+</tgroup>
+<tgroup cols="2" align="left" colsep="0" rowsep="0">
+<colspec colname="c1" colwidth="1*" />
+<colspec colname="c2" colwidth="3*" />
+<thead>
+<row rowsep="1">
+       <entry>Item 15</entry>
+       <entry>Improvements in handling <function>sosofo-append</function></entry>
+</row>
+</thead>
+<tbody>
+<row>
+       <entry><para>References</para></entry>
+       <entry><para>http://iNdev.iNsu.COM/openjade/ (Francis J. Lacoste)</para></entry>
+</row>
+<row>
+       <entry><para>Category</para></entry>
+       <entry><para>Software Bug</para></entry>
+</row>
+<row>
+<entry><para>Problem</para></entry>
+<entry><para>sosofo-append has problems with memory/stack usage when
+handling large lists of sosofo</para></entry>
+</row>
+<row>
+<entry><para>Resolution</para></entry>
+<entry><para>The fix optimizes <function>sosofo-append</function> to reduce its memory and stack
+       usage when using it to build long list of sosofo :
+<screen>
+    (let loop ( (res (empty-sosofo))
+        (nl  (node-list-rest (children (current-node)))))
+           (loop (sosofo-append res (process-node-list
+        (node-list-first nl)))
+            (node-list-rest nl)))
+</screen></para></entry>
+</row>
+</tbody>
+</tgroup>
+<tgroup cols="2" align="left" colsep="0" rowsep="0">
+<colspec colname="c1" colwidth="1*" />
+<colspec colname="c2" colwidth="3*" />
+<thead>
+<row rowsep="1">
+       <entry>Item 16</entry>
+       <entry>Improved Table handling in TeX Backend</entry>
+</row>
+</thead>
+<tbody>
+<row>
+       <entry><para>References</para></entry>
+       <entry><para>http://iNdev.iNsu.COM/openjade/ (Francis J. Lacoste)</para></entry>
+</row>
+<row>
+       <entry><para>Category</para></entry>
+       <entry><para>Software Bug</para></entry>
+</row>
+<row>
+<entry><para>Problem</para></entry>
+<entry><para>Table handling in the TeX backend has numerous problems.
+</para></entry>
+</row>
+<row>
+<entry><para>Resolution</para></entry>
+<entry><para>Support for tables in the TeX backend has been improved with:</para>
+<itemizedlist>
+  <listitem>
+            <para>Support for nested tables.</para>
+  </listitem>
+  <listitem>
+            <para><function>cell-after-column-margin:</function> and <function>cell-before-column-margin:</function> wasn't really working.</para>
+  </listitem>
+  <listitem>
+            <para>Row spanning was broken. This fix only supports
+               <function>'start</function> row alignment though.</para>
+  </listitem>
+  <listitem>
+            <para>Paragraphs in cell spanning multiple column are now
+       working.</para>
+  </listitem>
+  <listitem>
+            <para>Support for the <function>row-alignment:</function> characteristic.</para>
+   </listitem>
+   <listitem>
+            <para>Support for <function>cell-background?</function> and <function>background-color</function> properties</para>
+  </listitem>
+  </itemizedlist>
+</entry>
+</row>
+</tbody>
+</tgroup>
+<tgroup cols="2" align="left" colsep="0" rowsep="0">
+<colspec colname="c1" colwidth="1*" />
+<colspec colname="c2" colwidth="3*" />
+<thead>
+<row rowsep="1">
+       <entry>Item 17</entry>
+       <entry>Support for <function>'asis</function> and <function>'asis-wrap</function></entry>
+</row>
+</thead>
+<tbody>
+<row>
+       <entry><para>References</para></entry>
+       <entry><para>http://iNdev.iNsu.COM/openjade/ (Francis J. Lacoste)</para></entry>
+</row>
+<row>
+       <entry><para>Category</para></entry>
+       <entry><para>Software Bug</para></entry>
+</row>
+<row>
+<entry><para>Problem</para></entry>
+<entry><para>The <function>lines:</function> characteristic in the paragraph flow object does not
+support the <function>'asis</function> and <function>'asis-wrap</function> values.</para></entry>
+</row>
+<row>
+<entry><para>Resolution</para></entry>
+<entry><para>
+         This adds support for the <function>'asis</function> and <function>'asis-wrap</function> values for the
+         paragraph's lines: characteristic.
+</para></entry>
+</row>
+</tbody>
+</tgroup>
+</table>
+</sect1>
+<sect1>
+  <title>Version 1.3</title>
+  <formalpara><title>Released October 1999</title>
+<para>Version 1.3 added many improvements to increase the scope of the implementation of DSSSL. Changes include:</para></formalpara>
+
+<itemizedlist>
+  <listitem>
+    <para>The SGML backend will now emit linebreaks when used as <option>-t sgml-raw</option>.</para>
+  </listitem>
+
+  <listitem>
+    <para>
+Jade can bind variables to arbitrary values on the command line with the <option>-V</option> option. 
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+The <function>prlabs1</function> module of the SGML property set is supported.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+Style sheet <filename>extensions.dsl</filename> lists all known
+  external procedures ready for easy inclusion
+  as an <function>external-specification</function>.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+External procedure with public identifier
+<screen>
+  "UNREGISTERED::OpenJade//Procedure::expt"
+</screen>
+  to provide integral powers of quantities.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+External procedure with public identifier
+<screen>
+  "UNREGISTERED::OpenJade//Procedure::sgml-parse"
+</screen>
+  allows to parse w.r.t. an architecture.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+Jade supports <function>force!</function> for inherited characteristics.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+Jade supports character properties.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+Jade supports <function>special-query-expressions</function>.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+Jade can bind variables to string values on the command line.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+All standard color spaces supported. 
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+Jade ignores duplicate keywords in make expressions, as 
+  mandated by DSSSL.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+External procedure with public identifier
+<screen>
+  "UNREGISTERED::OpenJade//Procedure::language"
+</screen>
+  to create a language object by reference to a POSIX locale.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+Language-dependent procedures of the expression language:
+<function>language?,</function>
+<function>current-language,</function>
+<function>declare-default-language,</function>
+<function>with-language,</function>
+<function>define-language,</function>
+<function>char&lt;?,</function>
+<function>char>?,</function>
+<function>char&lt;=?,</function>
+<function>char>=?,</function>
+<function>char-ci=?,</function>
+<function>char-ci&lt;?,</function>
+<function>char-ci>?,</function>
+<function>char-ci&lt;=?,</function>
+<function>char-ci&lt;=?,</function>
+<function>char-upcase,</function>
+<function>char-downcase,</function>
+<function>string-ci=?,</function>
+<function>string-equiv?,</function>
+<function>string&lt;?,</function>
+<function>string>?,</function>
+<function>string&lt;=?,</function>
+<function>string>=?,</function>
+<function>string-ci&lt;?,</function>
+<function>string-ci>?,</function>
+<function>string-ci&lt;=?,</function>
+<function>string-ci>=?.</function>
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+The style-sheet.dtd derived from the DSSSL architecture
+  has been extended (in a backward compatible way) to
+  include the declaration element type forms supported by
+  Jade. The public identifier for the dtd is 
+<screen>
+  "-//OpenJade//DTD DSSSL Style Sheet//EN" 
+</screen>
+    </para>
+  </listitem>
+  
+  <listitem>
+    <para>
+<function>char-repertoire</function>, <function>add-name-chars</function> and <function>add-separator-chars</function>
+  declaration element type forms are supported. When given
+  the <option>-s</option> command line flag, Jade doesn't use its built in 
+  character repertoire.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+Most of the derived procedures in the query language:
+<function>current-root</function>,
+<function>node-list-reduce</function>,
+<function>node-list-contains?</function>,
+<function>node-list-remove-duplicates</function>,
+<function>node-list-union</function>, 
+<function>node-list-intersection</function>,
+<function>node-list-difference</function>, 
+<function>node-list-symmetric-difference</function>,
+<function>node-list-union-map</function>,
+<function>node-list-some?</function>,
+<function>node-list-every?</function>,
+<function>node-list-filter</function>,
+<function>node-list->list</function>,
+<function>node-list-tail</function>,
+<function>node-list-head</function>,
+<function>node-list-sublist</function>,
+<function>node-list-count</function>,
+<function>node-list-last</function>,
+<function>node-list-property</function>,
+<function>origin</function>,
+<function>origin-to-subnode-rel</function>,
+<function>tree-root</function>,
+<function>grove-root</function>,
+<function>source</function>,
+<function>subtree</function>,
+<function>subgrove</function>,
+<function>ancestors</function>,
+<function>grove-root-path</function>,
+<function>rsiblings</function>,
+<function>ipreced</function>,
+<function>ifollow</function>,
+<function>grove-before?</function>,
+<function>sort-in-tree-order</function>,
+<function>tree-before?</function>,
+<function>tree-before</function>,
+<function>property-lookup</function>,
+<function>select-by-property</function>, 
+<function>select-by-null-property</function>,
+<function>select-by-missing-property</function>,
+<function>attribute</function>,
+<function>referent</function>,
+<function>q-element</function>,
+<function>q-class</function>,
+<function>q-sdata</function>.
+    </para>
+  </listitem>
+</itemizedlist>
+</sect1>
+<sect1><title>Version 1.2.2</title>
+<formalpara><title>Released June 1999</title>
+<para>The first release of OpenJade.</para>
+</formalpara>
+
+<para>Changes in OpenJade 1.2.2</para>
+
+<itemizedlist>
+  <listitem>
+    <para>
+The HTML and MIF backends are now enabled by default.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+The TeX backend has support for PDF bookmarks. This is
+  supported by the new version of jadetex which is included.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+Predefined character names <function>line-feed</function> and <function>carriage-return</function> 
+  for the character numbers 10 and 13.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+standard-chars and map-sdata-entity declaration element
+type forms are supported.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+Style language additions: map-constructor.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<function>+</function> and <function>-</function> return a <function>length-spec</function> if any of there arguments
+  is a <function>length-spec</function>.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+Most of the DSSSL non-core expression language:
+<function>c...r</function>,
+<function>assoc</function>,
+<function>keyword->string</function>,
+<function>string->keyword</function>,
+<function>exact?</function>,
+<function>inexact?</function>,
+<function>zero?</function>,
+<function>positive?</function>,
+<function>negative?</function>,
+<function>odd?</function>,
+<function>even?</function>,
+<function>exp</function>,
+<function>log</function>,
+<function>sin</function>,
+<function>cos</function>,
+<function>tan</function>,
+<function>asin</function>,
+<function>acos</function>,
+<function>atan</function>,
+<function>expt</function>,
+<function>exact->inexact</function>,
+<function>inexact->exact</function>,
+<function>quantity->number</function>,
+<function>string->list</function>,
+<function>list->string</function>,
+<function>map</function>,
+<function>time&lt;?</function>,
+<function>time>?</function>,
+<function>time&lt;=?</function>,
+<function>time&gt;=?</function>.
+    </para>
+  </listitem>
+  </itemizedlist>
+</sect1>
+
+<sect1><title>Jade Version 1.2.1</title>
+<formalpara><title>Released October 1998</title>
+<para>Jade 1.2.1 was the final release of jade from James Clark. OpenJade is based on this code base.</para></formalpara>
+</sect1>
+
+</chapter>
+</book>
diff --git a/docsrc/sgmlnorm.1 b/docsrc/sgmlnorm.1
new file mode 100644 (file)
index 0000000..be34a62
--- /dev/null
@@ -0,0 +1 @@
+.so man1/sgmlnorm.1
diff --git a/docsrc/spam.1 b/docsrc/spam.1
new file mode 100644 (file)
index 0000000..31f689f
--- /dev/null
@@ -0,0 +1 @@
+.so man1/ospam.1
diff --git a/docsrc/spent.1 b/docsrc/spent.1
new file mode 100644 (file)
index 0000000..1c724b8
--- /dev/null
@@ -0,0 +1 @@
+.so man1/ospent.1
diff --git a/docsrc/sx.1 b/docsrc/sx.1
new file mode 100644 (file)
index 0000000..1ee9746
--- /dev/null
@@ -0,0 +1 @@
+.so man1/osx.1
diff --git a/dsssl/README.jadetex b/dsssl/README.jadetex
new file mode 100644 (file)
index 0000000..6a4b8ab
--- /dev/null
@@ -0,0 +1,10 @@
+OPENJADE 1.3.1 and JADETEX
+
+Jadetex is no longer distributed with OpenJade. The latest version
+of jadetex can be obtained from:
+
+    http://jadetex.sourceforge.net
+
+or
+
+    http://sourceforge.net/projects/jadetex
diff --git a/dsssl/builtins.dsl b/dsssl/builtins.dsl
new file mode 100644 (file)
index 0000000..2e1ab1a
--- /dev/null
@@ -0,0 +1,397 @@
+;; clause 8.5.3.5
+(define (caar x)  (car (car x)) )
+(define (cadr x)  (list-ref x 1) )
+(define (cdar x)  (cdr (car x)) )
+(define (cddr x)  (cdr (cdr x)) )
+(define (caaar x)  (car (car (car x))) )
+(define (caadr x)  (car (car (cdr x))) )
+(define (cadar x)  (car (cdr (car x))) )
+(define (caddr x)  (list-ref x 2) )
+(define (cdaar x)  (cdr (car (car x))) )
+(define (cdadr x)  (cdr (car (cdr x))) )
+(define (cddar x)  (cdr (cdr (car x))) )
+(define (cdddr x)  (cdr (cdr (cdr x))) )
+(define (caaaar x)  (car (car (car (car x)))) )
+(define (caaadr x)  (car (car (car (cdr x)))) )
+(define (caadar x)  (car (car (cdr (car x)))) )
+(define (cadaar x)  (car (cdr (car (car x)))) )
+(define (cadadr x)  (car (cdr (car (cdr x)))) )
+(define (caddar x)  (car (cdr (cdr (car x)))) )
+(define (cadddr x)  (list-ref x 3) )
+(define (cdaaar x)  (cdr (car (car (car x)))) )
+(define (cdaadr x)  (cdr (car (car (cdr x)))) )
+(define (cdadar x)  (cdr (car (cdr (car x)))) )
+(define (cddaar x)  (cdr (cdr (car (car x)))) )
+(define (cddadr x)  (cdr (cdr (car (cdr x)))) )
+(define (cdddar x)  (cdr (cdr (cdr (car x)))) )
+(define (cddddr x)  (cdr (cdr (cdr (cdr x)))) )
+
+;; clause 8.5.8.4
+(define (char>?  c1 c2) (char<?  c2 c1))
+(define (char>=? c1 c2) (char<=? c2 c1))
+
+;; clause 8.5.8.5
+(define (__ci-equiv proc) 
+    (lambda (c1 c2) 
+        (proc (char-upcase c1) (char-upcase c2))
+    )
+)
+(define char-ci=?   (__ci-equiv char=?))
+(define char-ci<?   (__ci-equiv char<?))
+(define char-ci>?   (__ci-equiv char>?))
+(define char-ci<=?  (__ci-equiv char<=?))
+(define char-ci>=?  (__ci-equiv char>=?))
+
+;; clause 8.5.9.6
+(define (__upcase-string s) 
+    (list->string
+        (map char-upcase
+            (string->list s)
+        )
+    )
+)
+(define (__ci-string-equiv proc)
+    (lambda (s1 s2) 
+        (proc (__upcase-string s1) (__upcase-string s2))
+    )
+)
+(define (string>?    s1 s2) (string<?  s2 s1))
+(define (string>=?   s1 s2) (string<=? s2 s1))
+(define string-ci=?  (__ci-string-equiv string=?))
+(define string-ci<?  (__ci-string-equiv string<?))
+(define string-ci>?  (__ci-string-equiv string>?))
+(define string-ci<=? (__ci-string-equiv string<=?))
+(define string-ci>=? (__ci-string-equiv string>=?))
+
+;; clause 8.5.10.3
+ (define (map f #!rest xs)
+   (let ((map1 (lambda (f xs)
+                (let loop ((xs xs))
+                  (if (null? xs)
+                      '()
+                      (cons (f (car xs))
+                            (loop (cdr xs))))))))
+    (cond ((null? xs)
+          '())
+         ((null? (cdr xs))
+          (map1 f (car xs)))
+         (else
+          (let loop ((xs xs))
+            (if (null? (car xs))
+                '()
+                (cons (apply f (map1 car xs))
+                      (loop (map1 cdr xs)))))))))
+
+;; clause 10.1.1
+(define (current-root) (node-property 'grove-root (current-node)))
+
+;; clause 10.2.2
+(define (node-list-reduce nl combine init)
+   (if (node-list-empty? nl)
+       init
+       (node-list-reduce (node-list-rest nl)
+                         combine
+                         (combine init (node-list-first nl)))))
+
+(define (node-list-contains? nl snl)
+  (node-list-reduce nl
+                   (lambda (result i)
+                     (or result
+                         (node-list=? snl i)))
+                   #f))
+
+(define (node-list-remove-duplicates nl)
+  (node-list-reduce nl
+                   (lambda (result snl)
+                     (if (node-list-contains? result snl)
+                         result
+                         (node-list result snl)))
+                   (empty-node-list)))
+
+(define (reduce list combine init)
+  (let loop ((result init)
+            (list list))
+    (if (null? list)
+       result
+       (loop (combine result (car list))
+             (cdr list)))))
+
+(define (node-list-union #!rest args)
+  (reduce args
+         (lambda (nl1 nl2)
+           (node-list-reduce nl2
+                             (lambda (result snl)
+                               (if (node-list-contains? result
+                                                        snl)
+                                   result
+                                   (node-list result snl)))
+                             nl1))
+         (empty-node-list)))
+
+(define (node-list-intersection #!rest args)
+  (if (null? args) 
+      (empty-node-list)
+      (reduce (cdr args)
+             (lambda (nl1 nl2)
+               (node-list-reduce nl1
+                                 (lambda (result snl)
+                                   (if (node-list-contains? nl2 snl)
+                                       (node-list result snl)
+                                       result))
+                                 (empty-node-list)))
+             (node-list-remove-duplicates (car args)))))
+
+(define (node-list-difference #!rest args)
+  (if (null? args)
+      (empty-node-list)
+      (reduce (cdr args)
+             (lambda (nl1 nl2)
+               (node-list-reduce nl1
+                                 (lambda (result snl)
+                                   (if (node-list-contains? nl2 snl)
+                                       result
+                                       (node-list result snl)))
+                                 (empty-node-list)))
+             (node-list-remove-duplicates (car args)))))
+
+(define (node-list-symmetric-difference #!rest args)
+  (if (null? args)
+      (empty-node-list)
+      (reduce (cdr args)
+             (lambda (nl1 nl2)
+               (node-list-difference (node-list-union nl1 nl2)
+                                     (node-list-intersection nl1 nl2)))
+             (node-list-remove-duplicates (car args)))))
+
+(define (node-list-union-map proc nl)
+  (node-list-reduce nl
+                   (lambda (result snl)
+                     (node-list-union (proc snl)
+                                      result))
+                   (empty-node-list)))
+
+(define (node-list-some? proc nl)
+  (node-list-reduce nl
+                   (lambda (result snl)
+                     (if (or result (proc snl))
+                         #t
+                         #f))
+                   #f))
+
+(define (node-list-every? proc nl)
+  (node-list-reduce nl
+                   (lambda (result snl)
+                     (if (and result (proc snl))
+                         #t
+                         #f))
+                   #t))
+
+(define (node-list-filter proc nl)
+  (node-list-reduce nl
+                   (lambda (result snl)
+                     (if (proc snl)
+                         (node-list result snl)
+                         result))
+                   (empty-node-list)))
+
+(define (node-list->list nl)
+  (reverse (node-list-reduce nl
+                            (lambda (result snl)
+                              (cons snl result))
+                            '())))
+
+(define (node-list-tail nl k)
+  (cond 
+   ((< k 0) (empty-node-list))
+   ((zero? k) nl)
+   (else
+    (node-list-tail (node-list-rest nl) (- k 1)))))
+
+(define (node-list-head nl k)
+  (if (zero? k)
+      (empty-node-list)
+      (node-list (node-list-first nl)
+                (node-list-head (node-list-rest nl) (- k 1)))))
+       ;;                         ^^^^^^^
+       ;;                         missing in standard
+
+(define (node-list-sublist nl i j)
+  (node-list-head (node-list-tail nl i) (- j i)))
+
+(define (node-list-count nl)
+  (node-list-length (node-list-remove-duplicates nl)))
+
+(define (node-list-last nl)
+  (node-list-ref nl 
+                (- (node-list-length nl) 1)))
+
+;; clause 10.2.3
+(define (node-list-property prop nl)
+  (node-list-map (lambda (snl)
+                  (node-property prop snl default: (empty-node-list)))
+                nl))
+
+(define (origin nl)
+  (node-list-property 'origin nl))
+
+(define (origin-to-subnode-rel snl)
+  (node-property 'origin-to-subnode-rel-property-name snl default: #f))
+
+(define (tree-root nl)
+  (node-list-property 'tree-root nl))
+
+(define (grove-root nl)
+  (node-list-property 'grove-root nl))
+
+(define (source nl)
+  (node-list-property 'source nl))
+
+(define (subtree nl)
+  (node-list-map (lambda (snl)
+                  (node-list snl (subtree (children snl))))
+                nl))
+
+(define (subgrove nl)
+  (node-list-map
+   (lambda (snl)
+     (node-list snl
+               (subgrove 
+                (apply node-list
+                       (map (lambda (name)
+                              (node-property name snl))
+                            (node-property 'subnode-property-names 
+                                           snl))))))
+   nl))
+
+(define (ancestors nl)
+  (node-list-map (lambda (snl)
+                  (let loop ((cur (parent snl))
+                             (result (empty-node-list)))
+                    (if (node-list-empty? cur)
+                        result
+                        (loop (parent cur)
+                              (node-list cur result)))))
+                nl))
+
+(define (grove-root-path nl)
+  (node-list-map (lambda (snl)
+                  (let loop ((cur (origin snl))
+                             (result (empty-node-list)))
+                    (if (node-list-empty? cur)
+                        result
+                        (loop (origin cur)
+                              (node-list cur result)))))
+                nl))
+
+(define (rsiblings nl)
+  (node-list-map (lambda (snl)
+                  (let ((rel (origin-to-subnode-rel snl)))
+                    (if rel 
+                        (node-property rel 
+                                       (origin snl)
+                                       default: (empty-node-list))
+                        snl)))
+                nl))
+
+(define (ipreced nl)
+   (node-list-map (lambda (snl)
+                  (let loop ((prev (empty-node-list))
+                             (rest (rsiblings snl)))
+                    (cond ((node-list-empty? rest)
+                           (empty-node-list))
+                          ((node-list=? (node-list-first rest) snl)
+                           prev)
+                          (else
+                           (loop (node-list-first rest)
+                                 (node-list-rest rest))))))
+                  nl))
+
+(define (ifollow nl)
+  (node-list-map (lambda (snl)
+                  (let loop ((rest (rsiblings snl)))
+                    (cond ((node-list-empty? rest)
+                           (empty-node-list))
+                          ((node-list=? (node-list-first rest) snl)
+                           (node-list-first (node-list-rest rest)))
+                          (else
+                           (loop (node-list-rest rest))))))
+                nl))
+
+(define (grove-before? snl1 snl2)
+  (let ((sorted
+        (node-list-intersection (subgrove (grove-root snl1))
+                                (node-list snl1 snl2))))
+    (and (= (node-list-length sorted) 2)
+        (node-list=? (node-list-first sorted) snl1))))
+
+(define (sort-in-tree-order nl)
+  (node-list-intersection (subtree (tree-root nl))
+                         nl))
+
+(define (tree-before? snl1 snl2)
+  (let ((sorted 
+        (sort-in-tree-order (node-list snl1 snl2))))
+    (and (= (node-list-length sorted) 2)
+        (node-list=? (node-list-first sorted) snl1))))
+
+(define (tree-before nl)
+  (node-list-map (lambda (snl)
+                  (node-list-filter (lambda (x)
+                                      (tree-before? x snl))
+                                    (subtree (tree-root snl))))
+                nl))
+
+(define (property-lookup prop snl if-present if-not-present)
+  (let ((val (node-property prop snl default: #f)))
+    (cond
+     (val (if-present val))
+     ((node-property prop snl default: #t) (if-not-present val))
+     (else (if-present val)))))
+
+(define (select-by-property nl prop proc)
+  (node-list-filter (lambda (snl)
+                     (let ((val (node-property prop snl default: #f)))
+                       (and (not (node-list? val))
+                            (proc val))))
+                   nl))
+
+(define (select-by-null-property nl prop)
+  (node-list-filter (lambda (snl)
+                     (let ((val1 (node-property prop snl null: #f))
+                           (val2 (node-property prop snl null: #t)))
+                       (and (not val1) val2)))
+                   nl))
+
+(define (select-by-missing-property nl prop)
+  (node-list-filter (lambda (snl)
+                     (let ((val1 (node-property prop snl 
+                                                default: #f 
+                                                null: #t))
+                           (val2 (node-property prop snl 
+                                                default: #t 
+                                                null: #f)))
+                       (and (not val1) val2)))
+                   nl))
+
+;; clause 10.2.5
+(define (attribute name nl)
+  (node-list-map (lambda (snl)
+                  (named-node name (attributes snl)))
+                nl))
+
+(define (referent nl)
+  (node-list-property 'referent nl))
+  
+(define (q-element pattern #!optional (nl (current-node)))
+  (select-elements (subgrove nl) pattern))
+
+(define (q-class sym #!optional (nl (current-node)))
+  (node-list-filter (lambda (snl) 
+                     (equal? (node-property 'class-name snl) sym)) 
+                   (subgrove nl)))
+
+(define (q-sdata string #!optional (nl (current-node)))
+  (node-list-filter (lambda (snl) 
+                     (and (equal? (node-property 'class-name snl) 'sdata)
+                          (equal? (node-property 'system-data snl) string)))
+                   (subgrove nl)))
diff --git a/dsssl/catalog b/dsssl/catalog
new file mode 100644 (file)
index 0000000..fa4eb09
--- /dev/null
@@ -0,0 +1,5 @@
+PUBLIC "-//James Clark//DTD DSSSL Flow Object Tree//EN" "fot.dtd"
+PUBLIC "ISO/IEC 10179:1996//DTD DSSSL Architecture//EN" "dsssl.dtd"
+PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN" "style-sheet.dtd"
+PUBLIC "-//OpenJade//DTD DSSSL Style Sheet//EN" "style-sheet.dtd"
+SYSTEM "builtins.dsl" "builtins.dsl"
diff --git a/dsssl/demo.dsl b/dsssl/demo.dsl
new file mode 100644 (file)
index 0000000..3ed5739
--- /dev/null
@@ -0,0 +1,14 @@
+<!doctype style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN">
+
+<style-sheet>
+<style-specification>
+<style-specification-body>
+
+(root (make simple-page-sequence
+           (make scroll)))
+
+(element p (make paragraph))
+
+</style-specification-body>
+</style-specification>
+</style-sheet>
diff --git a/dsssl/demo.sgm b/dsssl/demo.sgm
new file mode 100644 (file)
index 0000000..6f81acd
--- /dev/null
@@ -0,0 +1,10 @@
+<!doctype demo [
+<!element demo o o (p*)>
+<!element p - o (#pcdata)>
+]>
+<demo>
+<p>
+The first paragraph.</p>
+<p>
+The second paragraph.</p>
+</demo>
diff --git a/dsssl/dsssl.dtd b/dsssl/dsssl.dtd
new file mode 100644 (file)
index 0000000..50f66ba
--- /dev/null
@@ -0,0 +1,134 @@
+<!-- DSSSL Architectural Forms -->
+
+<!ENTITY % declarations
+ "features | baseset-encoding | literal-described-char | add-name-chars
+  | add-separator-chars | standard-chars | other-chars 
+  | combine-char | map-sdata-entity | char-repertoire"
+>
+
+<!element dsssl-specification - O
+          ((%declarations;)*,
+           (style-specification | transformation-specification
+            | external-specification)+)>
+<!attlist dsssl-specification
+          version CDATA #FIXED "ISO/IEC 10179:1996"
+>
+
+<!element transformation-specification - O
+          ((%declarations;)*, transformation-specification-body*)>
+<!attlist transformation-specification
+          id ID #IMPLIED
+         desc CDATA #IMPLIED
+          -- human readable description of specification --
+         partial (partial | complete) complete
+         -- is the specification complete is or is it just a fragment
+            to be used in other specifications? --
+          use -- reftype(transformation-specification|external-specification) --
+              IDREFS #IMPLIED -- Default: none --
+          entities
+          -- entities available to be specified as DTD for validation
+             of result document --
+              ENTITIES #IMPLIED -- Default: none --
+>
+
+<!element style-specification - O
+          ((%declarations;)*, style-specification-body*)>
+<!attlist style-specification
+          id ID #IMPLIED
+         desc CDATA #IMPLIED
+          -- human readable description of specification --
+         partial (partial | complete) complete
+         -- is the specification complete is or is it just a fragment
+            to be used in other specifications? --
+          use   -- reftype(style-specification|external-specification) --
+             IDREFS #IMPLIED -- Default: none --
+>
+
+<!-- Assign a local ID to a specification in another document. -->
+<!element external-specification - O EMPTY>
+<!attlist external-specification
+          id ID #REQUIRED
+          document -- document containing spec --
+                  ENTITY #REQUIRED 
+          specid -- id of spec in document --
+                  NAME #IMPLIED -- Default: first spec in document --
+>
+
+<!-- Declares features used by specification. -->
+<!element features - O (#PCDATA)
+  -- dlextype(featurename*) -->
+
+<!-- Map character numbers in a base character set to character names;
+not needed when system knows a character set, and all characters
+in character set have universal code. -->
+<!element baseset-encoding - O (#PCDATA)
+  -- dlextype((number, charname)*) -->
+<!attlist baseset-encoding
+          name CDATA #REQUIRED -- public identifier of baseset --
+>
+
+<!-- Map a character described in the SGML declaration with a minimum literal
+to a character name. -->
+<!element literal-described-char - O (#PCDATA)
+  -- dlextype(charname) -->
+<!attlist literal-described-char
+          desc CDATA #REQUIRED -- the literal description --
+>
+
+<!-- Declare additional characters allowed in name within DSSSL notation. -->
+<!element add-name-chars - O (#PCDATA)
+  -- dlextype(charname*) -->
+
+<!-- Declare additional characters allowed as separators within
+DSSSL notation. -->
+<!element add-separator-chars - O (#PCDATA)
+  -- dlextype(charname*) -->
+
+<!-- Define characters associating names with universal codes. -->
+
+<!element standard-chars - O (#PCDATA)
+  -- dlextype((charname, number))*) -->
+
+<!-- Define characters with no universal codes. -->
+
+<!element other-chars - O (#PCDATA)
+  -- dlextype(charname*) -->
+
+<!-- Map an SDATA entity onto a character. -->
+
+<!element map-sdata-entity - O (#PCDATA)
+  -- dlextype(charname) -->
+<!attlist map-sdata-entity
+         name CDATA #IMPLIED -- Default: mapping uses replacement text only --
+         text CDATA #IMPLIED -- Default: mapping uses name only --
+>
+
+<!-- Declare character combining. -->
+
+<!element combine-char - O (#PCDATA)
+  -- dlextype(charname, charname, charname+) -->
+
+<!-- Declare a character repertoire. -->
+<!element char-repertoire - O EMPTY>
+<!attlist char-repertoire
+          name -- public identifier for repertoire --
+               CDATA #REQUIRED 
+>
+
+<!element style-specification-body - - CDATA
+  -- content uses notation of DSSSL style language -->
+<!attlist style-specification-body
+          content ENTITY #CONREF -- Default: syntactic content --
+>
+
+<!element transformation-specification-body - - CDATA
+  -- content uses notation of DSSSL transformation language -->
+<!attlist transformation-specification-body
+          content ENTITY #CONREF -- Default: syntactic content --
+>
+
+<!-- This notation is intended for use as the value of the ArcDataF
+  architectural form support attribute. -->
+
+<!NOTATION dsssl-specification PUBLIC
+  "ISO/IEC 10179:1996//NOTATION DSSSL Specification//EN">
diff --git a/dsssl/extensions.dsl b/dsssl/extensions.dsl
new file mode 100644 (file)
index 0000000..ba7dbcd
--- /dev/null
@@ -0,0 +1,197 @@
+<!DOCTYPE style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN">
+
+
+<style-specification id="procedure">
+
+(define debug 
+  (external-procedure "UNREGISTERED::James Clark//Procedure::debug"))
+
+(define if-first-page 
+  (external-procedure "UNREGISTERED::James Clark//Procedure::if-first-page"))
+
+(define if-front-page
+  (external-procedure "UNREGISTERED::James Clark//Procedure::if-front-page"))
+
+(define all-element-number
+  (external-procedure "UNREGISTERED::James Clark//Procedure::all-element-number"))
+
+(define read-entity
+  (external-procedure "UNREGISTERED::James Clark//Procedure::read-entity"))
+
+(define language
+  (external-procedure "UNREGISTERED::OpenJade//Procedure::language"))
+
+(define sgml-parse
+  (external-procedure "UNREGISTERED::OpenJade//Procedure::sgml-parse"))
+
+(define expt
+  (external-procedure "UNREGISTERED::OpenJade//Procedure::expt"))
+
+
+<style-specification id="sgml">
+
+(declare-flow-object-class element
+  "UNREGISTERED::James Clark//Flow Object Class::element")
+
+(declare-flow-object-class empty-element
+  "UNREGISTERED::James Clark//Flow Object Class::empty-element")
+
+(declare-flow-object-class document-type
+  "UNREGISTERED::James Clark//Flow Object Class::document-type")
+
+(declare-flow-object-class processing-instruction
+  "UNREGISTERED::James Clark//Flow Object Class::processing-instruction")
+
+(declare-flow-object-class entity
+  "UNREGISTERED::James Clark//Flow Object Class::entity")
+
+(declare-flow-object-class entity-ref
+  "UNREGISTERED::James Clark//Flow Object Class::entity-ref")
+
+(declare-flow-object-class formatting-instruction
+  "UNREGISTERED::James Clark//Flow Object Class::formatting-instruction")
+
+(declare-characteristic preserve-sdata?
+  "UNREGISTERED::James Clark//Characteristic::preserve-sdata?"
+  #f)
+
+
+<style-specification id="rtf">
+
+(declare-characteristic heading-level
+  "UNREGISTERED::James Clark//Characteristic::heading-level"
+  0)
+
+(declare-characteristic page-number-format
+  "UNREGISTERED::James Clark//Characteristic::page-number-format"
+  "1")
+
+(declare-characteristic page-number-restart
+  "UNREGISTERED::James Clark//Characteristic::page-number-restart"
+  #f)
+
+(declare-characteristic page-n-columns
+  "UNREGISTERED::James Clark//Characteristic::page-n-columns"
+  1)
+
+(declare-characteristic page-column-sep
+  "UNREGISTERED::James Clark//Characteristic::page-column-sep"
+  .5in)
+
+(declare-characteristic page-balance-columns?
+  "UNREGISTERED::James Clark//Characteristic::page-balance-columns?"
+  #f)
+
+(declare-characteristic superscript-height
+  "UNREGISTERED::James Clark//Characteristic::superscript-height"
+  0pt)
+
+(declare-characteristic subscript-depth
+  "UNREGISTERED::James Clark//Characteristic::subscript-depth"
+  0pt)
+
+(declare-characteristic over-mark-height
+  "UNREGISTERED::James Clark//Characteristic::over-mark-height"
+  0pt)
+
+(declare-characteristic under-mark-depth
+  "UNREGISTERED::James Clark//Characteristic::under-mark-depth"
+  0pt)
+
+(declare-characteristic grid-row-sep
+  "UNREGISTERED::James Clark//Characteristic::grid-row-sep"
+  0pt)
+
+(declare-characteristic grid-column-sep
+  "UNREGISTERED::James Clark//Characteristic::grid-column-sep"
+  0pt)
+
+
+<style-specification id="tex">
+
+(declare-flow-object-class page-float
+  "UNREGISTERED::Sebastian Rahtz//Flow Object Class::page-float")
+
+(declare-flow-object-class page-footnote
+  "UNREGISTERED::Sebastian Rahtz//Flow Object Class::page-footnote")
+
+(declare-characteristic page-number-format
+  "UNREGISTERED::James Clark//Characteristic::page-number-format"
+  "1")
+
+(declare-characteristic page-number-restart
+  "UNREGISTERED::James Clark//Characteristic::page-number-restart"
+  #f)
+
+(declare-characteristic page-n-columns
+  "UNREGISTERED::James Clark//Characteristic::page-n-columns"
+  1)
+
+(declare-characteristic page-column-sep
+  "UNREGISTERED::James Clark//Characteristic::page-column-sep"
+  .5in)
+
+(declare-characteristic page-balance-columns?
+  "UNREGISTERED::James Clark//Characteristic::page-balance-columns?"
+  #f)
+
+(declare-characteristic page-two-side?
+  "UNREGISTERED::OpenJade//Characteristic::page-two-side?"
+  #f)
+
+(declare-characteristic two-side-start-on-right?
+  "UNREGISTERED::OpenJade//Characteristic::two-side-start-on-right?"
+  #f)
+
+(declare-characteristic superscript-height
+  "UNREGISTERED::James Clark//Characteristic::superscript-height"
+  0pt)
+
+(declare-characteristic subscript-depth
+  "UNREGISTERED::James Clark//Characteristic::subscript-depth"
+  0pt)
+
+(declare-characteristic over-mark-height
+  "UNREGISTERED::James Clark//Characteristic::over-mark-height"
+  0pt)
+
+(declare-characteristic under-mark-depth
+  "UNREGISTERED::James Clark//Characteristic::under-mark-depth"
+  0pt)
+
+(declare-characteristic grid-row-sep
+  "UNREGISTERED::James Clark//Characteristic::grid-row-sep"
+  0pt)
+
+(declare-characteristic grid-column-sep
+  "UNREGISTERED::James Clark//Characteristic::grid-column-sep"
+  0pt)
+
+(declare-characteristic preserve-sdata?
+  "UNREGISTERED::James Clark//Characteristic::preserve-sdata?"
+  #f)
+
+<style-specification id="mif">
+
+(declare-flow-object-class index-entry
+  "UNREGISTERED::ISOGEN//Flow Object Class::index-entry")
+
+(declare-characteristic page-n-columns
+  "UNREGISTERED::James Clark//Characteristic::page-n-columns"
+  1)
+
+(declare-characteristic page-column-sep
+  "UNREGISTERED::James Clark//Characteristic::page-column-sep"
+  .5in)
+
+(declare-characteristic page-balance-columns?
+  "UNREGISTERED::James Clark//Characteristic::page-balance-columns?"
+  #f)
+
+
+<style-specification id="html">
+
+(declare-characteristic scroll-title
+  "UNREGISTERED::James Clark//Characteristic::scroll-title"
+  #f)
+
diff --git a/dsssl/fot.dtd b/dsssl/fot.dtd
new file mode 100644 (file)
index 0000000..afe3576
--- /dev/null
@@ -0,0 +1,507 @@
+<!-- Typical use:
+
+<!DOCTYPE fot PUBLIC "-//James Clark//DTD DSSSL Flow Object Tree//EN" "fot.dtd">
+
+-->
+<!ENTITY % length-spec "CDATA">
+<!-- represents length-spec or #f; #f is represented by empty value -->
+<!ENTITY % opt-length-spec "CDATA"> 
+<!ENTITY % length "NMTOKEN">
+<!ENTITY % enum "NMTOKEN">
+<!ENTITY % enum-or-boolean "NMTOKEN">
+<!ENTITY % boolean "(true|false)">
+
+<!ENTITY % flow "
+(paragraph
+|sequence
+|display-group
+|line-field
+|link
+|scroll
+|marginalia
+|leader
+|sideline
+|box
+|score
+|table-row
+|math-sequence
+|unmath
+|subscript
+|superscript
+|grid
+|grid-cell
+|paragraph-break
+|external-graphic
+|rule
+|alignment-point
+|table-column
+|character
+|simple-page-sequence
+|fraction
+|script
+|mark
+|fence
+|radical
+|math-operator
+|table
+|table-part
+|table-cell
+|multi-mode
+|page-number
+|text
+|sdata
+|a
+|define-glyph-subst-table)*">
+
+<!ELEMENT fot %flow;>
+<!ELEMENT text (#PCDATA)>
+<!ELEMENT sdata EMPTY>
+<!ATTLIST sdata name CDATA #REQUIRED text CDATA #REQUIRED>
+
+<!ELEMENT paragraph %flow;>
+<!ELEMENT sequence %flow;>
+<!ELEMENT display-group %flow;>
+<!ELEMENT line-field %flow;>
+<!ELEMENT link %flow;>
+<!ELEMENT scroll %flow;>
+<!ELEMENT marginalia %flow;>
+<!ELEMENT leader %flow;>
+<!ELEMENT sideline %flow;>
+<!ELEMENT box %flow;>
+<!ELEMENT score %flow;>
+<!ELEMENT table-row %flow;>
+<!ELEMENT math-sequence %flow;>
+<!ELEMENT unmath %flow;>
+<!ELEMENT subscript %flow;>
+<!ELEMENT superscript %flow;>
+<!ELEMENT grid %flow;>
+<!ELEMENT grid-cell %flow;>
+<!ELEMENT paragraph-break EMPTY>
+<!ELEMENT external-graphic EMPTY>
+<!ELEMENT rule EMPTY>
+<!ELEMENT alignment-point EMPTY>
+<!ELEMENT table-column EMPTY>
+<!ELEMENT character EMPTY>
+
+<!ELEMENT page-number EMPTY>
+<!ATTLIST page-number ref CDATA #IMPLIED>
+
+<!ELEMENT define-glyph-subst-table (glyph-subst*)>
+<!ATTLIST define-glyph-subst-table id ID #REQUIRED>
+
+<!ELEMENT glyph-subst EMPTY>
+<!ATTLIST glyph-subst old CDATA #REQUIRED new CDATA #REQUIRED>
+
+<!ELEMENT a EMPTY>
+<!ATTLIST a
+  name CDATA #REQUIRED
+>
+
+<!ELEMENT simple-page-sequence
+  ((simple-page-sequence.right-header
+    |simple-page-sequence.center-header
+    |simple-page-sequence.left-header
+    |simple-page-sequence.right-footer
+    |simple-page-sequence.center-footer
+    |simple-page-sequence.left-footer)*,
+  %flow;)
+>
+
+<!ELEMENT simple-page-sequence.left-header %flow;>
+<!ELEMENT simple-page-sequence.right-header %flow;>
+<!ELEMENT simple-page-sequence.center-header %flow;>
+<!ELEMENT simple-page-sequence.left-footer %flow;>
+<!ELEMENT simple-page-sequence.right-footer %flow;>
+<!ELEMENT simple-page-sequence.center-footer %flow;>
+
+<!ENTITY % hf "
+  front %boolean; #IMPLIED
+  first %boolean; #IMPLIED
+">
+
+<!ATTLIST simple-page-sequence.right-header %hf;>
+<!ATTLIST simple-page-sequence.center-header %hf;>
+<!ATTLIST simple-page-sequence.left-footer %hf;>
+<!ATTLIST simple-page-sequence.right-footer %hf;>
+<!ATTLIST simple-page-sequence.center-footer %hf;>
+
+<!ELEMENT table
+(table.before-row-border, table.after-row-border,
+ table.before-column-border, table.after-column-border,
+ %flow;)>
+
+<!ELEMENT table.before-row-border EMPTY>
+<!ELEMENT table.after-row-border EMPTY>
+<!ELEMENT table.before-column-border EMPTY>
+<!ELEMENT table.after-column-border EMPTY>
+
+<!ELEMENT table-part
+ (table-part.principal, table-part.header, table-part.footer)
+>
+
+<!ELEMENT table-part.header %flow;>
+<!ELEMENT table-part.footer %flow;>
+<!ELEMENT table-part.principal %flow;>
+
+<!ELEMENT table-cell
+(table-cell.before-row-border, table-cell.after-row-border,
+ table-cell.before-column-border, table-cell.after-column-border,
+ %flow;)>
+
+<!ELEMENT table-cell.before-row-border EMPTY>
+<!ELEMENT table-cell.after-row-border EMPTY>
+<!ELEMENT table-cell.before-column-border EMPTY>
+<!ELEMENT table-cell.after-column-border EMPTY>
+
+<!ELEMENT fraction
+ (fraction.fraction-bar, fraction.numerator, fraction.denominator)>
+<!ELEMENT fraction.numerator %flow;>
+<!ELEMENT fraction.denominator %flow;>
+<!ELEMENT fraction.fraction-bar EMPTY>
+
+<!ELEMENT script (script.principal,
+ script.pre-sup, script.pre-sub,
+ script.post-sup, script.post-sub,
+ script.mid-sup, script.mid-sub)>
+
+<!ELEMENT script.principal %flow;>
+<!ELEMENT script.pre-sup %flow;>
+<!ELEMENT script.pre-sub %flow;>
+<!ELEMENT script.post-sup %flow;>
+<!ELEMENT script.post-sub %flow;>
+<!ELEMENT script.mid-sup %flow;>
+<!ELEMENT script.mid-sub %flow;>
+
+<!ELEMENT mark (mark.principal, mark.over-mark, mark.under-mark)>
+<!ELEMENT mark.principal %flow;>
+<!ELEMENT mark.over-mark %flow;>
+<!ELEMENT mark.under-mark %flow;>
+
+<!ELEMENT fence (fence.principal, fence.open, fence.close)>
+<!ELEMENT fence.principal %flow;>
+<!ELEMENT fence.open %flow;>
+<!ELEMENT fence.close %flow;>
+
+<!ELEMENT radical (radical.radical?, radical.principal, radical.degree)>
+<!ELEMENT radical.principal %flow;>
+<!ELEMENT radical.degree %flow;>
+<!ELEMENT radical.radical EMPTY>
+
+<!ELEMENT math-operator (math-operator.principal, math-operator.operator,
+           math-operator.lower-limit, math-operator.upper-limit)>
+<!ELEMENT math-operator.principal %flow;>
+<!ELEMENT math-operator.operator %flow;>
+<!ELEMENT math-operator.lower-limit %flow;>
+<!ELEMENT math-operator.upper-limit %flow;>
+
+<!ELEMENT multi-mode (multi-mode.mode, multi-mode.mode+)>
+<!ELEMENT multi-mode.mode %flow;>
+<!ATTLIST multi-mode.mode
+  name CDATA #IMPLIED
+  desc CDATA #IMPLIED
+>
+
+<!ENTITY % inherited-characteristics "
+font-size %length; #IMPLIED
+font-family-name CDATA #IMPLIED
+font-weight %enum-or-boolean; #IMPLIED
+font-posture %enum-or-boolean; #IMPLIED
+start-indent %length-spec; #IMPLIED
+end-indent %length-spec; #IMPLIED
+first-line-start-indent %length-spec; #IMPLIED
+last-line-end-indent %length-spec; #IMPLIED
+line-spacing %length-spec; #IMPLIED
+min-pre-line-spacing %opt-length-spec; #IMPLIED
+min-post-line-spacing %opt-length-spec; #IMPLIED
+min-leading %opt-length-spec; #IMPLIED
+field-width %length-spec; #IMPLIED
+lines %enum; #IMPLIED
+quadding %enum; #IMPLIED
+display-alignment %enum; #IMPLIED
+field-align %enum; #IMPLIED
+marginalia-side %enum; #IMPLIED
+principal-mode-simultaneous %boolean; #IMPLIED
+marginalia-sep %length-spec; #IMPLIED
+marginalia-keep-with-previous %boolean; #IMPLIED
+grid-equidistant-rows %boolean; #IMPLIED
+grid-equidistant-columns %boolean; #IMPLIED
+color CDATA #IMPLIED
+background-color CDATA #IMPLIED
+page-width %length; #IMPLIED
+page-height %length; #IMPLIED
+left-margin %length; #IMPLIED
+right-margin %length; #IMPLIED
+top-margin %length; #IMPLIED
+bottom-margin %length; #IMPLIED
+header-margin %length; #IMPLIED
+footer-margin %length; #IMPLIED
+border-present %boolean; #IMPLIED
+hyphenate %boolean; #IMPLIED
+kern %boolean; #IMPLIED
+ligature %boolean; #IMPLIED
+score-spaces %boolean; #IMPLIED
+float-out-marginalia %boolean; #IMPLIED
+float-out-sidelines %boolean; #IMPLIED
+float-out-line-numbers %boolean; #IMPLIED
+cell-background %boolean; #IMPLIED
+span-weak %boolean; #IMPLIED
+ignore-record-end %boolean; #IMPLIED
+numbered-lines %boolean; #IMPLIED
+hanging-punct %boolean; #IMPLIED
+box-open-end %boolean; #IMPLIED
+truncate-leader %boolean; #IMPLIED
+align-leader %boolean; #IMPLIED
+table-part-omit-middle-header %boolean; #IMPLIED
+table-part-omit-middle-footer %boolean; #IMPLIED
+border-omit-at-break %boolean; #IMPLIED
+line-join %enum; #IMPLIED
+line-cap %enum; #IMPLIED
+line-number-side %enum; #IMPLIED
+kern-mode %enum; #IMPLIED
+input-whitespace-treatment %enum; #IMPLIED
+filling-direction %enum; #IMPLIED
+writing-mode %enum; #IMPLIED
+last-line-quadding %enum; #IMPLIED
+math-display-mode %enum; #IMPLIED
+script-pre-align %enum; #IMPLIED
+script-post-align %enum; #IMPLIED
+script-mid-sup-align %enum; #IMPLIED
+script-mid-sub-align %enum; #IMPLIED
+numerator-align %enum; #IMPLIED
+denominator-align %enum; #IMPLIED
+grid-position-cell-type %enum; #IMPLIED
+grid-column-alignment %enum; #IMPLIED
+grid-row-Alignment %enum; #IMPLIED
+box-type %enum; #IMPLIED
+glyph-alignment-mode %enum; #IMPLIED
+box-border-alignment %enum; #IMPLIED
+cell-row-alignment %enum; #IMPLIED
+border-alignment %enum; #IMPLIED
+sideline-side %enum; #IMPLIED
+hyphenation-keep %enum-or-boolean; #IMPLIED
+font-structure %enum-or-boolean; #IMPLIED
+font-proportionate-width %enum-or-boolean; #IMPLIED
+cell-crossed %enum-or-boolean; #IMPLIED
+position-point-shift %length-spec; #IMPLIED
+start-margin %length-spec; #IMPLIED
+end-margin %length-spec; #IMPLIED
+sideline-sep %length-spec; #IMPLIED
+asis-wrap-indent %length-spec; #IMPLIED
+line-number-sep %length-spec; #IMPLIED
+last-line-justify-limit %length-spec; #IMPLIED
+justify-glyph-space-max-add %length-spec; #IMPLIED
+justify-glyph-space-max-remove %length-spec; #IMPLIED
+table-corner-radius %length-spec; #IMPLIED
+box-corner-radius %length-spec; #IMPLIED
+line-thickness %length; #IMPLIED
+cell-before-row-margin %length; #IMPLIED
+cell-after-row-margin %length; #IMPLIED
+cell-before-column-margin %length; #IMPLIED
+cell-after-column-margin %length; #IMPLIED
+line-sep %length; #IMPLIED
+box-size-before %length; #IMPLIED
+box-size-after %length; #IMPLIED
+country NMTOKEN #IMPLIED
+language NMTOKEN #IMPLIED
+expand-tabs NMTOKEN #IMPLIED
+hyphenation-ladder-count NMTOKEN #IMPLIED
+layer NMTOKEN #IMPLIED
+background-layer NMTOKEN #IMPLIED
+border-priority NMTOKEN #IMPLIED
+line-repeat NMTOKEN #IMPLIED
+span NMTOKEN #IMPLIED
+min-leader-repeat NMTOKEN #IMPLIED
+hyphenation-remain-char-count NMTOKEN #IMPLIED
+hyphenation-push-char-count NMTOKEN #IMPLIED
+widow-count NMTOKEN #IMPLIED
+orphan-count NMTOKEN #IMPLIED
+background-tile CDATA #IMPLIED
+line-breaking-method CDATA #IMPLIED
+line-composition-method CDATA #IMPLIED
+implicit-bidi-method CDATA #IMPLIED
+glyph-subst-method CDATA #IMPLIED
+glyph-reorder-method CDATA #IMPLIED
+hyphenation-method CDATA #IMPLIED
+table-auto-width-method CDATA #IMPLIED
+font-name CDATA #IMPLIED
+escapement-space-before CDATA #IMPLIED
+escapement-space-after CDATA #IMPLIED
+glyph-subst-table NMTOKENS #IMPLIED
+">
+
+<!ENTITY % display-nic "
+  position-preference %enum-or-boolean; #IMPLIED
+  keep-with-next %boolean; 'false'
+  keep-with-previous %boolean; 'false'
+  may-violate-keep-before %boolean; 'false'
+  may-violate-keep-after %boolean; 'false'
+  keep %enum-or-boolean; #IMPLIED
+  break-before %enum-or-boolean; #IMPLIED
+  break-after %enum-or-boolean; #IMPLIED
+  space-before CDATA #IMPLIED
+  space-before-conditional %boolean; #IMPLIED
+  space-before-priority NMTOKEN #IMPLIED
+  space-after CDATA #IMPLIED
+  space-after-conditional %boolean; #IMPLIED
+  space-after-priority NMTOKEN #IMPLIED
+">
+
+<!ENTITY % inline-nic "
+  break-before-priority NMTOKEN #IMPLIED
+  break-after-priority NMTOKEN #IMPLIED
+">
+
+<!ATTLIST sequence %inherited-characteristics;>
+<!ATTLIST line-field %inherited-characteristics;>
+<!ATTLIST simple-page-sequence %inherited-characteristics;>
+<!ATTLIST fraction %inherited-characteristics;>
+<!ATTLIST fraction.fraction-bar %inherited-characteristics;>
+<!ATTLIST math-sequence %inherited-characteristics;>
+<!ATTLIST unmath %inherited-characteristics;>
+<!ATTLIST subscript %inherited-characteristics;>
+<!ATTLIST superscript %inherited-characteristics;>
+<!ATTLIST script %inherited-characteristics;>
+<!ATTLIST mark %inherited-characteristics;>
+<!ATTLIST fence %inherited-characteristics;>
+<!ATTLIST radical %inherited-characteristics;>
+<!ATTLIST math-operator %inherited-characteristics;>
+<!ATTLIST sideline %inherited-characteristics;>
+<!ATTLIST scroll %inherited-characteristics;>
+<!ATTLIST marginalia %inherited-characteristics;>
+<!ATTLIST multi-mode %inherited-characteristics;>
+<!ATTLIST table-row %inherited-characteristics;>
+<!ATTLIST table.before-row-border %inherited-characteristics;>
+<!ATTLIST table.after-row-border %inherited-characteristics;>
+<!ATTLIST table.before-column-border %inherited-characteristics;>
+<!ATTLIST table.after-column-border %inherited-characteristics;>
+<!ATTLIST table-cell.before-row-border %inherited-characteristics;>
+<!ATTLIST table-cell.after-row-border %inherited-characteristics;>
+<!ATTLIST table-cell.before-column-border %inherited-characteristics;>
+<!ATTLIST table-cell.after-column-border %inherited-characteristics;>
+
+<!ATTLIST table-column
+  column-number NMTOKEN #REQUIRED
+  n-columns-spanned NMTOKEN #IMPLIED
+  width %length-spec; #IMPLIED
+  %inherited-characteristics;
+>
+
+<!ATTLIST table
+  width %length-spec; #IMPLIED
+  minimum-width %boolean; "false"
+  %display-nic;
+  %inherited-characteristics;
+>
+
+<!-- column-number of 0 has a special meaning: it identifies a dummy cell that
+     can be used to fill out the row if it later proves necessary to do so -->
+<!ATTLIST table-cell
+  column-number NMTOKEN #REQUIRED
+  n-columns-spanned NMTOKEN #IMPLIED
+  n-rows-spanned NMTOKEN #IMPLIED
+  %inherited-characteristics;
+>
+
+<!ATTLIST link
+  destination CDATA #IMPLIED
+  %inherited-characteristics;
+>
+
+<!ATTLIST box
+  display %boolean; "false"
+  %display-nic;
+  %inline-nic;
+  %inherited-characteristics;
+>
+
+<!ATTLIST score
+  type (before|through|after|char) #IMPLIED
+  type.length-spec %length-spec; #IMPLIED
+  char CDATA #IMPLIED
+  %inherited-characteristics;
+>
+
+<!ATTLIST leader
+  length %length-spec; #IMPLIED
+  %inherited-characteristics;
+  %inline-nic;
+>
+  
+<!ATTLIST rule
+  orientation (horizontal|vertical|escapement|line-progression)
+              #REQUIRED
+  length %length-spec; #IMPLIED
+  %display-nic;
+  %inline-nic;
+  %inherited-characteristics;
+>
+
+<!ATTLIST external-graphic
+  display %boolean; "false"
+  scale %enum; #IMPLIED
+  scale-x NMTOKEN #IMPLIED
+  scale-y NMTOKEN #IMPLIED
+  max-width %length-spec; #IMPLIED
+  max-height %length-spec; #IMPLIED
+  entity-system-id CDATA #REQUIRED
+  notation-system-id CDATA #REQUIRED
+  escapement-direction %enum; #IMPLIED
+  position-point-x %length-spec; #IMPLIED
+  position-point-y %length-spec; #IMPLIED
+  %inline-nic;
+  %display-nic;
+  %inherited-characteristics;
+>
+
+<!ATTLIST display-group
+  coalesce-id CDATA #IMPLIED
+  %display-nic;
+  %inherited-characteristics;
+>
+
+<!ATTLIST paragraph
+  %display-nic;
+  %inherited-characteristics;
+>
+
+<!ATTLIST paragraph-break
+  %display-nic;
+  %inherited-characteristics;
+>
+
+<!ATTLIST table-part
+  %display-nic;
+  %inherited-characteristics;
+>
+
+<!ENTITY % character-c "
+  char CDATA #IMPLIED
+  glyph-id CDATA #IMPLIED
+  drop-after-line-break %boolean; #IMPLIED
+  drop-unless-before-line-break %boolean; #IMPLIED
+  punct %boolean; #IMPLIED
+  space %boolean; #IMPLIED
+  input-tab %boolean; #IMPLIED
+  input-whitespace %boolean; #IMPLIED
+  record-end %boolean; #IMPLIED
+  break-before-priority NMTOKEN #IMPLIED
+  break-after-priority NMTOKEN #IMPLIED
+  math-font-posture %enum-or-boolean; #IMPLIED
+  math-class %enum; #IMPLIED
+  script CDATA #IMPLIED
+  %inherited-characteristics;">
+
+<!ATTLIST character %character-c;>
+<!ATTLIST radical.radical %character-c;>
+
+<!ATTLIST grid
+  grid-n-columns NMTOKEN #IMPLIED
+  grid-n-rows NMTOKEN #IMPLIED
+  %inherited-characteristics;
+>
+
+<!ATTLIST grid-cell
+  column-number NMTOKEN #IMPLIED
+  row-number NMTOKEN #IMPLIED
+  %inherited-characteristics;
+>
diff --git a/dsssl/style-sheet.dtd b/dsssl/style-sheet.dtd
new file mode 100644 (file)
index 0000000..c6e0448
--- /dev/null
@@ -0,0 +1,76 @@
+<!-- A DTD for DSSSL Style Sheets.  The public identifier for this is
+
+     "-//OpenJade//DTD DSSSL Style Sheet//EN"
+-->
+
+<!ENTITY % declarations
+ "add-name-chars | add-separator-chars | standard-chars | 
+  map-sdata-entity | char-repertoire"
+>
+
+<!element style-sheet o o ((%declarations;)*, style-specification,
+                          (external-specification|style-specification)*)>
+<!element style-specification o o ((%declarations;)*, style-specification-body)>
+<!attlist style-specification
+  id id #implied
+  use idrefs #implied
+>
+<!element style-specification-body o o (#pcdata)>
+<!attlist style-specification-body
+  content entity #conref
+>
+<!element external-specification - o empty>
+<!attlist external-specification
+  id id #required
+  document entity #required
+  specid name #implied
+>
+<!-- Declare additional characters allowed in name within DSSSL notation. -->
+<!element add-name-chars - O (#PCDATA)
+  -- dlextype(charname*) -->
+
+<!-- Declare additional characters allowed as separators within
+DSSSL notation. -->
+<!element add-separator-chars - O (#PCDATA)
+  -- dlextype(charname*) -->
+
+<!-- Define characters associating names with universal codes. -->
+
+<!element standard-chars - O (#PCDATA)
+  -- dlextype((charname, number))*) -->
+
+<!-- Map an SDATA entity onto a character. -->
+
+<!element map-sdata-entity - O (#PCDATA)
+  -- dlextype(charname) -->
+<!attlist map-sdata-entity
+         name CDATA #IMPLIED -- Default: mapping uses replacement text only --
+         text CDATA #IMPLIED -- Default: mapping uses name only --
+>
+
+<!-- Declare a character repertoire. -->
+<!element char-repertoire - O EMPTY>
+<!attlist char-repertoire
+          name -- public identifier for repertoire --
+               CDATA #REQUIRED
+>
+
+<?IS10744 ArcBase DSSSL>
+<!NOTATION DSSSL   PUBLIC "ISO/IEC 10179:1996//NOTATION
+                   DSSSL Architecture Definition Document//EN"
+                -- A document architecture conforming to the
+                   Architectural Form Definition Requirements of
+                   ISO/IEC 10744.     --
+>
+
+<!ATTLIST #NOTATION DSSSL
+                            -- Support attributes for all architectures --
+  ArcQuant CDATA #FIXED "NAMELEN 64"
+  ArcDTD CDATA #FIXED "%DSSSLDTD"
+  ArcDocF NAME #FIXED dsssl-specification
+  ArcDataF NAME #FIXED dsssl-specification
+>
+
+<!ENTITY % DSSSLDTD PUBLIC
+ "ISO/IEC 10179:1996//DTD DSSSL Architecture//EN"
+>
diff --git a/generic/EventGenerator.h b/generic/EventGenerator.h
new file mode 100644 (file)
index 0000000..49f8b17
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright (c) 1994 James Clark
+// See the file COPYING for copying permission.
+
+#ifndef EventGenerator_INCLUDED
+#define EventGenerator_INCLUDED 1
+
+#ifdef __GNUG__
+#pragma interface
+#endif
+
+#include "SGMLApplication.h"
+
+class SP_API EventGenerator {
+public:
+  virtual ~EventGenerator();
+  // Can be called at most once for any object.
+  // Returns number of errors.
+  virtual unsigned run(SGMLApplication &) = 0;
+  // may be called at any time
+  virtual void inhibitMessages(bool);
+  // may be called at any time, even from another thread
+  virtual void halt() = 0;
+  // called after run
+  virtual EventGenerator *
+    makeSubdocEventGenerator(const SGMLApplication::Char *systemId,
+                            size_t systemIdLength);
+};
+
+#endif /* not EventGenerator_INCLUDED */
diff --git a/generic/ParserEventGeneratorKit.h b/generic/ParserEventGeneratorKit.h
new file mode 100644 (file)
index 0000000..508fbb9
--- /dev/null
@@ -0,0 +1,52 @@
+// Copyright (c) 1995 James Clark
+// See the file COPYING for copying permission.
+
+#ifndef ParserEventGeneratorKit_INCLUDED
+#define ParserEventGeneratorKit_INCLUDED 1
+
+#ifdef __GNUG__
+#pragma interface
+#endif
+
+#include "EventGenerator.h"
+
+class ParserEventGeneratorKitImpl;
+
+class SP_API ParserEventGeneratorKit {
+public:
+  ParserEventGeneratorKit();
+  ~ParserEventGeneratorKit();
+  enum Option {
+    showOpenEntities,
+    showOpenElements,
+    outputCommentDecls,
+    outputMarkedSections,
+    outputGeneralEntities,
+    mapCatalogDocument
+  };
+  enum OptionWithArg {
+    addCatalog,
+    includeParam,
+    enableWarning,
+    addSearchDir,
+    activateLink,
+    architecture               // not implemented
+    };
+  void setOption(Option);
+#ifdef SP_WIDE_SYSTEM
+  void setProgramName(const wchar_t *);
+  void setOption(OptionWithArg, const wchar_t *);
+  EventGenerator *makeEventGenerator(int nFiles, wchar_t *const *files);
+#else
+  void setProgramName(const char *);
+  void setOption(OptionWithArg, const char *);
+  EventGenerator *makeEventGenerator(int nFiles, char *const *files);
+#endif
+private:
+  ParserEventGeneratorKit(const ParserEventGeneratorKit &); // undefined
+  void operator=(const ParserEventGeneratorKit &);   // undefined
+
+  ParserEventGeneratorKitImpl *impl_;
+};
+
+#endif /* not ParserEventGeneratorKit_INCLUDED */
diff --git a/generic/SGMLApplication.h b/generic/SGMLApplication.h
new file mode 100644 (file)
index 0000000..d490224
--- /dev/null
@@ -0,0 +1,312 @@
+// Copyright (c) 1995 James Clark
+// See the file COPYING for copying permission.
+
+#ifndef SGMLApplication_INCLUDED
+#define SGMLApplication_INCLUDED 1
+
+#ifdef __GNUG__
+#pragma interface
+#endif
+
+#include <stddef.h>
+
+#ifndef SP_API
+#define SP_API /* as nothing */
+#endif
+
+class SP_API SGMLApplication {
+public:
+#ifdef SP_MULTI_BYTE
+#ifdef SP_WCHAR_T_USHORT
+  typedef wchar_t Char;
+#else
+  typedef unsigned short Char;
+#endif
+#else
+  typedef unsigned char Char;
+#endif
+  // A Position represents a position in an OpenEntity.
+  // The meaning of a Position depends on the
+  // particular implementation of OpenEntity.
+  // It might be a line number or it might be
+  // an offset in the entity.  The only thing
+  // that can be done with Position is to use
+  // it with an OpenEntityPtr to get a Location.
+  typedef unsigned long Position;
+  struct CharString {
+    const Char *ptr;
+    size_t len;
+  };
+  struct ExternalId {
+    bool haveSystemId;
+    bool havePublicId;
+    bool haveGeneratedSystemId;
+    CharString systemId;       // valid only if haveSystemId is true
+    CharString publicId;       // valid only if havePublicId is true
+    CharString generatedSystemId; // valid if haveGeneratedSystemId is true
+  };
+  struct Notation {
+    CharString name;
+    ExternalId externalId;
+  };
+  struct Attribute;
+  struct Entity {
+    CharString name;
+    enum DataType { sgml, cdata, sdata, ndata, subdoc, pi };
+    enum DeclType { general, parameter, doctype, linktype };
+    DataType dataType;
+    DeclType declType;
+    bool isInternal;
+    // Following valid if isInternal is true
+    CharString text;
+    // Following valid if isInternal is false
+    ExternalId externalId;
+    size_t nAttributes;
+    const Attribute *attributes;
+    Notation notation;
+  };
+  struct Attribute {
+    CharString name;
+    enum Type {
+      invalid,
+      implied,
+      cdata,
+      tokenized
+      };
+    Type type;
+    enum Defaulted {
+      specified,               // not defaulted
+      definition,              // defaulted from definition
+      current                  // defaulted from current value
+      };
+    Defaulted defaulted;       // non-ESIS; valid only if type != implied
+    struct CdataChunk {
+      bool isSdata;
+      // This rather awkward representation of non-SGML characters was chosen
+      // for backwards compatibility.
+      bool isNonSgml;          // valid only if !isSdata
+      Char nonSgmlChar;                // valid only if isNonSgml
+      CharString data;         // always valid; empty if isNonSgml
+      CharString entityName;   // non-ESIS; optional for SDATA chunks
+    };
+    // Following valid if type == cdata
+    size_t nCdataChunks;
+    const CdataChunk *cdataChunks; // valid if type == cdata
+    // Following valid if type == tokenized
+    CharString tokens; // separated by spaces
+    bool isId;        // non-ESIS (probably)
+    bool isGroup;      // non-ESIS
+    size_t nEntities;
+    const Entity *entities;
+    // length of notation.name will be 0 if no notation
+    Notation notation;
+  };
+  struct PiEvent {
+    Position pos;
+    CharString data;
+    CharString entityName;     // non-ESIS; optional for PI entities
+  };
+  struct StartElementEvent {
+    Position pos;
+    enum ContentType {
+      empty,                   // declared EMPTY or with CONREF attribute
+      cdata,
+      rcdata,
+      mixed,
+      element
+      };
+    CharString gi;
+    ContentType contentType;   // non-ESIS
+    bool included;             // non-ESIS
+    size_t nAttributes;
+    const Attribute *attributes;
+  };
+      
+  struct EndElementEvent {
+    Position pos;
+    CharString gi;
+  };
+  struct DataEvent {
+    Position pos;
+    CharString data;
+  };
+  struct SdataEvent {
+    Position pos;
+    CharString text;
+    CharString entityName;     // non-ESIS; optional
+  };
+  struct ExternalDataEntityRefEvent {
+    Position pos;
+    Entity entity;
+  };
+  struct SubdocEntityRefEvent {
+    Position pos;
+    Entity entity;
+  };
+  struct NonSgmlCharEvent {
+    Position pos;
+    Char c;
+  };
+  struct ErrorEvent {
+    Position pos;
+    enum Type {
+      info,                    // not an error
+      warning,                 // not an error
+      quantity,
+      idref,
+      capacity,
+      otherError
+      };
+    Type type;
+    CharString message;
+  };
+  struct AppinfoEvent {
+    Position pos;
+    bool none;
+    CharString string;
+  };
+  struct StartDtdEvent {
+    Position pos;
+    CharString name;
+    bool haveExternalId;
+    ExternalId externalId;
+  };
+  struct EndDtdEvent {
+    Position pos;
+    CharString name;
+  };
+  struct EndPrologEvent {
+    Position pos;
+  };
+  // non-ESIS
+  struct GeneralEntityEvent {
+    // no position
+    Entity entity;
+  };
+  // non-ESIS
+  struct CommentDeclEvent {
+    Position pos;
+    size_t nComments;
+    const CharString *comments;
+    const CharString *seps;
+  };
+  // non-ESIS
+  struct MarkedSectionStartEvent {
+    Position pos;
+    enum Status {
+      include,
+      rcdata,
+      cdata,
+      ignore
+    };
+    Status status;
+    struct Param {
+      enum Type {
+       temp,
+       include,
+       rcdata,
+       cdata,
+       ignore,
+       entityRef
+       };
+      Type type;
+      CharString entityName;
+    };
+    size_t nParams;
+    const Param *params;
+  };
+  // non-ESIS
+  struct MarkedSectionEndEvent {
+    Position pos;
+    enum Status {
+      include,
+      rcdata,
+      cdata,
+      ignore
+    };
+    Status status;
+  };
+  struct IgnoredCharsEvent {
+    Position pos;
+    CharString data;
+  };
+  class OpenEntityPtr;
+  struct SP_API Location {
+    Location();
+    Location(const OpenEntityPtr &, Position);
+    void init();
+
+    unsigned long lineNumber;
+    unsigned long columnNumber;
+    unsigned long byteOffset;
+    unsigned long entityOffset;
+    CharString entityName;
+    CharString filename;
+    const void *other;
+  };
+  class OpenEntity;
+  class SP_API OpenEntityPtr {
+  public:
+    OpenEntityPtr();
+    OpenEntityPtr(const OpenEntityPtr &);
+    void operator=(const OpenEntityPtr &);
+    void operator=(OpenEntity *);
+    ~OpenEntityPtr();
+    const OpenEntity *operator->() const;
+    operator int() const;
+  private:
+    OpenEntity *ptr_;
+  };
+  class SP_API OpenEntity {
+  public:
+    OpenEntity();
+    virtual ~OpenEntity();
+    virtual Location location(Position) const = 0;
+  private:
+    OpenEntity(const OpenEntity &); // undefined
+    void operator=(const OpenEntity &);        // undefined
+    unsigned count_;
+    friend class OpenEntityPtr;
+  };
+  virtual ~SGMLApplication();
+  virtual void appinfo(const AppinfoEvent &);
+  virtual void startDtd(const StartDtdEvent &);
+  virtual void endDtd(const EndDtdEvent &);
+  virtual void endProlog(const EndPrologEvent &);
+  virtual void startElement(const StartElementEvent &);
+  virtual void endElement(const EndElementEvent &);
+  virtual void data(const DataEvent &);
+  virtual void sdata(const SdataEvent &);
+  virtual void pi(const PiEvent &);
+  virtual void externalDataEntityRef(const ExternalDataEntityRefEvent &);
+  virtual void subdocEntityRef(const SubdocEntityRefEvent &);
+  virtual void nonSgmlChar(const NonSgmlCharEvent &);
+  virtual void commentDecl(const CommentDeclEvent &);
+  virtual void markedSectionStart(const MarkedSectionStartEvent &);
+  virtual void markedSectionEnd(const MarkedSectionEndEvent &);
+  virtual void ignoredChars(const IgnoredCharsEvent &);
+  virtual void generalEntity(const GeneralEntityEvent &);
+  virtual void error(const ErrorEvent &);
+  virtual void openEntityChange(const OpenEntityPtr &);
+};
+
+inline
+const SGMLApplication::OpenEntity *
+SGMLApplication::OpenEntityPtr::operator->() const
+{
+  return ptr_;
+}
+
+inline
+void SGMLApplication::OpenEntityPtr::operator=(const OpenEntityPtr &ptr)
+{
+  *this = ptr.ptr_;
+}
+
+inline
+SGMLApplication::OpenEntityPtr::operator int() const
+{
+  return ptr_ != 0;
+}
+
+#endif /* not SGMLApplication_INCLUDED */
diff --git a/grove/LocNode.cxx b/grove/LocNode.cxx
new file mode 100644 (file)
index 0000000..119b933
--- /dev/null
@@ -0,0 +1,20 @@
+// Copyright (c) 1997 James Clark
+// See the file COPYING for copying permission.
+
+
+#include "config.h"
+#include "LocNode.h"
+
+#ifdef SP_NAMESPACE
+namespace SP_NAMESPACE {
+#endif
+
+#ifdef GROVE_NAMESPACE
+using namespace GROVE_NAMESPACE;
+#endif
+
+const Node::IID LocNode::iid = "LocNode";
+
+#ifdef SP_NAMESPACE
+}
+#endif
diff --git a/grove/LocNode.h b/grove/LocNode.h
new file mode 100644 (file)
index 0000000..713f29a
--- /dev/null
@@ -0,0 +1,41 @@
+// Copyright (c) 1997 James Clark
+// See the file COPYING for copying permission.
+
+#ifndef LocNode_INCLUDED
+#define LocNode_INCLUDED 1
+
+#include "Boolean.h"
+#include "Node.h"
+
+#ifdef SP_NAMESPACE
+namespace SP_NAMESPACE {
+#endif
+
+class Location;
+
+#ifdef GROVE_NAMESPACE
+#define GROVE_NAMESPACE_SCOPE GROVE_NAMESPACE::
+#else
+#define GROVE_NAMESPACE_SCOPE
+#endif
+
+class GROVE_API LocNode {
+public:
+  virtual GROVE_NAMESPACE_SCOPE AccessResult getLocation(Location &) const = 0;
+  static const GROVE_NAMESPACE_SCOPE Node::IID iid;
+  static const LocNode *convert(const GROVE_NAMESPACE_SCOPE NodePtr &nd) {
+    const void *p;
+    if (nd && nd->queryInterface(iid, p))
+      return (const LocNode *)p;
+    else
+      return 0;
+  }
+};
+
+#undef GROVE_NAMESPACE_SCOPE
+
+#ifdef SP_NAMESPACE
+}
+#endif
+
+#endif /* not LocNode_INCLUDED */
diff --git a/grove/Makefile.sub b/grove/Makefile.sub
new file mode 100644 (file)
index 0000000..e9cbeae
--- /dev/null
@@ -0,0 +1,4 @@
+LTVERSION=0:1:0
+LIB=ogrove
+DEPLIBS=-lm
+OBJS=Node.o LocNode.o
diff --git a/grove/Node.cxx b/grove/Node.cxx
new file mode 100644 (file)
index 0000000..1fb1353
--- /dev/null
@@ -0,0 +1,1566 @@
+// Copyright (c) 1996 James Clark
+// See the file COPYING for copying permission.
+
+#ifdef __GNUG__
+#pragma implementation
+#endif
+
+#include "config.h"
+#include "Boolean.h"
+#include "Node.h"
+#include "macros.h"
+#include <string.h>
+#include <assert.h>
+
+#ifdef GROVE_NAMESPACE
+namespace GROVE_NAMESPACE {
+#endif
+
+bool Node::queryInterface(IID, const void *&) const
+{
+  return 0;
+}
+
+AccessResult Node::getMessages(NodeListPtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getSeverity(Severity &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getOrigin(NodePtr &) const
+{
+  return accessNull;
+}
+
+AccessResult Node::getParent(NodePtr &) const
+{
+  return accessNull;
+}
+
+AccessResult Node::getGroveRoot(NodePtr &) const
+{
+  return accessNull;
+}
+
+AccessResult Node::getTreeRoot(NodePtr &nd) const
+{
+  // FIXME avoid cast -- need copy method
+  nd.assign((Node *)this);
+  for (;;) {
+    AccessResult res = nd->getParent(nd);
+    if (res != accessOK) {
+      if (res == accessTimeout)
+       return res;
+      break;
+    }
+  }
+  return accessOK;
+}
+
+AccessResult Node::getAttributes(NamedNodeListPtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getName(GroveString &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getSystemData(GroveString &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getEntity(NodePtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getEntityName(GroveString &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getExternalId(NodePtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getNotation(NodePtr &) const
+{
+  return accessNotInClass;
+}
+AccessResult Node::getText(GroveString &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getNotationName(GroveString &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getEntityType(EntityType::Enum &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getDefaulted(bool &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getPublicId(GroveString &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getSystemId(GroveString &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getGeneratedSystemId(GroveString &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getValue(NodeListPtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getTokenSep(GroveChar &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getImplied(bool &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getAttributeDef(NodePtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getCurrentAttributeIndex(long &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getCurrentGroup(NodeListPtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getDeclValueType(DeclValueType::Enum &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getDefaultValueType(DefaultValueType::Enum &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getDefaultValue(NodeListPtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getTokens(GroveStringListPtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getGi(GroveString &) const
+{
+  return accessNotInClass;
+}
+
+bool Node::hasGi(GroveString) const
+{
+  return 0;
+}
+
+AccessResult Node::getId(GroveString &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getContent(NodeListPtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getIncluded(bool &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getMustOmitEndTag(bool &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getAttributeDefs(NamedNodeListPtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getContentType(ContentType::Enum &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getExclusions(GroveStringListPtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getInclusions(GroveStringListPtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getModelGroup(NodePtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getOmitEndTag(bool &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getOmitStartTag(bool &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getConnector(Connector::Enum &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getOccurIndicator(OccurIndicator::Enum &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getContentTokens(NodeListPtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getDefaultEntity(NodePtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getElementType(NodePtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getParameterEntities(NamedNodeListPtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getToken(GroveString &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getReferent(NodePtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getGoverning(bool &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getGeneralEntities(NamedNodeListPtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getNotations(NamedNodeListPtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getElementTypes(NamedNodeListPtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getSgmlConstants(NodePtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getApplicationInfo(GroveString &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getProlog(NodeListPtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getEpilog(NodeListPtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getDocumentElement(NodePtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getElements(NamedNodeListPtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getEntities(NamedNodeListPtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getDefaultedEntities(NamedNodeListPtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getGoverningDoctype(NodePtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getDoctypesAndLinktypes(NamedNodeListPtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::getNonSgml(unsigned long &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::nextSibling(NodePtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::nextChunkAfter(NodePtr &nd) const
+{
+  AccessResult ret = firstChild(nd);
+  switch (ret) {
+  case accessOK:
+  case accessTimeout:
+    return ret;
+  default:
+    break;
+  }
+  for (;;) {
+    ret = nextChunkSibling(nd);
+    switch (ret) {
+    case accessOK:
+    case accessTimeout:
+      return ret;
+    default:
+      break;
+    }
+    ret = getParent(nd);
+    if (ret != accessOK)
+      break;
+  }
+  return ret;
+}
+
+AccessResult Node::nextChunkSibling(NodePtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::firstChild(NodePtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::charChunk(const SdataMapper &, GroveString &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::firstSibling(NodePtr &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::siblingsIndex(unsigned long &) const
+{
+  return accessNotInClass;
+}
+
+AccessResult Node::tokens(GroveString &) const
+{
+  return accessNotInClass;
+}
+
+unsigned long Node::hash() const
+{
+  // Hopefully implementations will do better.
+  return 0;
+}
+
+AccessResult Node::elementIndex(unsigned long &) const
+{
+  return accessNotInClass;
+}
+
+bool Node::chunkContains(const Node &nd) const
+{
+  return *this == nd;
+}
+
+AccessResult Node::attributeRef(unsigned long n, NodePtr &ptr) const
+{
+  NamedNodeListPtr atts;
+  AccessResult ret = getAttributes(atts);
+  if (ret != accessOK)
+    return ret;
+  return atts->nodeList()->ref(n, ptr);
+}
+
+AccessResult Node::followSiblingRef(unsigned long n, NodePtr &ptr) const
+{
+  if (n == 0)
+    return nextSibling(ptr);
+  NodePtr tem;
+  AccessResult ret = nextSibling(tem);
+  if (ret != accessOK)
+    return ret;
+  while (--n > 0) {
+    ret = tem.assignNextSibling();
+    if (ret != accessOK)
+      return ret;
+  }
+  return tem->nextSibling(ptr);
+}
+
+AccessResult Node::property(ComponentName::Id id,
+                           const SdataMapper &mapper,
+                           PropertyValue &value) const
+{
+  AccessResult ret;
+  switch (id) {
+  default:
+    ret = accessNotInClass;
+    break;
+  case ComponentName::idEntityType:
+    {
+      EntityType::Enum type;
+      ret = getEntityType(type);
+      if (ret == accessOK) {
+       switch (type) {
+         case EntityType::text: value.set(ComponentName::idText); break;
+         case EntityType::cdata: value.set(ComponentName::idCdata); break;
+         case EntityType::sdata: value.set(ComponentName::idSdata); break;
+         case EntityType::ndata: value.set(ComponentName::idNdata); break;
+         case EntityType::pi: value.set(ComponentName::idPi); break;
+         case EntityType::subdocument: value.set(ComponentName::idSubdocument); break;
+         default:
+           ret = accessNotInClass;
+       }
+      }
+      break;
+    }
+  case ComponentName::idDeclValueType:
+    {
+      DeclValueType::Enum type;
+      ret = getDeclValueType(type);
+      if (ret == accessOK) {
+       switch (type) {
+          case DeclValueType::cdata: value.set(ComponentName::idCdata); break;
+          case DeclValueType::entity: value.set(ComponentName::idEntity); break;
+          case DeclValueType::entities: value.set(ComponentName::idEntities); break;
+          case DeclValueType::id: value.set(ComponentName::idId); break;
+          case DeclValueType::idref: value.set(ComponentName::idIdref); break;
+          case DeclValueType::idrefs: value.set(ComponentName::idIdrefs); break;
+          case DeclValueType::name: value.set(ComponentName::idName); break;
+          case DeclValueType::names: value.set(ComponentName::idNames); break;
+          case DeclValueType::nmtoken: value.set(ComponentName::idNmtoken); break;
+          case DeclValueType::nmtokens: value.set(ComponentName::idNmtokens); break;
+          case DeclValueType::number: value.set(ComponentName::idNumber); break;
+          case DeclValueType::numbers: value.set(ComponentName::idNumbers); break;
+          case DeclValueType::nutoken: value.set(ComponentName::idNutoken); break;
+          case DeclValueType::nutokens: value.set(ComponentName::idNutokens); break;
+          case DeclValueType::notation: value.set(ComponentName::idNotation); break;
+          case DeclValueType::nmtkgrp: value.set(ComponentName::idNmtkgrp); break;
+        default:
+         ret = accessNotInClass;
+       }
+      }
+      break;
+    }
+  case ComponentName::idDefaultValueType:
+    {
+      DefaultValueType::Enum type;
+      ret = getDefaultValueType(type);
+      if (ret == accessOK) {
+       switch (type) {
+          case DefaultValueType::value: value.set(ComponentName::idValue); break;
+          case DefaultValueType::fixed: value.set(ComponentName::idFixed); break;
+          case DefaultValueType::required: value.set(ComponentName::idRequired); break;
+          case DefaultValueType::current: value.set(ComponentName::idCurrent); break;
+          case DefaultValueType::conref: value.set(ComponentName::idConref); break;
+          case DefaultValueType::implied: value.set(ComponentName::idImplied); break;
+        default:
+         ret = accessNotInClass;
+       }
+      }
+      break;
+    }
+  case ComponentName::idContentType:
+    {
+      ContentType::Enum type;
+      ret = getContentType(type);
+      if (ret == accessOK) {
+       switch (type) {
+          case ContentType::cdata: value.set(ComponentName::idCdata); break;
+          case ContentType::rcdata: value.set(ComponentName::idRcdata); break;
+          case ContentType::empty: value.set(ComponentName::idEmpty); break;
+          case ContentType::any: value.set(ComponentName::idAny); break;
+          case ContentType::modelgrp: value.set(ComponentName::idModelGroup); break;
+        default:
+         ret = accessNotInClass;
+       }
+      }
+      break;
+    }
+  case ComponentName::idConnector:
+    {
+      Connector::Enum type;
+      ret = getConnector(type);
+      if (ret == accessOK) {
+       switch (type) {
+          case Connector::and_: value.set(ComponentName::idAnd); break;
+          case Connector::or_: value.set(ComponentName::idOr); break;
+          case Connector::seq: value.set(ComponentName::idSeq); break;
+        default:
+         ret = accessNotInClass;
+       }
+      }
+      break;
+    }
+  case ComponentName::idChar:
+    {
+      GroveChar tem;
+      ret = getChar(mapper, tem);
+      if (ret == accessOK)
+       value.set(tem);
+      break;
+    }
+#define PROP(Name, Type) \
+  case ComponentName::id##Name: \
+    { \
+      Type tem; \
+      ret = get##Name(tem); \
+      if (ret == accessOK) \
+       value.set(tem); \
+      break; \
+    }
+#define PROP_BOOLEAN(name) PROP(name, bool)
+#define PROP_CHAR(name) PROP(name, GroveChar)
+#define PROP_COMPNAME(name) PROP(name, ComponentName::Id)
+#define PROP_CNMLIST(name) PROP(name, const ComponentName::Id *)
+#define PROP_STRING(name) PROP(name, GroveString)
+#define PROP_NODE(name) PROP(name, NodePtr)
+#define PROP_NODELIST(name) PROP(name, NodeListPtr)
+#define PROP_NMNDLIST(name) PROP(name, NamedNodeListPtr)
+#define PROP_STRINGLIST(name) PROP(name, GroveStringListPtr)
+#define PROP_INTEGER(name) PROP(name, long)
+  PROP_COMPNAME(ClassName)
+  PROP_COMPNAME(ChildrenPropertyName)
+  PROP_COMPNAME(DataPropertyName)
+  PROP_COMPNAME(DataSepPropertyName)
+  PROP_COMPNAME(OriginToSubnodeRelPropertyName)
+  PROP_CNMLIST(SubnodePropertyNames)
+  PROP_CNMLIST(AllPropertyNames)
+  PROP_BOOLEAN(Defaulted)
+  PROP_BOOLEAN(Governing)
+  PROP_BOOLEAN(Implied)
+  PROP_BOOLEAN(Included)
+  PROP_BOOLEAN(MustOmitEndTag)
+  PROP_BOOLEAN(OmitEndTag)
+  PROP_BOOLEAN(OmitStartTag)
+  PROP_CHAR(TokenSep)
+  PROP_NMNDLIST(Attributes)
+  PROP_NMNDLIST(DefaultedEntities)
+  PROP_NMNDLIST(DoctypesAndLinktypes)
+  PROP_NMNDLIST(Elements)
+  PROP_NMNDLIST(Entities)
+  PROP_NMNDLIST(GeneralEntities)
+  PROP_NMNDLIST(Notations)
+  PROP_NMNDLIST(AttributeDefs)
+  PROP_NMNDLIST(ElementTypes)
+  PROP_NMNDLIST(ParameterEntities)
+  PROP_NODE(DocumentElement)
+  PROP_NODE(Entity)
+  PROP_NODE(ExternalId)
+  PROP_NODE(GoverningDoctype)
+  PROP_NODE(GroveRoot)
+  PROP_NODE(Notation)
+  PROP_NODE(Origin)
+  PROP_NODE(Parent)
+  PROP_NODE(Referent)
+  PROP_NODE(SgmlConstants)
+  PROP_NODE(TreeRoot)
+  PROP_NODE(ModelGroup)
+  PROP_NODE(DefaultEntity)
+  PROP_NODE(ElementType)
+  PROP_NODELIST(Content)
+  PROP_NODELIST(Epilog)
+  PROP_NODELIST(Prolog)
+  PROP_NODELIST(Value)
+  PROP_NODELIST(ContentTokens)
+  PROP_NODELIST(DefaultValue)
+  PROP_NODELIST(CurrentGroup)
+  PROP_STRING(ApplicationInfo)
+  PROP_STRING(EntityName)
+  PROP_STRING(GeneratedSystemId)
+  PROP_STRING(Gi)
+  PROP_STRING(Id)
+  PROP_STRING(Name)
+  PROP_STRING(NotationName)
+  PROP_STRING(PublicId)
+  PROP_STRING(SystemData)
+  PROP_STRING(SystemId)
+  PROP_STRING(Text)
+  PROP_STRING(Token)
+  PROP_STRINGLIST(Exclusions)
+  PROP_STRINGLIST(Inclusions)
+  PROP_STRINGLIST(Tokens)
+  PROP_INTEGER(CurrentAttributeIndex)
+}
+#undef PROP
+#undef PROP_BOOLEAN
+#undef PROP_CHAR
+#undef PROP_NMNDLIST
+#undef PROP_NODE
+#undef PROP_NODELIST
+#undef PROP_STRING
+  return ret;
+}
+
+AccessResult NodeList::ref(unsigned long n, NodePtr &ptr) const
+{
+  if (n == 0)
+    return first(ptr);
+  NodeListPtr tem;
+  AccessResult ret = rest(tem);
+  if (ret != accessOK)
+    return ret;
+  while (--n > 0) {
+    ret = tem.assignRest();
+    if (ret != accessOK)
+      return ret;
+  }
+  return tem->first(ptr);
+}
+
+NodeListPtr NamedNodeList::nodeListNoOrder() const
+{
+  return nodeList();
+}
+
+struct NodeNameNodeVisitor : public NodeVisitor {
+  NodeNameNodeVisitor(NamedNodeList::Type t, GroveString &name)
+    : ret(accessNotInClass), type(t), nameP(&name) { }
+  AccessResult ret;
+  GroveString *nameP;
+  NamedNodeList::Type type;
+  void element(Node &nd) {
+    if (type == NamedNodeList::elements)
+      ret = nd.getId(*nameP);
+  }
+  void attributeAssignment(Node &nd) {
+    if (type == NamedNodeList::attributes)
+      ret = nd.getName(*nameP);
+  }
+  void documentType(Node &nd) {
+    if (type == NamedNodeList::doctypesAndLinktypes)
+      ret = nd.getName(*nameP);
+  }
+  void entity(Node &nd) {
+    if (type == NamedNodeList::entities)
+      ret = nd.getName(*nameP);
+  }
+  void notation(Node &nd) {
+    if (type == NamedNodeList::notations)
+      ret = nd.getName(*nameP);
+  }
+  void elementType(Node &nd) {
+    if (type == NamedNodeList::elementTypes)
+      ret = nd.getGi(*nameP);
+  }
+  void attributeDef(Node &nd) {
+    if (type == NamedNodeList::attributeDefs)
+      ret = nd.getName(*nameP);
+  }
+};
+
+AccessResult NamedNodeList::nodeName(const NodePtr &node, GroveString &name) const
+{
+  NodeNameNodeVisitor v(type(), name);
+  node->accept(v);
+  return v.ret;
+}
+
+void NodeVisitor::sgmlDocument(Node &)
+{
+}
+
+void NodeVisitor::sgmlConstants(Node &)
+{
+}
+
+void NodeVisitor::dataChar(Node &)
+{
+}
+
+void NodeVisitor::element(Node &)
+{
+}
+
+void NodeVisitor::attributeAssignment(Node &)
+{
+}
+
+void NodeVisitor::attributeDef(Node &)
+{
+}
+
+void NodeVisitor::attributeValueToken(Node &)
+{
+}
+
+void NodeVisitor::pi(Node &)
+{
+}
+
+void NodeVisitor::sdata(Node &)
+{
+}
+
+void NodeVisitor::documentType(Node &)
+{
+}
+
+void NodeVisitor::entity(Node &)
+{
+}
+
+void NodeVisitor::notation(Node &)
+{
+}
+
+void NodeVisitor::externalId(Node &)
+{
+}
+
+void NodeVisitor::externalData(Node &)
+{
+}
+
+void NodeVisitor::subdocument(Node &)
+{
+}
+
+void NodeVisitor::nonSgml(Node &)
+{
+}
+
+void NodeVisitor::message(Node &)
+{
+}
+
+void NodeVisitor::elementType(Node &)
+{
+}
+
+void NodeVisitor::modelGroup(Node &)
+{
+}
+
+void NodeVisitor::elementToken(Node &)
+{
+}
+
+void NodeVisitor::pcdataToken(Node &)
+{
+}
+
+void NodeVisitor::defaultEntity(Node &)
+{
+}
+
+bool GroveString::operator==(const GroveString &str) const
+{
+  if (size() != str.size())
+    return 0;
+  if (size() == 0)
+    return 1;
+  if (memcmp(data(), str.data(), size() * sizeof(GroveChar)) == 0)
+    return 1;
+  return 0;
+}
+
+void GroveStringList::append(const GroveString &gs)
+{
+  GroveStringLink **pp;
+  for (pp = &head_; *pp; pp = &(*pp)->next_)
+    ;
+  *pp = new GroveStringLink( gs );
+  if (iter_.done())
+    iter_.attach(head_);
+}
+
+AccessResult GroveStringList::first(GroveString &str) const
+{
+  if (head_ == 0)
+    return accessNull;
+  str = head_->data_;
+  return accessOK;
+}
+
+AccessResult GroveStringList::rest(GroveStringListPtr &ptr) const
+{
+  if (canReuse(ptr)) {
+    GroveStringList *list = (GroveStringList *)this;
+    if (list->iter_.done())
+      return accessNull;
+    list->iter_.next();
+    return accessOK;
+  }
+  ptr.assign(new GroveStringList());
+  ConstGroveStringListIter iter(iter_);
+  if (iter.done())
+    return accessNull;
+  iter.next();
+  while (!iter.done()) {
+    ptr->append(iter.cur());
+    iter.next();
+  }
+  return accessOK;
+}
+
+void GroveStringList::release()
+{
+  assert(refCount_ != 0);
+  if (--refCount_ == 0)
+    delete this;
+}
+
+void GroveStringList::addRef()
+{
+  ++refCount_;
+}
+
+bool GroveStringList::canReuse(GroveStringListPtr &ptr) const
+{
+  const GroveStringList *tem = &*ptr;
+  return tem == this && refCount_ == 1;
+}
+
+GroveStringList::~GroveStringList()
+{
+  GroveStringLink *tmpPtr;
+  GroveStringLink *ptr = head_;
+  while (ptr)
+  {
+    tmpPtr = ptr;
+    ptr = ptr->next_;
+    delete tmpPtr;
+  }
+}
+
+ConstGroveStringListIter::ConstGroveStringListIter(const GroveStringList &list)
+ : link_(list.head_)
+{
+}
+
+SdataMapper::~SdataMapper()
+{
+}
+
+bool SdataMapper::sdataMap(GroveString name, GroveString text, GroveChar &) const
+{
+  return 0;
+}
+
+const char *ComponentName::rcsName(Id id)
+{
+  static const char *const names[] = {
+    "allpns",
+    "and",
+    "any",
+    "appinfo",
+    "attasgn",
+    "attdef",
+    "attdefs",
+    "atts",
+    "attvaltk",
+    "cdata",
+    "char",
+    "childpn",
+    "classnm",
+    "connect",
+    "conref",
+    "content",
+    "tokens",
+    "contype",
+    "current",
+    "curattix",
+    "curgrp",
+    "datachar",
+    "datapn",
+    "dseppn",
+    "dcltype",
+    "dflted",
+    "dfltents",
+    "dfltent",
+    "dfltval",
+    "dflttype",
+    "dtlts",
+    "docelem",
+    "doctype",
+    "element",
+    "elements",
+    "elemtk",
+    "elemtype",
+    "elemtps",
+    "empty",
+    "entities",
+    "entity",
+    "entname",
+    "enttype",
+    "epilog",
+    "excls",
+    "extdata",
+    "extid",
+    "fixed",
+    "genents",
+    "gensysid",
+    "gi",
+    "govrning",
+    "govdt",
+    "grovroot",
+    "id",
+    "idref",
+    "idrefs",
+    "implied",
+    "included",
+    "incls",
+    "modelgrp",
+    "momitend",
+    "name",
+    "names",
+    "ndata",
+    "nmtkgrp",
+    "nmtoken",
+    "nmtokens",
+    "notation",
+    "notname",
+    "nots",
+    "number",
+    "numbers",
+    "nutoken",
+    "nutokens",
+    "occur",
+    "omitend",
+    "omitstrt",
+    "opt",
+    "or",
+    "origin",
+    "otsrelpn",
+    "parments",
+    "parent",
+    "pcdatatk",
+    "pi",
+    "plus",
+    "prolog",
+    "pubid",
+    "rcdata",
+    "referent",
+    "rep",
+    "required",
+    "sdata",
+    "seq",
+    "sgmlcsts",
+    "sgmldoc",
+    "subdoc",
+    "subpns",
+    "sysdata",
+    "sysid",
+    "text",
+    "token",
+    "tokens",
+    "tokensep",
+    "treeroot",
+    "value"
+  };
+  if (id < 0 || id >= SIZEOF(names))
+    return 0;
+  return names[id];
+}
+
+const char *ComponentName::sdqlName(Id id)
+{
+  static const char *const names[] = {
+    "all-property-names",
+    "and",
+    "any",
+    "application-info",
+    "attribute-assignment",
+    "attribute-def",
+    "attribute-defs",
+    "attributes",
+    "attribute-value-token",
+    "cdata",
+    "char",
+    "children-property-name",
+    "class-name",
+    "connector",
+    "conref",
+    "content",
+    "content-tokens",
+    "content-type",
+    "current",
+    "current-attribute-index",
+    "current-group",
+    "data-char",
+    "data-property-name",
+    "data-sep-property-name",
+    "decl-value-type",
+    "defaulted?",
+    "defaulted-entities",
+    "default-entity",
+    "default-value",
+    "default-value-type",
+    "doctypes-and-linktypes",
+    "document-element",
+    "document-type",
+    "element",
+    "elements",
+    "element-token",
+    "element-type",
+    "element-types",
+    "empty",
+    "entities",
+    "entity",
+    "entity-name",
+    "entity-type",
+    "epilog",
+    "exclusions",
+    "external-data",
+    "external-id",
+    "fixed",
+    "general-entities",
+    "generated-system-id",
+    "gi",
+    "governing?",
+    "governing-doctype",
+    "grove-root",
+    "id",
+    "idref",
+    "idrefs",
+    "implied?",
+    "included?",
+    "inclusions",
+    "model-group",
+    "must-omit-end-tag?",
+    "name",
+    "names",
+    "ndata",
+    "name-token-group",
+    "nmtoken",
+    "nmtokens",
+    "notation",
+    "notation-name",
+    "notations",
+    "number",
+    "numbers",
+    "nutoken",
+    "nutokens",
+    "occur-indicator",
+    "omit-end-tag?",
+    "omit-start-tag?",
+    "opt",
+    "or",
+    "origin",
+    "origin-to-subnode-rel-property-name",
+    "parameter-entities",
+    "parent",
+    "pcdata-token",
+    "pi",
+    "plus",
+    "prolog",
+    "public-id",
+    "rcdata",
+    "referent",
+    "rep",
+    "required",
+    "sdata",
+    "seq",
+    "sgml-constants",
+    "sgml-document",
+    "subdocument",
+    "subnode-property-names",
+    "system-data",
+    "system-id",
+    "text",
+    "token",
+    "tokens",
+    "token-sep",
+    "tree-root",
+    "value"
+  };
+  if (id < 0 || id >= SIZEOF(names))
+    return 0;
+  return names[id];
+}
+
+#define INTRINSIC_PROPS \
+  ComponentName::idClassName, \
+  ComponentName::idGroveRoot, \
+  ComponentName::idSubnodePropertyNames, \
+  ComponentName::idAllPropertyNames, \
+  ComponentName::idChildrenPropertyName, \
+  ComponentName::idDataPropertyName, \
+  ComponentName::idDataSepPropertyName, \
+  ComponentName::idParent, \
+  ComponentName::idTreeRoot, \
+  ComponentName::idOrigin, \
+  ComponentName::idOriginToSubnodeRelPropertyName
+
+  static const ComponentName::Id noProps[] = { ComponentName::noId };
+
+static const ComponentName::Id allProps_externalId[] = {
+  INTRINSIC_PROPS,
+  ComponentName::idPublicId,
+  ComponentName::idSystemId,
+  ComponentName::idGeneratedSystemId,
+  ComponentName::noId
+};
+const ClassDef ClassDef::externalId = {
+  ComponentName::idExternalId,
+  allProps_externalId,
+  noProps,
+  ComponentName::noId,
+  ComponentName::noId,
+  ComponentName::noId
+};
+static const ComponentName::Id allProps_documentType[] = {
+  INTRINSIC_PROPS,
+  ComponentName::idName,
+  ComponentName::idElementTypes,
+  ComponentName::idGoverning,
+  ComponentName::idGeneralEntities,
+  ComponentName::idNotations,
+  ComponentName::idDefaultEntity,
+  ComponentName::idParameterEntities,
+  ComponentName::noId
+};
+static const ComponentName::Id subnodeProps_documentType[] = {
+  ComponentName::idGeneralEntities,
+  ComponentName::idNotations,
+  ComponentName::idElementTypes,
+  ComponentName::idDefaultEntity,
+  ComponentName::idParameterEntities,
+  ComponentName::noId
+};
+const ClassDef ClassDef::documentType = {
+  ComponentName::idDocumentType,
+  allProps_documentType,
+  subnodeProps_documentType,
+  ComponentName::noId,
+  ComponentName::noId,
+  ComponentName::noId
+};
+static const ComponentName::Id allProps_attributeValueToken[] = {
+  INTRINSIC_PROPS,
+  ComponentName::idToken,
+  ComponentName::idEntity,
+  ComponentName::idNotation,
+  ComponentName::idReferent,
+  ComponentName::noId
+};
+const ClassDef ClassDef::attributeValueToken = {
+  ComponentName::idAttributeValueToken,
+  allProps_attributeValueToken,
+  noProps,
+  ComponentName::noId,
+  ComponentName::idToken,
+  ComponentName::noId
+};
+static const ComponentName::Id allProps_sgmlDocument[] = {
+  INTRINSIC_PROPS,
+  ComponentName::idSgmlConstants,
+  ComponentName::idApplicationInfo,
+  ComponentName::idProlog,
+  ComponentName::idEpilog,
+  ComponentName::idGoverningDoctype,
+  ComponentName::idDoctypesAndLinktypes,
+  ComponentName::idDocumentElement,
+  ComponentName::idElements,
+  ComponentName::idEntities,
+  ComponentName::idDefaultedEntities,
+  ComponentName::noId
+};
+static const ComponentName::Id subnodeProps_sgmlDocument[] = {
+  ComponentName::idSgmlConstants,
+  ComponentName::idProlog,
+  ComponentName::idEpilog,
+  ComponentName::idDoctypesAndLinktypes,
+  ComponentName::idDocumentElement,
+  ComponentName::idDefaultedEntities,
+  ComponentName::noId
+};
+const ClassDef ClassDef::sgmlDocument = {
+  ComponentName::idSgmlDocument,
+  allProps_sgmlDocument,
+  subnodeProps_sgmlDocument,
+  ComponentName::noId,
+  ComponentName::noId,
+  ComponentName::noId
+};
+static const ComponentName::Id allProps_dataChar[] = {
+  INTRINSIC_PROPS,
+  ComponentName::idChar,
+  ComponentName::noId
+};
+const ClassDef ClassDef::dataChar = {
+  ComponentName::idDataChar,
+  allProps_dataChar,
+  noProps,
+  ComponentName::noId,
+  ComponentName::idChar,
+  ComponentName::noId
+};
+static const ComponentName::Id allProps_subdocument[] = {
+  INTRINSIC_PROPS,
+  ComponentName::idEntityName,
+  ComponentName::idEntity,
+  ComponentName::noId
+};
+const ClassDef ClassDef::subdocument = {
+  ComponentName::idSubdocument,
+  allProps_subdocument,
+  noProps,
+  ComponentName::noId,
+  ComponentName::noId,
+  ComponentName::noId
+};
+static const ComponentName::Id allProps_pi[] = {
+  INTRINSIC_PROPS,
+  ComponentName::idSystemData,
+  ComponentName::idEntityName,
+  ComponentName::idEntity,
+  ComponentName::noId
+};
+const ClassDef ClassDef::pi = {
+  ComponentName::idPi,
+  allProps_pi,
+  noProps,
+  ComponentName::noId,
+  ComponentName::noId,
+  ComponentName::noId
+};
+static const ComponentName::Id allProps_element[] = {
+  INTRINSIC_PROPS,
+  ComponentName::idGi,
+  ComponentName::idId,
+  ComponentName::idAttributes,
+  ComponentName::idContent,
+  ComponentName::idIncluded,
+  ComponentName::idMustOmitEndTag,
+  ComponentName::idElementType,
+  ComponentName::noId
+};
+static const ComponentName::Id subnodeProps_element[] = {
+  ComponentName::idAttributes,
+  ComponentName::idContent,
+  ComponentName::noId
+};
+const ClassDef ClassDef::element = {
+  ComponentName::idElement,
+  allProps_element,
+  subnodeProps_element,
+  ComponentName::idContent,
+  ComponentName::noId,
+  ComponentName::noId
+};
+static const ComponentName::Id allProps_notation[] = {
+  INTRINSIC_PROPS,
+  ComponentName::idName,
+  ComponentName::idExternalId,
+  ComponentName::idAttributeDefs,
+  ComponentName::noId
+};
+static const ComponentName::Id subnodeProps_notation[] = {
+  ComponentName::idExternalId,
+  ComponentName::idAttributeDefs,
+  ComponentName::noId
+};
+const ClassDef ClassDef::notation = {
+  ComponentName::idNotation,
+  allProps_notation,
+  subnodeProps_notation,
+  ComponentName::noId,
+  ComponentName::noId,
+  ComponentName::noId
+};
+static const ComponentName::Id allProps_externalData[] = {
+  INTRINSIC_PROPS,
+  ComponentName::idEntityName,
+  ComponentName::idEntity,
+  ComponentName::noId
+};
+const ClassDef ClassDef::externalData = {
+  ComponentName::idExternalData,
+  allProps_externalData,
+  noProps,
+  ComponentName::noId,
+  ComponentName::noId,
+  ComponentName::noId
+};
+static const ComponentName::Id allProps_attributeAssignment[] = {
+  INTRINSIC_PROPS,
+  ComponentName::idAttributeDef,
+  ComponentName::idValue,
+  ComponentName::idName,
+  ComponentName::idImplied,
+  ComponentName::idTokenSep,
+  ComponentName::noId
+};
+static const ComponentName::Id subnodeProps_attributeAssignment[] = {
+  ComponentName::idValue,
+  ComponentName::noId
+};
+const ClassDef ClassDef::attributeAssignment = {
+  ComponentName::idAttributeAssignment,
+  allProps_attributeAssignment,
+  subnodeProps_attributeAssignment,
+  ComponentName::idValue,
+  ComponentName::noId,
+  ComponentName::idTokenSep
+};
+static const ComponentName::Id allProps_sdata[] = {
+  INTRINSIC_PROPS,
+  ComponentName::idSystemData,
+  ComponentName::idChar,
+  ComponentName::idEntityName,
+  ComponentName::idEntity,
+  ComponentName::noId
+};
+const ClassDef ClassDef::sdata = {
+  ComponentName::idSdata,
+  allProps_sdata,
+  noProps,
+  ComponentName::noId,
+  ComponentName::idChar,
+  ComponentName::noId
+};
+static const ComponentName::Id allProps_entity[] = {
+  INTRINSIC_PROPS,
+  ComponentName::idName,
+  ComponentName::idEntityType,
+  ComponentName::idText,
+  ComponentName::idExternalId,
+  ComponentName::idAttributes,
+  ComponentName::idNotationName,
+  ComponentName::idNotation,
+  ComponentName::idDefaulted,
+  ComponentName::noId
+};
+static const ComponentName::Id subnodeProps_entity[] = {
+  ComponentName::idExternalId,
+  ComponentName::idAttributes,
+  ComponentName::noId
+};
+const ClassDef ClassDef::entity = {
+  ComponentName::idEntity,
+  allProps_entity,
+  subnodeProps_entity,
+  ComponentName::noId,
+  ComponentName::noId,
+  ComponentName::noId
+};
+const ClassDef ClassDef::sgmlConstants = {
+  ComponentName::idSgmlConstants,
+  noProps,
+  noProps,
+  ComponentName::noId,
+  ComponentName::noId,
+  ComponentName::noId
+};
+// FIXME
+const ClassDef ClassDef::nonSgml = {
+  ComponentName::noId,
+  noProps,
+  noProps,
+  ComponentName::noId,
+  ComponentName::noId,
+  ComponentName::noId
+};
+// FIXME
+const ClassDef ClassDef::message = {
+  ComponentName::noId,
+  noProps,
+  noProps,
+  ComponentName::noId,
+  ComponentName::noId,
+  ComponentName::noId
+};
+static const ComponentName::Id allProps_attributeDef[] = {
+  INTRINSIC_PROPS,
+  ComponentName::idCurrentAttributeIndex,
+  ComponentName::idCurrentGroup,
+  ComponentName::idDeclValueType,
+  ComponentName::idDefaultValueType,
+  ComponentName::idDefaultValue,
+  ComponentName::idName,
+  ComponentName::idTokens,
+  ComponentName::noId
+};
+static const ComponentName::Id subnodeProps_attributeDef[] = {
+  ComponentName::idDefaultValue,
+  ComponentName::noId
+};
+const ClassDef ClassDef::attributeDef = {
+  ComponentName::idAttributeDef,
+  allProps_attributeDef,
+  subnodeProps_attributeDef,
+  ComponentName::noId,
+  ComponentName::noId,
+  ComponentName::noId
+};
+static const ComponentName::Id allProps_elementType[] = {
+  INTRINSIC_PROPS,
+  ComponentName::idAttributeDefs,
+  ComponentName::idContentType,
+  ComponentName::idExclusions,
+  ComponentName::idGi,
+  ComponentName::idInclusions,
+  ComponentName::idModelGroup,
+  ComponentName::idOmitEndTag,
+  ComponentName::idOmitStartTag,
+  ComponentName::noId
+};
+static const ComponentName::Id subnodeProps_elementType[] = {
+  ComponentName::idAttributeDefs,
+  ComponentName::idModelGroup,
+  ComponentName::noId
+};
+const ClassDef ClassDef::elementType = {
+  ComponentName::idElementType,
+  allProps_elementType,
+  subnodeProps_elementType,
+  ComponentName::noId,
+  ComponentName::noId,
+  ComponentName::noId
+};
+static const ComponentName::Id allProps_modelGroup[] = {
+  INTRINSIC_PROPS,
+  ComponentName::idConnector,
+  ComponentName::idOccurenceIndicator,
+  ComponentName::idContentTokens,
+  ComponentName::noId
+};
+static const ComponentName::Id subnodeProps_modelGroup[] = {
+  ComponentName::idContentTokens,
+  ComponentName::noId
+};
+const ClassDef ClassDef::modelGroup = {
+  ComponentName::idModelGroup,
+  allProps_modelGroup,
+  subnodeProps_modelGroup,
+  ComponentName::noId,
+  ComponentName::noId,
+  ComponentName::noId
+};
+static const ComponentName::Id allProps_elementToken[] = {
+  INTRINSIC_PROPS,
+  ComponentName::idGi,
+  ComponentName::idOccurenceIndicator,
+  ComponentName::noId
+};
+static const ComponentName::Id subnodeProps_elementToken[] = {
+  ComponentName::noId
+};
+const ClassDef ClassDef::elementToken = {
+  ComponentName::idElementToken,
+  allProps_elementToken,
+  subnodeProps_elementToken,
+  ComponentName::noId,
+  ComponentName::noId,
+  ComponentName::noId
+};
+static const ComponentName::Id allProps_pcdataToken[] = {
+  INTRINSIC_PROPS,
+  ComponentName::noId
+};
+static const ComponentName::Id subnodeProps_pcdataToken[] = {
+  ComponentName::noId
+};
+const ClassDef ClassDef::pcdataToken = {
+  ComponentName::idPcdataToken,
+  allProps_pcdataToken,
+  subnodeProps_pcdataToken,
+  ComponentName::noId,
+  ComponentName::noId,
+  ComponentName::noId
+};
+static const ComponentName::Id allProps_defaultEntity[] = {
+  INTRINSIC_PROPS,
+  ComponentName::idName,
+  ComponentName::idEntityType,
+  ComponentName::idText,
+  ComponentName::idExternalId,
+  ComponentName::idAttributes,
+  ComponentName::idNotationName,
+  ComponentName::idNotation,
+  ComponentName::noId
+};
+static const ComponentName::Id subnodeProps_defaultEntity[] = {
+  ComponentName::idExternalId,
+  ComponentName::idAttributes,
+  ComponentName::noId
+};
+const ClassDef ClassDef::defaultEntity = {
+  ComponentName::idDefaultEntity,
+  allProps_defaultEntity,
+  subnodeProps_defaultEntity,
+  ComponentName::noId,
+  ComponentName::noId,
+  ComponentName::noId
+};
+
+#ifdef GROVE_NAMESPACE
+}
+#endif
diff --git a/grove/Node.h b/grove/Node.h
new file mode 100644 (file)
index 0000000..cb7050d
--- /dev/null
@@ -0,0 +1,766 @@
+// Copyright (c) 1996 James Clark
+// See the file COPYING for copying permission.
+
+#ifndef Node_INCLUDED
+#define Node_INCLUDED 1
+#ifdef __GNUG__
+#pragma interface
+#endif
+
+#include <stddef.h>
+#include "IList.h"
+
+#ifdef SP_USE_DLL
+#ifdef BUILD_LIBGROVE
+#define GROVE_API SP_DLLEXPORT
+#else
+#define GROVE_API SP_DLLIMPORT
+#endif
+#else /* not SP_USE_DLL */
+#define GROVE_API /* as nothing */
+#endif /* not SP_USE_DLL */
+
+#ifdef GROVE_NAMESPACE
+#define GROVE_NAMESPACE_SCOPE GROVE_NAMESPACE::
+#else
+#define GROVE_NAMESPACE_SCOPE
+#endif
+
+// Supports the following modules:
+// baseabs prlgabs0 prlgabs1 instabs basesds0 instsds0 subdcabs
+
+#ifdef GROVE_NAMESPACE
+namespace GROVE_NAMESPACE {
+#endif
+
+#ifdef SP_MULTI_BYTE
+#ifdef SP_WCHAR_T_USHORT
+typedef wchar_t GroveChar;
+#else
+typedef unsigned int GroveChar;
+#endif
+#else /* not SP_MULTI_BYTE */
+typedef unsigned char GroveChar;
+#endif /* not SP_MULTI_BYTE */
+
+
+class NodePtr;
+class NodeListPtr;
+class NamedNodeListPtr;
+class GroveString;
+class NodeVisitor;
+class SdataMapper;
+class GroveStringList;
+class GroveStringListPtr;
+
+enum AccessResult {
+  accessOK,                    // success
+  accessNull,                  // value is null
+  accessTimeout,                // timed out waiting for property
+  accessNotInClass             // property is not defined for class
+};
+
+struct GROVE_API ComponentName {
+  enum Id {
+    noId = -1,
+    idAllPropertyNames,
+    idAnd,
+    idAny,
+    idApplicationInfo,
+    idAttributeAssignment,
+    idAttributeDef,
+    idAttributeDefs,
+    idAttributes,
+    idAttributeValueToken,
+    idCdata,
+    idChar,
+    idChildrenPropertyName,
+    idClassName,
+    idConnector,
+    idConref,
+    idContent,
+    idContentTokens,
+    idContentType,
+    idCurrent,
+    idCurrentAttributeIndex,
+    idCurrentGroup,
+    idDataChar,
+    idDataPropertyName,
+    idDataSepPropertyName,
+    idDeclValueType,
+    idDefaulted,
+    idDefaultedEntities,
+    idDefaultEntity,
+    idDefaultValue,
+    idDefaultValueType,
+    idDoctypesAndLinktypes,
+    idDocumentElement,
+    idDocumentType,
+    idElement,
+    idElements,
+    idElementToken,
+    idElementType,
+    idElementTypes,
+    idEmpty,
+    idEntities,
+    idEntity,
+    idEntityName,
+    idEntityType,
+    idEpilog,
+    idExclusions,
+    idExternalData,
+    idExternalId,
+    idFixed,
+    idGeneralEntities,
+    idGeneratedSystemId,
+    idGi,
+    idGoverning,
+    idGoverningDoctype,
+    idGroveRoot,
+    idId,
+    idIdref,
+    idIdrefs,
+    idImplied,
+    idIncluded,
+    idInclusions,
+    idModelGroup,
+    idMustOmitEndTag,
+    idName,
+    idNames,
+    idNdata,
+    idNmtkgrp,
+    idNmtoken,
+    idNmtokens,
+    idNotation,
+    idNotationName,
+    idNotations,
+    idNumber,
+    idNumbers,
+    idNutoken,
+    idNutokens,
+    idOccurenceIndicator,
+    idOmitEndTag,
+    idOmitStartTag,
+    idOpt,
+    idOr,
+    idOrigin,
+    idOriginToSubnodeRelPropertyName,
+    idParameterEntities,
+    idParent,
+    idPcdataToken,
+    idPi,
+    idPlus,
+    idProlog,
+    idPublicId,
+    idRcdata,
+    idReferent,
+    idRep,
+    idRequired,
+    idSdata,
+    idSeq,
+    idSgmlConstants,
+    idSgmlDocument,
+    idSubdocument,
+    idSubnodePropertyNames,
+    idSystemData,
+    idSystemId,
+    idText,
+    idToken,
+    idTokens,
+    idTokenSep,
+    idTreeRoot,
+    idValue
+  };
+  enum { nIds = idValue + 1 };
+  static const char *rcsName(Id);
+  static const char *sdqlName(Id);
+};
+
+struct GROVE_API ClassDef {
+  ComponentName::Id className;
+  const ComponentName::Id *allPropertyNames;
+  const ComponentName::Id *subnodePropertyNames;
+  ComponentName::Id childrenPropertyName;
+  ComponentName::Id dataPropertyName;
+  ComponentName::Id dataSepPropertyName;
+
+  static const ClassDef sgmlDocument;
+  static const ClassDef sgmlConstants;
+  static const ClassDef dataChar;
+  static const ClassDef element;
+  static const ClassDef attributeAssignment;
+  static const ClassDef attributeDef;
+  static const ClassDef attributeValueToken;
+  static const ClassDef pi;
+  static const ClassDef sdata;
+  static const ClassDef documentType;
+  static const ClassDef entity;
+  static const ClassDef notation;
+  static const ClassDef externalId;
+  static const ClassDef externalData;
+  static const ClassDef subdocument;
+  static const ClassDef nonSgml;
+  static const ClassDef message;
+  static const ClassDef elementType;
+  static const ClassDef modelGroup;
+  static const ClassDef elementToken;
+  static const ClassDef pcdataToken;
+  static const ClassDef defaultEntity;
+};
+
+class PropertyValue;
+
+class GROVE_API Node {
+public:
+  // property values
+  // data in GroveString valid till Node destroyed
+  // default is accessNotInClass
+  // Intrinsic properties.
+  virtual AccessResult getOrigin(NodePtr &) const;
+  virtual AccessResult getParent(NodePtr &) const;
+  virtual AccessResult getGroveRoot(NodePtr &) const;
+  virtual AccessResult getTreeRoot(NodePtr &) const;
+  virtual AccessResult getOriginToSubnodeRelPropertyName(ComponentName::Id &) const = 0;
+  AccessResult getClassName(ComponentName::Id &) const;
+  AccessResult getChildrenPropertyName(ComponentName::Id &) const;
+  AccessResult getDataPropertyName(ComponentName::Id &) const;
+  AccessResult getDataSepPropertyName(ComponentName::Id &) const;
+  AccessResult getSubnodePropertyNames(const ComponentName::Id *&) const;
+  AccessResult getAllPropertyNames(const ComponentName::Id *&) const;
+
+  // this allows you to apply some operation to a node
+  // according to its grove class
+  virtual void accept(NodeVisitor &) = 0;
+  virtual const ClassDef &classDef() const = 0;
+  // not formally properties
+  virtual AccessResult children(NodeListPtr &) const = 0;
+  virtual AccessResult follow(NodeListPtr &) const = 0;
+  // return accessNull if there isn't a first or next
+  // result accessNotInClass if datatype of otsnr is not node-list or named-node-list
+  virtual AccessResult nextSibling(NodePtr &) const;
+  // works the same as nextSibling(), except that when charChunk()
+  // returns accessOK, returns node following that chunk.
+  virtual AccessResult nextChunkSibling(NodePtr &) const;
+  // if result == accessOK, length must be > 0
+  virtual AccessResult nextChunkAfter(NodePtr &) const;
+  virtual AccessResult charChunk(const SdataMapper &, GroveString &) const;
+  // return accessNotInClass if class doesn't have children property
+  // return accessNull if there isn't a first child
+  virtual AccessResult firstChild(NodePtr &) const;
+  // First of this node's siblings.
+  // accessNotInClass if datatype of otsnr is not node-list or named-node-list
+  virtual AccessResult firstSibling(NodePtr &) const;
+  // The index of this node in the list of all its siblings.
+  virtual AccessResult siblingsIndex(unsigned long &) const;
+  // Has a default implementation in terms of getAttributes and NodeList::ref
+  virtual AccessResult attributeRef(unsigned long, NodePtr &) const;
+  // references the list of the following siblings
+  // 0 is the next sibling
+  // Has a default implementation in terms of nextSibling.
+  virtual AccessResult followSiblingRef(unsigned long, NodePtr &) const;
+  // For a tokenized attribute returns tokens separated by spaces;
+  // null for a non-tokenized attribute.
+  virtual AccessResult tokens(GroveString &) const;
+
+  // For an element, the number of elements started before it,
+  // that is its zero-based index in a pre-order traversal of
+  // the all the elements in the document.
+  virtual AccessResult elementIndex(unsigned long &) const;
+  // Node identity.
+  // if hash() returns different values for two nodes,
+  // the operator==() must return false for those two nodes.
+  virtual unsigned long hash() const;
+  // Implementation will usually need to call sameGrove().
+  virtual bool operator==(const Node &node) const = 0;
+  bool operator!=(const Node &node) const { return !(*this == node); }
+  // Does this chunk contains nd?
+  virtual bool chunkContains(const Node &nd) const;
+  bool sameGrove(const Node &node) const;
+  typedef const char *IID;
+  virtual bool queryInterface(IID, const void *&) const;
+  // Property on SGML document giving list of parser messages.
+  virtual AccessResult getMessages(NodeListPtr &) const;
+  // Property of message.
+  enum Severity { info, warning, error };
+  virtual AccessResult getSeverity(Severity &) const;
+  AccessResult property(ComponentName::Id, const SdataMapper &, PropertyValue &) const;
+  virtual unsigned groveIndex() const = 0;
+public:
+  virtual void addRef() = 0;
+  // You must call release rather than use delete.
+  // This is done automatically by NodePtr.
+  virtual void release() = 0;
+protected:
+  // This enforces this.
+#ifdef __GNUG__
+  virtual
+#endif
+    ~Node() { }
+public:
+  // This is special.
+  // Implemented in terms of charChunk().
+  AccessResult getChar(const SdataMapper &, GroveChar &) const;
+  // From here on derived algorithmically from property set.
+  // Properties common to several node classes.
+  virtual AccessResult getAttributes(NamedNodeListPtr &) const;
+  virtual AccessResult getName(GroveString &) const;
+  virtual AccessResult getSystemData(GroveString &) const;
+  virtual AccessResult getEntity(NodePtr &) const;
+  virtual AccessResult getEntityName(GroveString &) const;
+  virtual AccessResult getExternalId(NodePtr &) const;
+  virtual AccessResult getNotation(NodePtr &) const;
+  virtual AccessResult getGi(GroveString &) const;
+  struct OccurIndicator {
+    enum Enum { opt, plus, rep };
+  };
+  virtual AccessResult getOccurIndicator(OccurIndicator::Enum &) const;
+  virtual AccessResult getAttributeDefs(NamedNodeListPtr &) const;
+  virtual AccessResult getText(GroveString &) const;
+  virtual AccessResult getNotationName(GroveString &) const;
+  struct EntityType {
+    enum Enum { text, cdata, sdata, ndata, subdocument, pi };
+  };
+  virtual AccessResult getEntityType(EntityType::Enum &) const;
+  // Properties only on entity
+  virtual AccessResult getDefaulted(bool &) const;
+  // Properties only on externalId
+  virtual AccessResult getPublicId(GroveString &) const;
+  virtual AccessResult getSystemId(GroveString &) const;
+  virtual AccessResult getGeneratedSystemId(GroveString &) const;
+  // Properties only on attributeAssignment
+  virtual AccessResult getValue(NodeListPtr &) const;
+  virtual AccessResult getTokenSep(GroveChar &) const;
+  virtual AccessResult getImplied(bool &) const;
+  virtual AccessResult getAttributeDef(NodePtr &) const;
+  // Properties only on attributeDef
+  virtual AccessResult getCurrentAttributeIndex(long &) const;
+  virtual AccessResult getCurrentGroup(NodeListPtr &) const;
+  struct DeclValueType {
+    enum Enum { cdata, entity, entities, id, idref, idrefs, name, names, nmtoken,
+                nmtokens, number, numbers, nutoken, nutokens, notation, nmtkgrp };
+  };
+  virtual AccessResult getDeclValueType(DeclValueType::Enum &) const;
+  struct DefaultValueType {
+    enum Enum { value, fixed, required, current, conref, implied };
+  };
+  virtual AccessResult getDefaultValueType(DefaultValueType::Enum &) const;
+  virtual AccessResult getDefaultValue(NodeListPtr &) const;
+  virtual AccessResult getTokens(GroveStringListPtr &) const;
+  // Properties only on element.
+  virtual bool hasGi(GroveString) const;
+  virtual AccessResult getId(GroveString &) const;
+  virtual AccessResult getContent(NodeListPtr &) const;
+  virtual AccessResult getIncluded(bool &) const;
+  virtual AccessResult getMustOmitEndTag(bool &) const;
+  virtual AccessResult getElementType(NodePtr &) const;
+  // Properties only on elementType.
+  struct ContentType {
+    enum Enum { cdata, rcdata, empty, any, modelgrp };
+  };
+  virtual AccessResult getContentType(ContentType::Enum &) const;
+  virtual AccessResult getExclusions(GroveStringListPtr &) const;
+  virtual AccessResult getInclusions(GroveStringListPtr &) const;
+  virtual AccessResult getModelGroup(NodePtr &) const;
+  virtual AccessResult getOmitEndTag(bool &) const;
+  virtual AccessResult getOmitStartTag(bool &) const;
+  // Properties only on modelGroup.
+  struct Connector {
+    enum Enum { and_, or_, seq }; // "and", "or" can be keywords
+  };
+  virtual AccessResult getConnector(Connector::Enum &) const;
+  virtual AccessResult getContentTokens(NodeListPtr &) const;
+  // Properties only on attributeValueToken.
+  virtual AccessResult getToken(GroveString &) const;
+  virtual AccessResult getReferent(NodePtr &) const;
+  // Properties only on doctype
+  virtual AccessResult getGoverning(bool &) const;
+  virtual AccessResult getGeneralEntities(NamedNodeListPtr &) const;
+  virtual AccessResult getNotations(NamedNodeListPtr &) const;
+  virtual AccessResult getElementTypes(NamedNodeListPtr &) const;
+  virtual AccessResult getDefaultEntity(NodePtr &) const;
+  virtual AccessResult getParameterEntities(NamedNodeListPtr &) const;
+  // Properties only on sgmlDocument.
+  virtual AccessResult getSgmlConstants(NodePtr &) const;
+  virtual AccessResult getApplicationInfo(GroveString &) const;
+  virtual AccessResult getProlog(NodeListPtr &) const;
+  virtual AccessResult getEpilog(NodeListPtr &) const;
+  virtual AccessResult getDocumentElement(NodePtr &) const;
+  virtual AccessResult getElements(NamedNodeListPtr &) const;
+  virtual AccessResult getEntities(NamedNodeListPtr &) const;
+  virtual AccessResult getDefaultedEntities(NamedNodeListPtr &) const;
+  virtual AccessResult getGoverningDoctype(NodePtr &) const;
+  virtual AccessResult getDoctypesAndLinktypes(NamedNodeListPtr &) const;
+  // Properties only on dataChar.
+  // For a non-SGML data character (resulting from a numeric character reference).
+  // Something like this is being added in the HyTime TC.
+  virtual AccessResult getNonSgml(unsigned long &) const;
+};
+
+class GROVE_API NodeList {
+public:
+  virtual AccessResult first(NodePtr &) const = 0;
+  virtual AccessResult rest(NodeListPtr &) const = 0;
+  virtual AccessResult chunkRest(NodeListPtr &) const = 0;
+  // i is a zero based index
+  // This has a default implementation in terms of first and rest.
+  virtual AccessResult ref(unsigned long i, NodePtr &) const;
+  virtual void release() = 0;
+  virtual void addRef() = 0;
+protected:
+#ifdef __GNUG__
+  virtual
+#endif
+    ~NodeList() { }
+};
+
+class GROVE_API NamedNodeList {
+public:
+  // This must NOT assume that the string has been normalized.
+  virtual AccessResult namedNode(GroveString, NodePtr &) const = 0;
+  // Do name normalize appropriate for this NamedNodeList.
+  // Returns new size (always <= old size).
+  // This can be used even if list is empty
+  virtual size_t normalize(GroveChar *, size_t) const = 0;
+  // Could have used subtyping here, but accessing NamedNodeList
+  // positionally typically requires different data structure.
+  virtual NodeListPtr nodeList() const = 0;
+  // Use this when you don't care about the order.
+  // May be much more efficient than nodeList().
+  virtual NodeListPtr nodeListNoOrder() const;
+  enum Type {
+    elements,
+    attributes,
+    entities,
+    notations,
+    doctypesAndLinktypes,
+    elementTypes,
+    attributeDefs
+  };
+  virtual Type type() const = 0;
+  // If the node is of a class that occurs in the list,
+  // return the value of the property that serves as the name
+  // property for nodes of that class in the named node list.
+  // Return accessNotInClass if the node is not of a class
+  // that occurs in the list.
+  AccessResult nodeName(const NodePtr &, GroveString &) const;
+  virtual void release() = 0;
+  virtual void addRef() = 0;
+protected:
+#ifdef __GNUG__
+  virtual
+#endif
+    ~NamedNodeList() { }
+};
+
+class GROVE_API NodePtr {
+public:
+  NodePtr() : node_(0) { }
+  NodePtr(Node *node) : node_(node) { addRef(); }
+  ~NodePtr() { release(); }
+  NodePtr(const NodePtr &ptr) : node_(ptr.node_) { addRef(); }
+  NodePtr &operator=(const NodePtr &ptr) {
+    ptr.addRef();
+    release();
+    node_ = ptr.node_;
+    return *this;
+  }
+  Node *operator->() const { return node_; }
+  Node &operator*() const { return *node_; }
+  AccessResult assignOrigin() { return node_->getOrigin(*this); }
+  AccessResult assignFirstChild() { return node_->firstChild(*this); }
+  AccessResult assignNextSibling() { return node_->nextSibling(*this); }
+  AccessResult assignNextChunkSibling() {
+    return node_->nextChunkSibling(*this);
+  }
+  AccessResult assignNextChunkAfter() {
+    return node_->nextChunkAfter(*this);
+  }
+  AccessResult assignFirstSibling() { return node_->firstSibling(*this); }
+  void assign(Node *node) {
+    if (node)
+      node->addRef();
+    release();
+    node_ = node;
+  }
+  void clear() { release(); node_ = 0; }
+  operator bool() const { return node_ != 0; }
+private:
+  void addRef() const { if (node_) node_->addRef(); }
+  void release() const { if (node_) node_->release(); }
+  Node *node_;
+};
+
+class GROVE_API NodeListPtr {
+public:
+  NodeListPtr() : list_(0) { }
+  NodeListPtr(NodeList *list) : list_(list) { addRef(); }
+  ~NodeListPtr() { release(); }
+  NodeListPtr(const NodeListPtr &ptr) : list_(ptr.list_) { addRef(); }
+  NodeListPtr &operator=(const NodeListPtr &ptr) {
+    ptr.addRef();
+    release();
+    list_ = ptr.list_;
+    return *this;
+  }
+  AccessResult assignRest() { return list_->rest(*this); }
+  AccessResult assignChunkRest() { return list_->chunkRest(*this); }
+  NodeList *operator->() const { return list_; }
+  NodeList &operator*() const { return *list_; }
+  void assign(NodeList *list) {
+    if (list)
+      list->addRef();
+    release();
+    list_ = list;
+  }
+  void clear() { release(); list_ = 0; }
+  operator bool() const { return list_ != 0; }
+private:
+  void addRef() const { if (list_) list_->addRef(); }
+  void release() const { if (list_) list_->release(); }
+  NodeList *list_;
+};
+
+class GROVE_API NamedNodeListPtr {
+public:
+  NamedNodeListPtr() : list_(0) { }
+  NamedNodeListPtr(NamedNodeList *list) : list_(list) { addRef(); }
+  ~NamedNodeListPtr() { release(); }
+  NamedNodeListPtr(const NamedNodeListPtr &ptr) : list_(ptr.list_) { addRef(); }
+  NamedNodeListPtr &operator=(const NamedNodeListPtr &ptr) {
+    ptr.addRef();
+    release();
+    list_ = ptr.list_;
+    return *this;
+  }
+  NamedNodeList *operator->() const { return list_; }
+  NamedNodeList &operator*() const { return *list_; }
+  void assign(NamedNodeList *list) {
+    if (list)
+      list->addRef();
+    release();
+    list_ = list;
+  }
+  void clear() { release(); list_ = 0; }
+  operator bool() const { return list_ != 0; }
+private:
+  void addRef() const { if (list_) list_->addRef(); }
+  void release() const { if (list_) list_->release(); }
+  NamedNodeList *list_;
+};
+
+class GROVE_API GroveString {
+public:
+  typedef const GroveChar *const_iterator;
+  GroveString() : data_(0), size_(0) { }
+  GroveString(const GroveChar *data, size_t size)
+    : data_(data), size_(size) { }
+  size_t size() const { return size_; }
+  const GroveChar *data() const { return data_; }
+  void assign(const GroveChar *data, size_t size) {
+    data_ = data;
+    size_ = size;
+  }
+  bool operator==(const GroveString &str) const;
+  bool operator!=(const GroveString &str) const { return !(*this == str); }
+  GroveChar operator[](size_t i) const { return data_[i]; }
+  const_iterator begin() const { return data_; }
+  const_iterator end() const { return data_ + size_; }
+private:
+  const GroveChar *data_;
+  size_t size_;
+};
+
+class GROVE_API GroveStringLink {
+public:
+  GroveStringLink( const GroveString &gs )
+   : data_(gs), next_(0) { }
+  friend class GroveStringList;
+  friend class ConstGroveStringListIter;
+private:
+  GroveString data_;
+  GroveStringLink *next_;
+};
+
+class GroveStringList;
+
+class GROVE_API ConstGroveStringListIter {
+public:
+  friend class GroveStringList;
+  ConstGroveStringListIter() : link_(0) { }
+  ConstGroveStringListIter(const GroveStringList &list);
+  int done() const { return link_ == 0; }
+  const GroveString &cur() const { return link_->data_; }
+  void next() { link_ = link_->next_; }
+protected:
+  void attach(const GroveStringLink *link) { link_ = link; }
+  const GroveStringLink *link_;
+};
+
+class GROVE_API GroveStringList {
+public:
+  friend class ConstGroveStringListIter;
+  GroveStringList() : head_(0), refCount_(0) { }
+  ~GroveStringList();
+  void append(const GroveString &gs);
+  void release();
+  void addRef();
+  bool canReuse(GroveStringListPtr &ptr) const;
+  AccessResult first(GroveString &) const;
+  AccessResult rest(GroveStringListPtr &) const;
+  const ConstGroveStringListIter &iter() { return iter_; }
+private:
+  unsigned refCount_;
+  GroveStringLink *head_;
+  ConstGroveStringListIter iter_;
+};
+
+class GROVE_API GroveStringListPtr {
+public:
+  GroveStringListPtr() : list_(0) { }
+  GroveStringListPtr(GroveStringList *list) : list_(list) { addRef(); }
+  ~GroveStringListPtr() { release(); }
+  GroveStringListPtr(const GroveStringListPtr &ptr) : list_(ptr.list_) { addRef(); }
+  GroveStringListPtr &operator=(const GroveStringListPtr &ptr) {
+    ptr.addRef();
+    release();
+    list_ = ptr.list_;
+    return *this;
+  }
+  GroveStringList *operator->() const { return list_; }
+  GroveStringList &operator*() const { return *list_; }
+  void assign(GroveStringList *list) {
+    if (list)
+      list->addRef();
+    release();
+    list_ = list;
+  }
+  void clear() { release(); list_ = 0; }
+  operator bool() const { return list_ != 0; }
+private:
+  void addRef() const { if (list_) list_->addRef(); }
+  void release() const { if (list_) list_->release(); }
+  GroveStringList *list_;
+};
+
+class GROVE_API SdataMapper {
+public:
+  virtual ~SdataMapper();
+  // Returns a pointer to a single character or null
+  virtual bool sdataMap(GroveString name, GroveString text, GroveChar &) const;
+};
+
+// See Design Patterns.
+
+class GROVE_API NodeVisitor {
+public:
+  virtual void sgmlDocument(Node &);
+  virtual void sgmlConstants(Node &);
+  virtual void dataChar(Node &);
+  virtual void element(Node &);
+  virtual void attributeAssignment(Node &);
+  virtual void attributeDef(Node &);
+  virtual void attributeValueToken(Node &);
+  virtual void pi(Node &);
+  virtual void sdata(Node &);
+  virtual void documentType(Node &);
+  virtual void entity(Node &);
+  virtual void notation(Node &);
+  virtual void externalId(Node &);
+  virtual void externalData(Node &);
+  virtual void subdocument(Node &);
+  virtual void nonSgml(Node &);
+  virtual void message(Node &);
+  virtual void elementType(Node &);
+  virtual void modelGroup(Node &);
+  virtual void elementToken(Node &);
+  virtual void pcdataToken(Node &);
+  virtual void defaultEntity(Node &);
+};
+
+class GROVE_API PropertyValue {
+public:
+  virtual ~PropertyValue() { }
+  virtual void set(const NodePtr &) = 0;
+  virtual void set(const NodeListPtr &) = 0;
+  virtual void set(const NamedNodeListPtr &) = 0;
+  virtual void set(bool) = 0;
+  virtual void set(GroveChar) = 0;
+  virtual void set(GroveString) = 0;
+  virtual void set(ComponentName::Id) = 0;
+  virtual void set(const GroveStringListPtr &) = 0;
+  virtual void set(const ComponentName::Id *) = 0;
+  virtual void set(long) = 0;
+};
+
+inline
+AccessResult Node::getChar(const SdataMapper &mapper, GroveChar &c) const
+{
+  GroveString str;
+  AccessResult ret = charChunk(mapper, str);
+  if (ret == accessOK)
+    c = str[0];
+  return ret;
+}
+
+inline
+bool Node::sameGrove(const Node &node) const
+{
+  return groveIndex() == node.groveIndex();
+}
+
+inline
+AccessResult Node::getClassName(ComponentName::Id &name) const
+{
+  name = classDef().className;
+  return accessOK;
+}
+
+inline
+AccessResult Node::getChildrenPropertyName(ComponentName::Id &name) const
+{
+  const ClassDef &def = classDef();
+  if (def.childrenPropertyName == ComponentName::noId)
+    return accessNull;
+  name = def.childrenPropertyName;
+  return accessOK;
+}
+
+inline
+AccessResult Node::getDataPropertyName(ComponentName::Id &name) const
+{
+  const ClassDef &def = classDef();
+  if (def.dataPropertyName == ComponentName::noId)
+    return accessNull;
+  name = def.dataPropertyName;
+  return accessOK;
+}
+
+inline
+AccessResult Node::getDataSepPropertyName(ComponentName::Id &name) const
+{
+  const ClassDef &def = classDef();
+  if (def.dataSepPropertyName == ComponentName::noId)
+    return accessNull;
+  name = def.dataSepPropertyName;
+  return accessOK;
+}
+
+inline
+AccessResult Node::getSubnodePropertyNames(const ComponentName::Id *&names) const
+{
+  names = classDef().subnodePropertyNames;
+  return accessOK;
+}
+
+inline
+AccessResult Node::getAllPropertyNames(const ComponentName::Id *&names) const
+{
+   names = classDef().allPropertyNames;
+   return accessOK;
+}
+
+#ifdef GROVE_NAMESPACE
+}
+#endif
+
+#endif /* not Node_INCLUDED */
diff --git a/grove/grove.dsp b/grove/grove.dsp
new file mode 100644 (file)
index 0000000..c1472aa
--- /dev/null
@@ -0,0 +1,121 @@
+# Microsoft Developer Studio Project File - Name="grove" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=grove - Win32 Release
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "grove.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "grove.mak" CFG="grove - Win32 Release"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "grove - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "grove - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "grove - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir ".\Release"
+# PROP BASE Intermediate_Dir ".\Release"
+# PROP BASE Target_Dir "."
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir ".\Release"
+# PROP Intermediate_Dir ".\Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir "."
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\include" /D "BUILD_LIBGROVE" /D "NDEBUG" /D "_WINDOWS" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D "SP_MULTI_BYTE" /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x20200000" /subsystem:windows /dll /machine:I386 /out:"..\bin\ogrove13.dll"
+# SUBTRACT LINK32 /profile /map
+
+!ELSEIF  "$(CFG)" == "grove - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir ".\Debug"
+# PROP BASE Intermediate_Dir ".\Debug"
+# PROP BASE Target_Dir "."
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir ".\Debug"
+# PROP Intermediate_Dir ".\Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir "."
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\include" /D "BUILD_LIBGROVE" /D "_DEBUG" /D "_WINDOWS" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D "SP_MULTI_BYTE" /YX /FD /c
+# ADD BASE MTL /nologo /D "_DEBUG" /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x20200000" /subsystem:windows /dll /debug /machine:I386 /out:"..\dbgbin\ogrove13d.dll"
+# SUBTRACT LINK32 /incremental:no
+
+!ENDIF 
+
+# Begin Target
+
+# Name "grove - Win32 Release"
+# Name "grove - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat;for;f90"
+# Begin Source File
+
+SOURCE=.\LocNode.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\Node.cxx
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd"
+# Begin Source File
+
+SOURCE=.\LocNode.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\Node.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/groveoa/CGroveBuilder.cxx b/groveoa/CGroveBuilder.cxx
new file mode 100644 (file)
index 0000000..6ab10ed
--- /dev/null
@@ -0,0 +1,377 @@
+// CGroveBuilder.cpp : Implementation of CGroveBuilder
+
+#include "stdafx.h"
+#include "groveoa.h"
+#include "CGroveBuilder.h"
+#include "GroveBuilder.h"
+#include "ErrorCountEventHandler.h"
+#include "GroveNode.h"
+#include "MessageTable.h"
+#include "ArcEngine.h"
+#include <new>
+#include <signal.h>
+#include <process.h>
+#define STRICT
+#include <windows.h>
+
+using SP_NAMESPACE::StringC;
+
+#ifdef SP_NO_STD_NAMESPACE
+#define std /* as nothing */
+#endif
+
+#define TRY try {
+#define CATCH  } catch (std::bad_alloc) { return E_OUTOFMEMORY; }
+
+/* We need to keep a reference to the entity manager, because
+StoragePos can use storage managers that are owned by the entity
+manager. */
+
+class SpParserThread :
+       public ParserThread,
+       public SP_NAMESPACE::Messenger,
+       public SP_NAMESPACE::MessageFormatter {
+public:
+  SpParserThread() : cancel_(0) { }
+  ~SpParserThread();
+  void run();
+  void dispatchMessage(const SP_NAMESPACE::Message &);
+  SP_NAMESPACE::Boolean getMessageText(const SP_NAMESPACE::MessageFragment &, SP_NAMESPACE::StringC &);
+
+  SP_NAMESPACE::Owner<SP_NAMESPACE::EventHandler> eh;
+  SP_NAMESPACE::SgmlParser parser;
+  SP_NAMESPACE::Ptr<SP_NAMESPACE::EntityManager> em;
+  SP_NAMESPACE::Vector<SP_NAMESPACE::StringC> archNames;
+  static unsigned __stdcall start(void *p);
+private:
+  sig_atomic_t cancel_;
+  HANDLE thread_;
+};
+
+void convertBSTR(BSTR str, StringC &result)
+{
+  if (str)
+    result.assign(str, ::SysStringLen(str));
+  else
+    result.resize(0);
+}
+
+STDMETHODIMP CGroveBuilder::parse(BSTR sysid, SgmlDocumentNode **retval)
+{
+  return archParse( sysid, 0, retval );
+}
+
+STDMETHODIMP CGroveBuilder::archParse
+ (BSTR sysid, BSTR archNames, SgmlDocumentNode **retval)
+{
+  TRY
+  SpParserThread *parserThread = new SpParserThread;
+  SP_NAMESPACE::Owner<ParserThread> tem(parserThread);
+  if( archNames != 0 ) {
+    StringC archNames_;
+    convertBSTR(archNames, archNames_);
+    StringC archName;
+    for( short i = 0; i < archNames_.size(); i++ )
+      if( archNames_[i] != ' ' )
+        archName += archNames_[i];
+      else if( archName.size() != 0 ) {
+        parserThread->archNames.push_back( archName );
+        archName.resize( 0 );
+      }
+    if( archName.size() != 0 )
+      parserThread->archNames.push_back( archName );
+  }
+
+  GROVE_NAMESPACE::NodePtr root;
+  parserThread->eh
+    = SP_NAMESPACE::GroveBuilder::make(0, parserThread, parserThread, validateOnly_ != 0, root);
+  StringC str(sysid, sysid ? ::SysStringLen(sysid) : 0);
+  app_.initParser(str, parserThread->parser, parserThread->em);
+  parserThread->run();
+  return makeRootNode(root, tem, retval);
+  CATCH
+}
+
+static
+HRESULT makeBSTR(const StringC &str, BSTR *retval)
+{
+  if (str.size() == 0)
+    *retval = 0;
+  else {
+    *retval = ::SysAllocStringLen(str.data(), str.size());
+    if (!*retval)
+      return E_OUTOFMEMORY;
+  }
+  return NOERROR;
+}
+
+STDMETHODIMP CGroveBuilder::get_ExtraCatalogs(BSTR *retval)
+{
+  return makeBSTR(app_.extraCatalogs(), retval);
+}
+
+STDMETHODIMP CGroveBuilder::put_ExtraCatalogs(BSTR str)
+{
+  TRY
+  StringC tem;
+  convertBSTR(str, tem);
+  app_.setExtraCatalogs(tem);
+  return NOERROR;
+  CATCH
+}
+
+STDMETHODIMP CGroveBuilder::get_DefaultCatalogs(BSTR *retval)
+{
+  return makeBSTR(app_.defaultCatalogs(), retval);
+}
+
+STDMETHODIMP CGroveBuilder::put_DefaultCatalogs(BSTR str)
+{
+  TRY
+  StringC tem;
+  convertBSTR(str, tem);
+  app_.setDefaultCatalogs(tem);
+  return NOERROR;
+  CATCH
+}
+
+STDMETHODIMP CGroveBuilder::get_ExtraDirectories(BSTR *retval)
+{
+  return makeBSTR(app_.extraDirectories(), retval);
+}
+
+STDMETHODIMP CGroveBuilder::put_ExtraDirectories(BSTR str)
+{
+  TRY
+  StringC tem;
+  convertBSTR(str, tem);
+  app_.setExtraDirectories(tem);
+  return NOERROR;
+  CATCH
+}
+
+STDMETHODIMP CGroveBuilder::get_DefaultDirectories(BSTR *retval)
+{
+  return makeBSTR(app_.defaultDirectories(), retval);
+}
+
+STDMETHODIMP CGroveBuilder::put_DefaultDirectories(BSTR str)
+{
+  TRY
+  StringC tem;
+  convertBSTR(str, tem);
+  app_.setDefaultDirectories(tem);
+  return NOERROR;
+  CATCH
+}
+
+STDMETHODIMP CGroveBuilder::get_Encoding(BSTR *retval)
+{
+  return makeBSTR(app_.encoding(), retval);
+}
+
+STDMETHODIMP CGroveBuilder::put_Encoding(BSTR str)
+{
+  TRY
+  StringC tem;
+  convertBSTR(str, tem);
+  app_.setEncoding(tem);
+  // FIXME give an error for a illegal encoding
+  return NOERROR;
+  CATCH
+}
+
+STDMETHODIMP CGroveBuilder::get_DefaultEncoding(BSTR *retval)
+{
+  return makeBSTR(app_.defaultEncoding(), retval);
+}
+
+STDMETHODIMP CGroveBuilder::put_DefaultEncoding(BSTR str)
+{
+  TRY
+  StringC tem;
+  convertBSTR(str, tem);
+  app_.setDefaultEncoding(tem);
+  return NOERROR;
+  CATCH
+}
+
+STDMETHODIMP CGroveBuilder::get_Includes(BSTR *retval)
+{
+  TRY
+  SP_NAMESPACE::StringC tem;
+  for (size_t i = 0; i < app_.options.includes.size(); i++) {
+    if (i)
+      tem += ',';
+    tem += app_.options.includes[i];
+  }
+  return makeBSTR(tem, retval);
+  CATCH
+}
+
+STDMETHODIMP CGroveBuilder::put_Includes(BSTR str)
+{
+  TRY
+  SP_NAMESPACE::Vector<SP_NAMESPACE::StringC> &v = app_.options.includes;
+  v.resize(0);
+  if (str) {
+    SP_NAMESPACE::Boolean started = 0;
+    for (; *str; str++) {
+      if (*str == ',')
+       started = 0;
+      else {
+       if (!started) {
+         v.resize(v.size() + 1);
+         started = 1;
+       }
+       v.back() += *str;
+      }
+    }
+  }
+  return NOERROR;
+  CATCH
+}
+
+STDMETHODIMP CGroveBuilder::get_Warning(WarningType type, VARIANT_BOOL *retval)
+{
+  *retval = 0;
+  SP_NAMESPACE::PackedBoolean *p = lookupWarningType(type);
+  if (!p)
+    return E_INVALIDARG;
+  *retval = *p ? -1 : 0;
+  return NOERROR;
+}
+
+STDMETHODIMP CGroveBuilder::put_Warning(WarningType type, VARIANT_BOOL b)
+{
+  SP_NAMESPACE::PackedBoolean *p = lookupWarningType(type);
+  if (!p)
+    return E_INVALIDARG;
+  *p = b ? 1 : 0;
+  return NOERROR;
+}
+
+SP_NAMESPACE::PackedBoolean *CGroveBuilder::lookupWarningType(WarningType type)
+{
+  switch (type) {
+#define ENTRY(w) case warning##w: return &app_.options.warn##w;
+  ENTRY(SgmlDecl)
+  ENTRY(DuplicateEntity)
+  ENTRY(Should)
+  ENTRY(UndefinedElement)
+  ENTRY(DefaultEntityReference)
+  ENTRY(MixedContent)
+  ENTRY(EmptyTag)
+  ENTRY(UnusedMap)
+  ENTRY(UnusedParam)
+  ENTRY(NotationSystemId)
+#undef ENTRY
+  case warningUnclosedTag:
+    return &app_.options.noUnclosedTag;
+  case warningNet:
+    return &app_.options.noNet;
+  }
+  return 0;
+}
+
+STDMETHODIMP CGroveBuilder::get_Error(ErrorType type, VARIANT_BOOL *retval)
+{
+  *retval = 0;
+  if (type == errorValid) {
+    *retval = (app_.options.typeValid == 0 ? 0 : -1);
+    return NOERROR;
+  }
+  SP_NAMESPACE::PackedBoolean *p = lookupErrorType(type);
+  if (!p)
+    return E_INVALIDARG;
+  *retval = *p ? -1 : 0;
+  return NOERROR;
+}
+
+STDMETHODIMP CGroveBuilder::put_Error(ErrorType type, VARIANT_BOOL b)
+{
+  if (type == errorValid) {
+    app_.options.typeValid = (b ? SP_NAMESPACE::ParserOptions::sgmlDeclTypeValid : 0);
+    return NOERROR;
+  }
+  SP_NAMESPACE::PackedBoolean *p = lookupErrorType(type);
+  if (!p)
+    return E_INVALIDARG;
+  *p = b ? 1 : 0;
+  return NOERROR;
+}
+
+SP_NAMESPACE::PackedBoolean *CGroveBuilder::lookupErrorType(ErrorType type)
+{
+  switch (type) {
+#define ENTRY(e) case error##e: return &app_.options.error##e;
+  ENTRY(Idref)
+  ENTRY(Significant)
+  ENTRY(Afdr)
+#undef ENTRY
+  case errorLpdNotation:
+    return &errorLpdNotation_;
+  }
+  return 0;
+}
+
+STDMETHODIMP CGroveBuilder::get_ValidateOnly(VARIANT_BOOL *retval)
+{
+  *retval = validateOnly_;
+  return NOERROR;
+}
+
+STDMETHODIMP CGroveBuilder::put_ValidateOnly(VARIANT_BOOL b)
+{
+  validateOnly_ = b;
+  return NOERROR;
+}
+
+SpParserThread::~SpParserThread()
+{
+  cancel_ = 1;
+  ::WaitForSingleObject(thread_, INFINITE);
+  ::CloseHandle(thread_);
+}
+
+unsigned __stdcall SpParserThread::start(void *p)
+{
+  SpParserThread *arg = (SpParserThread *)p;
+  try {
+    if (arg->archNames.size() > 0) {
+      SP_NAMESPACE::SelectOneArcDirector director(arg->archNames, *arg->eh);
+      SP_NAMESPACE::ArcEngine::parseAll(arg->parser, director, director, &arg->cancel_);
+    } else
+      arg->parser.parseAll(*arg->eh, &arg->cancel_);
+  }
+  catch (std::bad_alloc) {
+    // FIXME how to report this?
+  }
+  arg->eh.clear();
+  // Release the parser
+  SP_NAMESPACE::SgmlParser tem;
+  tem.swap(arg->parser);
+  return 0;
+}
+
+void SpParserThread::run()
+{
+  unsigned id;
+  thread_ = HANDLE(_beginthreadex(NULL, 0, start, this, 0, &id));
+}
+
+void SpParserThread::dispatchMessage(const SP_NAMESPACE::Message &)
+{
+}
+
+SP_NAMESPACE::Boolean
+SpParserThread::getMessageText(const SP_NAMESPACE::MessageFragment &frag,
+                              StringC &text)
+{
+  SP_NAMESPACE::String<SP_NAMESPACE::SP_TCHAR> str;
+  if (!SP_NAMESPACE::MessageTable::instance()->getText(frag, str))
+    return 0;
+  text.assign((const SP_NAMESPACE::Char *)str.data(), str.size());
+  return 1;
+}
diff --git a/groveoa/CGroveBuilder.h b/groveoa/CGroveBuilder.h
new file mode 100644 (file)
index 0000000..137c366
--- /dev/null
@@ -0,0 +1,61 @@
+// CGroveBuilder.h : Declaration of the CGroveBuilder
+
+#ifndef __GROVEBUILDER_H_
+#define __GROVEBUILDER_H_
+
+#include "resource.h"       // main symbols
+#include "config.h"
+#include "WinApp.h"
+#include "Message.h"
+#include "MessageFormatter.h"
+
+/////////////////////////////////////////////////////////////////////////////
+// CGroveBuilder
+class ATL_NO_VTABLE CGroveBuilder : 
+       public CComObjectRoot,
+       public CComCoClass<CGroveBuilder, &CLSID_GroveBuilder>,
+       public IDispatchImpl<_GroveBuilder, &IID__GroveBuilder, &LIBID_GROVE>
+{
+public:
+       CGroveBuilder() : validateOnly_(0), errorLpdNotation_(0) { }
+
+DECLARE_REGISTRY_RESOURCEID(IDR_GROVEBUILDER)
+
+BEGIN_COM_MAP(CGroveBuilder)
+       COM_INTERFACE_ENTRY(_GroveBuilder)
+       COM_INTERFACE_ENTRY(IDispatch)
+END_COM_MAP()
+// IGroveBuilder
+public:
+       STDMETHOD(parse)(BSTR sysid, SgmlDocumentNode **root);
+       STDMETHOD(archParse)(BSTR sysid, BSTR archNames, SgmlDocumentNode **root);
+       STDMETHOD(get_ExtraCatalogs)(BSTR *);
+       STDMETHOD(put_ExtraCatalogs)(BSTR);
+       STDMETHOD(get_DefaultCatalogs)(BSTR *);
+       STDMETHOD(put_DefaultCatalogs)(BSTR);
+       STDMETHOD(get_ExtraDirectories)(BSTR *);
+       STDMETHOD(put_ExtraDirectories)(BSTR);
+       STDMETHOD(get_DefaultDirectories)(BSTR *);
+       STDMETHOD(put_DefaultDirectories)(BSTR);
+       STDMETHOD(get_Encoding)(BSTR *);
+       STDMETHOD(put_Encoding)(BSTR);
+       STDMETHOD(get_DefaultEncoding)(BSTR *);
+       STDMETHOD(put_DefaultEncoding)(BSTR);
+       STDMETHOD(get_Includes)(BSTR *);
+       STDMETHOD(put_Includes)(BSTR);
+       STDMETHOD(get_Warning)(WarningType, VARIANT_BOOL *);
+       STDMETHOD(put_Warning)(WarningType, VARIANT_BOOL);
+       STDMETHOD(get_Error)(ErrorType, VARIANT_BOOL *);
+       STDMETHOD(put_Error)(ErrorType, VARIANT_BOOL);
+       STDMETHOD(get_ValidateOnly)(VARIANT_BOOL *);
+       STDMETHOD(put_ValidateOnly)(VARIANT_BOOL);
+private:
+        SP_NAMESPACE::PackedBoolean *lookupWarningType(WarningType type);
+       SP_NAMESPACE::PackedBoolean *lookupErrorType(ErrorType type);
+       SP_NAMESPACE::WinApp app_;
+       VARIANT_BOOL validateOnly_;
+       // This is just for binary compatibility.
+       SP_NAMESPACE::PackedBoolean errorLpdNotation_;
+};
+
+#endif //__GROVEBUILDER_H_
diff --git a/groveoa/GroveBuilder.rgs b/groveoa/GroveBuilder.rgs
new file mode 100644 (file)
index 0000000..ed6ca76
--- /dev/null
@@ -0,0 +1,25 @@
+HKCR
+{
+       SP.GroveBuilder.1 = s 'GroveBuilder Class'
+       {
+               CLSID = s '{557CE382-9EBD-11D0-9083-0020AF41CFC2}'
+       }
+       SP.GroveBuilder = s 'GroveBuilder Class'
+       {
+               CLSID = s '{557CE382-9EBD-11D0-9083-0020AF41CFC2}'
+               CurVer = s 'SP.GroveBuilder.1'
+       }
+       NoRemove CLSID
+       {
+               ForceRemove {557CE382-9EBD-11D0-9083-0020AF41CFC2} = s 'GroveBuilder Class'
+               {
+                       ProgID = s 'SP.GroveBuilder.1'
+                       VersionIndependentProgID = s 'SP.GroveBuilder'
+                       ForceRemove 'Programmable'
+                       InprocServer32 = s '%MODULE%'
+                       {
+                               val ThreadingModel = s 'Apartment'
+                       }
+               }
+       }
+}
diff --git a/groveoa/GroveNode.cxx b/groveoa/GroveNode.cxx
new file mode 100644 (file)
index 0000000..25ec9c1
--- /dev/null
@@ -0,0 +1,1483 @@
+// GroveNode.cxx
+
+#include "stdafx.h"
+#include "groveoa.h"
+#include "config.h"
+#include "GroveNode.h"
+#include "Boolean.h"
+#include "Node.h"
+#include "LocNode.h"
+#include "PointerTable.h"
+#include "NamedResource.h"
+#include "Ptr.h"
+#include "Owner.h"
+#include "ExtendEntityManager.h"
+#include "StorageManager.h"
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <new>
+
+#ifdef SP_NO_STD_NAMESPACE
+#define std /* as nothing */
+#endif
+
+#define TRY try {
+#define CATCH  } catch (std::bad_alloc) { return E_OUTOFMEMORY; }
+
+// A NULL BSTR is supposed to be equivalent to an empty BSTR
+// but not everybody gets this right (perl build 306, for example)
+
+inline
+BSTR makeEmptyBSTR()
+{
+  return ::SysAllocStringLen(0, 0);
+}
+
+using GROVE_NAMESPACE::NodePtr;
+using GROVE_NAMESPACE::NodeListPtr;
+using GROVE_NAMESPACE::NamedNodeListPtr;
+using GROVE_NAMESPACE::GroveString;
+using GROVE_NAMESPACE::GroveStringList;
+using GROVE_NAMESPACE::GroveStringListPtr;
+using GROVE_NAMESPACE::ConstGroveStringListIter;
+using GROVE_NAMESPACE::GroveChar;
+using GROVE_NAMESPACE::accessOK;
+using GROVE_NAMESPACE::accessNull;
+using GROVE_NAMESPACE::accessNotInClass;
+using GROVE_NAMESPACE::SdataMapper;
+
+class NodeTable;
+typedef SP_NAMESPACE::Ptr<NodeTable> NodeTablePtr;
+
+class ATL_NO_VTABLE CStringList :
+       public CComObjectRoot,
+       public IDispatchImpl<StringList, &IID_StringList, &LIBID_GROVE> {
+public:
+    CStringList() { }
+BEGIN_COM_MAP(CStringList)
+   COM_INTERFACE_ENTRY(IDispatch)
+   COM_INTERFACE_ENTRY(StringList)
+END_COM_MAP()
+    STDMETHOD(get_Count)(long *);
+    STDMETHOD(get_Item)(long, BSTR *retval);
+    STDMETHOD(First)(BSTR *retval);
+    STDMETHOD(Rest)(StringList **);
+    static HRESULT make(const GroveStringListPtr &, StringList **);
+private:
+  GroveStringListPtr sl_;    
+};
+
+class CNodeBase {
+public:
+    virtual ~CNodeBase();
+    void init(const NodePtr &nd, const NodeTablePtr &);
+    static HRESULT make(const NodePtr &, const NodeTablePtr &, Node **);
+    static BSTR makeBSTR(const GroveString &);
+    static const GROVE_NAMESPACE::Node &key(const CNodeBase &obj) {
+      return *obj.nd_;
+    }
+    static unsigned long hash(const GROVE_NAMESPACE::Node &nd) {
+      return nd.hash();
+    }
+    virtual Node *asNode() = 0;
+    HRESULT internalGetStoragePos(StoragePos **);
+protected:
+    CNodeBase() { }
+    NodePtr nd_;
+    NodeTablePtr table_;
+};
+
+class NodeTable
+: public SP_NAMESPACE::Resource,
+  public SP_NAMESPACE::PointerTable<CNodeBase *, GROVE_NAMESPACE::Node, CNodeBase, CNodeBase> {
+public:
+  NodeTable(SP_NAMESPACE::Owner<ParserThread> &thd) {
+    thd.swap(thread_);
+  }
+private:
+  SP_NAMESPACE::Owner<ParserThread> thread_;
+};
+
+class ATL_NO_VTABLE CNodeList :
+       public CComObjectRoot,
+       public IDispatchImpl<NodeList, &IID_NodeList, &LIBID_GROVE> {
+public:
+    CNodeList() { }
+BEGIN_COM_MAP(CNodeList)
+   COM_INTERFACE_ENTRY(IDispatch)
+   COM_INTERFACE_ENTRY(NodeList)
+END_COM_MAP()
+    STDMETHOD(get_Count)(long *);
+    STDMETHOD(get_Item)(long, Node **);
+    STDMETHOD(get__NewEnum)(IUnknown **);
+    STDMETHOD(First)(Node **);
+    STDMETHOD(Rest)(NodeList **);
+    static HRESULT make(const NodeListPtr &, const NodeTablePtr &, NodeList **);
+private:
+    NodeListPtr nl_;
+    NodeTablePtr table_;
+};
+
+class ATL_NO_VTABLE CChunkNodeList :
+        public CComObjectRoot,
+       public IDispatchImpl<NodeList, &IID_NodeList, &LIBID_GROVE> {
+public:
+  CChunkNodeList() { }
+BEGIN_COM_MAP(CChunkNodeList)
+   COM_INTERFACE_ENTRY(IDispatch)
+   COM_INTERFACE_ENTRY(NodeList)
+END_COM_MAP()
+  STDMETHOD(get_Count)(long *);
+  STDMETHOD(get_Item)(long, Node **);
+  STDMETHOD(get__NewEnum)(IUnknown **);
+  STDMETHOD(First)(Node **);
+  STDMETHOD(Rest)(NodeList **);
+  static HRESULT make(const NodeListPtr &, const NodeTablePtr &, NodeList **);
+private:
+    NodeListPtr nl_;
+    NodeTablePtr table_;
+};
+
+class ATL_NO_VTABLE CNamedNodeList :
+       public CComObjectRoot,
+       public IDispatchImpl<NamedNodeList, &IID_NamedNodeList, &LIBID_GROVE> {
+public:
+    CNamedNodeList() { }
+BEGIN_COM_MAP(CNamedNodeList)
+   COM_INTERFACE_ENTRY(IDispatch)
+   COM_INTERFACE_ENTRY(NamedNodeList)
+END_COM_MAP()
+    STDMETHOD(get_Count)(long *);
+    STDMETHOD(get_Item)(BSTR, Node **);
+    STDMETHOD(get__NewEnum)(IUnknown **);
+    STDMETHOD(get_NodeList)(NodeList **);
+    STDMETHOD(Normalize)(BSTR, BSTR *);
+    STDMETHOD(NodeName)(Node *, BSTR *);
+    static HRESULT make(const NamedNodeListPtr &, const NodeTablePtr &, NamedNodeList **);
+private:
+    NamedNodeListPtr nnl_;
+    NodeTablePtr table_;
+};
+
+class ATL_NO_VTABLE CStoragePos :
+  public CComObjectRoot,
+  public IDispatchImpl<StoragePos, &IID_StoragePos, &LIBID_GROVE> {
+public:
+  CStoragePos() { }
+  BEGIN_COM_MAP(CStoragePos)
+    COM_INTERFACE_ENTRY(IDispatch)
+    COM_INTERFACE_ENTRY(StoragePos)
+  END_COM_MAP()
+  STDMETHOD(get_StorageManagerName)(BSTR *retval) {
+    const char *s = loc_.storageObjectSpec->storageManager->type();
+    BSTR tem = ::SysAllocStringLen(0, strlen(s));
+    *retval = tem;
+    if (!tem)
+      return E_OUTOFMEMORY;
+    while (*s)
+      *tem++ = *s++;
+    return NOERROR;
+  }
+  STDMETHOD(get_StorageObjectId)(BSTR *retval) {
+    const SP_NAMESPACE::StringC &id = loc_.actualStorageId;
+    CComBSTR tem(id.size(), id.data());
+    *retval = tem.Detach();
+    return *retval ? NOERROR : E_OUTOFMEMORY;
+  }
+  STDMETHOD(get_LineNumber)(long *retval) {
+    *retval = loc_.lineNumber;
+    if (*retval < 0)
+      *retval = 0;
+    return NOERROR;
+  }
+  STDMETHOD(get_ColumnNumber)(long *retval) {
+    *retval = loc_.columnNumber;
+    if (*retval < 0)
+      *retval = 0;
+    return NOERROR;
+  }
+  STDMETHOD(get_ByteIndex)(long *retval) {
+    *retval = loc_.byteIndex + 1;
+    return NOERROR;
+  }
+  STDMETHOD(get_CharacterIndex)(long *retval) {
+    *retval = loc_.storageObjectOffset + 1;
+    return NOERROR;
+  }
+  static HRESULT make(const SP_NAMESPACE::ExternalInfo *,
+                     SP_NAMESPACE::Offset,
+                     const NodePtr &,
+                     StoragePos **);
+private:
+  SP_NAMESPACE::StorageObjectLocation loc_;
+  NodePtr nd_;
+};
+
+#define NODE_PROP2(xfunc, ifunc) \
+    STDMETHOD(xfunc)(Node **retval) { \
+      TRY \
+      *retval = 0; \
+      NodePtr nd; \
+      if (nd_->ifunc(nd) == accessOK) \
+       return make(nd, table_, retval); \
+      return NOERROR; \
+      CATCH \
+    }
+#define NODE_PROP(Name) NODE_PROP2(get_##Name, get##Name)
+
+#define DERIVED_NODE_PROP2(xfunc, ifunc, cls) \
+    STDMETHOD(xfunc)(cls##Node **retval) { \
+      TRY \
+      *retval = 0; \
+      NodePtr nd; \
+      if (nd_->ifunc(nd) == accessOK) { \
+        Node *base; \
+       HRESULT hres = make(nd, table_, &base); \
+       *retval = (cls##Node *)base; \
+       return hres; \
+      } \
+      return NOERROR; \
+      CATCH \
+    }
+#define DERIVED_NODE_PROP(Name, cls) DERIVED_NODE_PROP2(get_##Name, get##Name, cls)
+
+
+#define NODE_LIST_PROP2(xfunc, ifunc) \
+    STDMETHOD(xfunc)(NodeList **retval) { \
+      TRY \
+      *retval = 0; \
+      NodeListPtr nl; \
+      if (nd_->ifunc(nl) == accessOK) \
+       return CNodeList::make(nl, table_, retval); \
+      return NOERROR; \
+      CATCH \
+    }
+#define NODE_LIST_PROP(Name) NODE_LIST_PROP2(get_##Name, get##Name)
+
+#define STRING_LIST_PROP2(xfunc, ifunc) \
+    STDMETHOD(xfunc)(StringList **retval) { \
+      TRY \
+      *retval = 0; \
+      GroveStringListPtr sl; \
+      if (nd_->ifunc(sl) == accessOK) \
+       return CStringList::make(sl, retval); \
+      return NOERROR; \
+      CATCH \
+    }
+#define STRING_LIST_PROP(Name) STRING_LIST_PROP2(get_##Name, get##Name)
+
+#define CHUNK_NODE_LIST_PROP2(xfunc, ifunc) \
+    STDMETHOD(xfunc)(NodeList **retval) { \
+      TRY \
+      *retval = 0; \
+      NodeListPtr nl; \
+      if (nd_->ifunc(nl) == accessOK) \
+       return CChunkNodeList::make(nl, table_, retval); \
+      return NOERROR; \
+      CATCH \
+    }
+
+#define NAMED_NODE_LIST_PROP2(xfunc, ifunc) \
+    STDMETHOD(xfunc)(NamedNodeList **retval) { \
+      TRY \
+      *retval = 0; \
+      NamedNodeListPtr nnl; \
+      if (nd_->ifunc(nnl) == accessOK) \
+       return CNamedNodeList::make(nnl, table_, retval); \
+      return NOERROR; \
+      CATCH \
+    }
+#define NAMED_NODE_LIST_PROP(Name) \
+ NAMED_NODE_LIST_PROP2(get_##Name, get##Name)
+
+#define BOOL_PROP2(xfunc, ifunc) \
+    STDMETHOD(xfunc)(VARIANT_BOOL *retval) { \
+      TRY \
+      bool b; \
+      if (nd_->ifunc(b) == accessOK) \
+        *retval = b ? -1 : 0; \
+      else \
+       *retval = 0; \
+      return NOERROR; \
+      CATCH \
+    }
+#define BOOL_PROP(Name) BOOL_PROP2(get_##Name, get##Name)
+
+#define INTEGER_PROP2(xfunc, ifunc) \
+    STDMETHOD(xfunc)(long *retval) { \
+      TRY \
+      long l; \
+      if (nd_->ifunc(l) == accessOK) \
+        *retval = l; \
+      else \
+       *retval = 0; \
+      return NOERROR; \
+      CATCH \
+    }
+#define INTEGER_PROP(Name) INTEGER_PROP2(get_##Name, get##Name)
+
+#define STRING_PROP2(xfunc, ifunc) \
+    STDMETHOD(xfunc)(BSTR *retval) { \
+      TRY \
+      *retval = 0; \
+      GroveString str; \
+      if (nd_->ifunc(str) == accessOK) \
+       *retval = makeBSTR(str); \
+      else \
+        *retval = makeEmptyBSTR(); \
+      return NOERROR; \
+      CATCH \
+    }
+#define STRING_PROP(Name) STRING_PROP2(get_##Name, get##Name)
+
+#define ENUM_PROP2(enumClass, xfunc, ifunc) \
+  STDMETHOD(xfunc)(enumClass *retval) { \
+    GROVE_NAMESPACE::Node::##enumClass##::Enum type; \
+    if (nd_->ifunc(type) == accessOK) \
+      *retval = enumClass##(type); \
+    return NOERROR; \
+  }
+#define ENUM_PROP(Name) ENUM_PROP2(Name, get_##Name, get##Name)
+
+#define NULL_STRING_PROP(Name) \
+    STRING_PROP(Name) \
+    STDMETHOD(get_##Name##Null)(VARIANT_BOOL *retval) { \
+      TRY \
+      *retval = 0; \
+      GroveString str; \
+      if (nd_->get##Name(str) == accessNull) \
+       *retval = -1; \
+      return NOERROR; \
+      CATCH \
+    }
+
+
+template <class T, const IID *piid, const GUID *plibid, NodeClass nodeClass>
+class INodeImpl : public IDispatchImpl<T, piid, plibid>, public CNodeBase {
+public:
+    NODE_PROP(Parent)
+    NODE_PROP(Origin)
+    NODE_PROP(GroveRoot)
+    NODE_PROP(TreeRoot)
+    NODE_LIST_PROP2(get_Children, children)
+    CHUNK_NODE_LIST_PROP2(get_ChunkChildren, children)
+    NODE_PROP2(FirstChild, firstChild)
+    NODE_PROP2(NextSibling, nextSibling)
+    NODE_PROP2(NextChunkSibling, nextChunkSibling)
+    STDMETHOD(get_Class)(NodeClass *retval) {
+      TRY
+      *retval = nodeClass;
+      return NOERROR;
+      CATCH
+    }
+    STDMETHOD(get_SiblingIndex)(long *retval) {
+      TRY
+      unsigned long n;
+      if (nd_->siblingsIndex(n) == accessOK)
+       *retval = n + 1;
+      else
+       *retval = 0;
+      return NOERROR;
+      CATCH
+    }
+    Node *asNode() { return this; }
+    STDMETHOD(get_StoragePos)(StoragePos **retval) {
+      return internalGetStoragePos(retval);
+    }
+};
+
+class ATL_NO_VTABLE CElementNode :
+       public CComObjectRoot,
+       public INodeImpl<ElementNode, &IID_ElementNode, &LIBID_GROVE, nodeClassElement> {
+public:
+    CElementNode() { }
+BEGIN_COM_MAP(CElementNode)
+   COM_INTERFACE_ENTRY(IDispatch)
+   COM_INTERFACE_ENTRY(ElementNode)
+   COM_INTERFACE_ENTRY(Node)
+END_COM_MAP()
+   STRING_PROP(Gi)
+   NAMED_NODE_LIST_PROP(Attributes)
+   STRING_PROP(Id)
+   NODE_LIST_PROP(Content)
+   CHUNK_NODE_LIST_PROP2(get_ChunkContent, getContent)
+   BOOL_PROP(Included)
+   BOOL_PROP(MustOmitEndTag) 
+   DERIVED_NODE_PROP(ElementType, ElementType)
+};
+
+class ATL_NO_VTABLE CAttributeAssignmentNode :
+       public CComObjectRoot,
+       public INodeImpl<AttributeAssignmentNode, &IID_AttributeAssignmentNode, &LIBID_GROVE, nodeClassAttributeAssignment> {
+public:
+    CAttributeAssignmentNode() { }
+BEGIN_COM_MAP(CAttributeAssignmentNode)
+   COM_INTERFACE_ENTRY(IDispatch)
+   COM_INTERFACE_ENTRY(AttributeAssignmentNode)
+   COM_INTERFACE_ENTRY(Node)
+END_COM_MAP()
+   STRING_PROP(Name)
+   BOOL_PROP(Implied)
+   NODE_LIST_PROP(Value)
+   CHUNK_NODE_LIST_PROP2(get_ChunkValue, getValue)
+   STDMETHOD(get_TokenSep)(long *retval) {
+     TRY
+     GroveChar ch;
+     if (nd_->getTokenSep(ch) == accessOK)
+       *retval = ch;
+     else
+       *retval = -1;
+     return NOERROR;
+     CATCH
+   }
+   STDMETHOD(get_StringValue)(BSTR *retval) {
+     TRY
+     *retval = 0;
+     bool implied;
+     if (nd_->getImplied(implied) == accessOK && implied) {
+       *retval = makeEmptyBSTR();
+       return NOERROR;
+     }
+     GroveString tokens;
+     if (nd_->tokens(tokens) == accessOK) {
+       *retval = makeBSTR(tokens);
+       return NOERROR;
+     }
+     NodePtr first;
+     if (nd_->firstChild(first) == accessOK) {
+       size_t len = 0;
+       NodePtr tem(first);
+       do {
+        GroveString chunk;
+        if (tem->charChunk(SdataMapper(), chunk) == accessOK)
+          len += chunk.size();
+       } while (tem.assignNextChunkSibling() == accessOK);
+       GroveChar *p = ::SysAllocStringLen(0, len);
+       if (!p)
+        return E_OUTOFMEMORY;
+       *retval = p;
+       tem = first;
+       do {
+        GroveString chunk;
+        if (tem->charChunk(SdataMapper(), chunk) == accessOK) {
+          memcpy(p, chunk.data(), chunk.size()*sizeof(*p));
+          p += chunk.size();
+        } 
+       } while (tem.assignNextChunkSibling() == accessOK);
+     }
+     return NOERROR;
+     CATCH
+   }
+   DERIVED_NODE_PROP(AttributeDef, AttributeDef)
+ };
+
+class ATL_NO_VTABLE CAttributeValueTokenNode :
+       public CComObjectRoot,
+       public INodeImpl<AttributeValueTokenNode, &IID_AttributeValueTokenNode, &LIBID_GROVE, nodeClassAttributeValueToken> {
+public:
+    CAttributeValueTokenNode() { }
+BEGIN_COM_MAP(CAttributeValueTokenNode)
+   COM_INTERFACE_ENTRY(IDispatch)
+   COM_INTERFACE_ENTRY(AttributeValueTokenNode)
+   COM_INTERFACE_ENTRY(Node)
+END_COM_MAP()
+   STRING_PROP(Token)
+   DERIVED_NODE_PROP(Referent, Element)
+   DERIVED_NODE_PROP(Entity, Entity)
+   DERIVED_NODE_PROP(Notation, Notation)
+};
+
+class ATL_NO_VTABLE CSgmlDocumentNode :
+       public CComObjectRoot,
+       public INodeImpl<SgmlDocumentNode, &IID_SgmlDocumentNode, &LIBID_GROVE, nodeClassSgmlDocument> {
+public:
+    CSgmlDocumentNode() { }
+BEGIN_COM_MAP(CSgmlDocumentNode)
+    COM_INTERFACE_ENTRY(IDispatch)
+    COM_INTERFACE_ENTRY(SgmlDocumentNode)
+    COM_INTERFACE_ENTRY(Node)
+END_COM_MAP()
+    DERIVED_NODE_PROP(DocumentElement, Element)
+    DERIVED_NODE_PROP(SgmlConstants, SgmlConstants)
+    NULL_STRING_PROP(ApplicationInfo)
+    NODE_LIST_PROP(Prolog)
+    NODE_LIST_PROP(Epilog)
+    NAMED_NODE_LIST_PROP(Elements)
+    NAMED_NODE_LIST_PROP(Entities)
+    NAMED_NODE_LIST_PROP(DefaultedEntities)
+    NAMED_NODE_LIST_PROP(DoctypesAndLinktypes)
+    DERIVED_NODE_PROP(GoverningDoctype, DocumentType)
+    NODE_LIST_PROP(Messages)
+};
+
+class ATL_NO_VTABLE CDataCharNode :
+       public CComObjectRoot,
+       public INodeImpl<DataCharNode, &IID_DataCharNode, &LIBID_GROVE, nodeClassDataChar> {
+public:
+    CDataCharNode() { }
+BEGIN_COM_MAP(CDataCharNode)
+   COM_INTERFACE_ENTRY(IDispatch)
+   COM_INTERFACE_ENTRY(DataCharNode)
+   COM_INTERFACE_ENTRY(Node)
+END_COM_MAP()
+    STDMETHOD(get_Char)(long *);
+    STDMETHOD(get_NonSgml)(long *);
+    STDMETHOD(get_CharChunk)(BSTR *);
+};
+
+class ATL_NO_VTABLE CSgmlConstantsNode :
+    public CComObjectRoot,
+    public INodeImpl<SgmlConstantsNode, &IID_SgmlConstantsNode, &LIBID_GROVE, nodeClassSgmlConstants> {
+public:
+      CSgmlConstantsNode() { }
+BEGIN_COM_MAP(CSgmlConstantsNode)
+  COM_INTERFACE_ENTRY(IDispatch)
+  COM_INTERFACE_ENTRY(SgmlConstantsNode)
+  COM_INTERFACE_ENTRY(Node)
+END_COM_MAP()
+};
+
+class ATL_NO_VTABLE CPiNode :
+    public CComObjectRoot,
+    public INodeImpl<PiNode, &IID_PiNode, &LIBID_GROVE, nodeClassPi> {
+public:
+      CPiNode() { }
+BEGIN_COM_MAP(CPiNode)
+  COM_INTERFACE_ENTRY(IDispatch)
+  COM_INTERFACE_ENTRY(PiNode)
+  COM_INTERFACE_ENTRY(Node)
+END_COM_MAP()
+  STRING_PROP(SystemData)
+  DERIVED_NODE_PROP(Entity, Entity)
+  STRING_PROP(EntityName)
+};
+
+class ATL_NO_VTABLE CSdataNode :
+    public CComObjectRoot,
+    public INodeImpl<SdataNode, &IID_SdataNode, &LIBID_GROVE, nodeClassSdata> {
+public:
+      CSdataNode() { }
+BEGIN_COM_MAP(CSdataNode)
+  COM_INTERFACE_ENTRY(IDispatch)
+  COM_INTERFACE_ENTRY(SdataNode)
+  COM_INTERFACE_ENTRY(Node)
+END_COM_MAP()
+  STRING_PROP(SystemData)
+  DERIVED_NODE_PROP(Entity, Entity)
+  STRING_PROP(EntityName)
+};
+
+class ATL_NO_VTABLE CDocumentTypeNode :
+    public CComObjectRoot,
+    public INodeImpl<DocumentTypeNode, &IID_DocumentTypeNode, &LIBID_GROVE, nodeClassDocumentType> {
+public:
+      CDocumentTypeNode() { }
+BEGIN_COM_MAP(CDocumentTypeNode)
+  COM_INTERFACE_ENTRY(IDispatch)
+  COM_INTERFACE_ENTRY(DocumentTypeNode)
+  COM_INTERFACE_ENTRY(Node)
+END_COM_MAP()
+  STRING_PROP(Name)
+  BOOL_PROP(Governing)
+  NAMED_NODE_LIST_PROP(GeneralEntities)
+  NAMED_NODE_LIST_PROP(Notations)
+  NAMED_NODE_LIST_PROP(ElementTypes)
+  NAMED_NODE_LIST_PROP(ParameterEntities)
+  DERIVED_NODE_PROP(DefaultEntity, DefaultEntity)
+};
+
+class ATL_NO_VTABLE CEntityNode :
+    public CComObjectRoot,
+    public INodeImpl<EntityNode, &IID_EntityNode, &LIBID_GROVE, nodeClassEntity> {
+public:
+      CEntityNode() { }
+BEGIN_COM_MAP(CEntityNode)
+  COM_INTERFACE_ENTRY(IDispatch)
+  COM_INTERFACE_ENTRY(EntityNode)
+  COM_INTERFACE_ENTRY(Node)
+END_COM_MAP()
+  STRING_PROP(Name)
+  NULL_STRING_PROP(Text)
+  DERIVED_NODE_PROP(Notation, Notation)
+  STRING_PROP(NotationName)
+  BOOL_PROP(Defaulted)
+  NAMED_NODE_LIST_PROP(Attributes)
+  DERIVED_NODE_PROP(ExternalId, ExternalId)
+  ENUM_PROP(EntityType)
+};
+
+class ATL_NO_VTABLE CDefaultEntityNode :
+    public CComObjectRoot,
+    public INodeImpl<DefaultEntityNode, &IID_DefaultEntityNode, &LIBID_GROVE, nodeClassDefaultEntity> {
+public:
+      CDefaultEntityNode() { }
+BEGIN_COM_MAP(CDefaultEntityNode)
+  COM_INTERFACE_ENTRY(IDispatch)
+  COM_INTERFACE_ENTRY(DefaultEntityNode)
+  COM_INTERFACE_ENTRY(Node)
+END_COM_MAP()
+  STRING_PROP(Name)
+  NULL_STRING_PROP(Text)
+  DERIVED_NODE_PROP(Notation, Notation)
+  STRING_PROP(NotationName)
+  NAMED_NODE_LIST_PROP(Attributes)
+  DERIVED_NODE_PROP(ExternalId, ExternalId)
+  ENUM_PROP(EntityType)
+};
+
+
+class ATL_NO_VTABLE CNotationNode :
+    public CComObjectRoot,
+    public INodeImpl<NotationNode, &IID_NotationNode, &LIBID_GROVE, nodeClassNotation> {
+public:
+      CNotationNode() { }
+BEGIN_COM_MAP(CNotationNode)
+  COM_INTERFACE_ENTRY(IDispatch)
+  COM_INTERFACE_ENTRY(NotationNode)
+  COM_INTERFACE_ENTRY(Node)
+END_COM_MAP()
+  STRING_PROP(Name)
+  DERIVED_NODE_PROP(ExternalId, ExternalId)
+  NAMED_NODE_LIST_PROP(AttributeDefs)
+};
+
+class ATL_NO_VTABLE CExternalIdNode :
+    public CComObjectRoot,
+    public INodeImpl<ExternalIdNode, &IID_ExternalIdNode, &LIBID_GROVE, nodeClassExternalId> {
+public:
+      CExternalIdNode() { }
+BEGIN_COM_MAP(CExternalIdNode)
+  COM_INTERFACE_ENTRY(IDispatch)
+  COM_INTERFACE_ENTRY(ExternalIdNode)
+  COM_INTERFACE_ENTRY(Node)
+END_COM_MAP()
+  NULL_STRING_PROP(PublicId)
+  NULL_STRING_PROP(SystemId)
+  STRING_PROP(GeneratedSystemId)
+};
+
+class ATL_NO_VTABLE CExternalDataNode :
+    public CComObjectRoot,
+    public INodeImpl<ExternalDataNode, &IID_ExternalDataNode, &LIBID_GROVE, nodeClassExternalData> {
+public:
+      CExternalDataNode() { }
+BEGIN_COM_MAP(CExternalDataNode)
+  COM_INTERFACE_ENTRY(IDispatch)
+  COM_INTERFACE_ENTRY(ExternalDataNode)
+  COM_INTERFACE_ENTRY(Node)
+END_COM_MAP()
+  DERIVED_NODE_PROP(Entity, Entity)
+  STRING_PROP(EntityName)
+};
+
+class ATL_NO_VTABLE CSubdocNode :
+    public CComObjectRoot,
+    public INodeImpl<SubdocNode, &IID_SubdocNode, &LIBID_GROVE, nodeClassSubdoc> {
+public:
+      CSubdocNode() { }
+BEGIN_COM_MAP(CSubdocNode)
+  COM_INTERFACE_ENTRY(IDispatch)
+  COM_INTERFACE_ENTRY(SubdocNode)
+  COM_INTERFACE_ENTRY(Node)
+END_COM_MAP()
+  DERIVED_NODE_PROP(Entity, Entity)
+  STRING_PROP(EntityName)
+};
+
+class ATL_NO_VTABLE CElementTypeNode :
+    public CComObjectRoot,
+    public INodeImpl<ElementTypeNode, &IID_ElementTypeNode, &LIBID_GROVE, nodeClassElementType> {
+public:
+      CElementTypeNode() { }
+BEGIN_COM_MAP(CElementTypeNode)
+  COM_INTERFACE_ENTRY(IDispatch)
+  COM_INTERFACE_ENTRY(ElementTypeNode)
+  COM_INTERFACE_ENTRY(Node)
+END_COM_MAP()
+  STRING_PROP(Gi)
+  NAMED_NODE_LIST_PROP(AttributeDefs)
+  ENUM_PROP(ContentType)
+  STRING_LIST_PROP(Exclusions)
+  STRING_LIST_PROP(Inclusions)
+  DERIVED_NODE_PROP(ModelGroup, ModelGroup)
+  BOOL_PROP(OmitEndTag)
+  BOOL_PROP(OmitStartTag)
+};
+
+class ATL_NO_VTABLE CAttributeDefNode :
+    public CComObjectRoot,
+    public INodeImpl<AttributeDefNode, &IID_AttributeDefNode, &LIBID_GROVE, nodeClassAttributeDef> {
+public:
+      CAttributeDefNode() { }
+BEGIN_COM_MAP(CElementTypeNode)
+  COM_INTERFACE_ENTRY(IDispatch)
+  COM_INTERFACE_ENTRY(ElementTypeNode)
+  COM_INTERFACE_ENTRY(Node)
+END_COM_MAP()
+  STRING_PROP(Name)
+  ENUM_PROP(DeclValueType)
+  ENUM_PROP(DefaultValueType)
+  STRING_LIST_PROP(Tokens)
+  INTEGER_PROP(CurrentAttributeIndex)
+  NODE_LIST_PROP(CurrentGroup)
+  NODE_LIST_PROP(DefaultValue)
+};
+
+class ATL_NO_VTABLE CModelGroupNode :
+    public CComObjectRoot,
+    public INodeImpl<ModelGroupNode, &IID_ModelGroupNode, &LIBID_GROVE, nodeClassModelGroup> {
+public:
+      CModelGroupNode() { }
+BEGIN_COM_MAP(CModelGroupNode)
+  COM_INTERFACE_ENTRY(IDispatch)
+  COM_INTERFACE_ENTRY(ModelGroupNode)
+  COM_INTERFACE_ENTRY(Node)
+END_COM_MAP()
+  ENUM_PROP(Connector)
+  ENUM_PROP(OccurIndicator)
+  NODE_LIST_PROP(ContentTokens)
+};
+
+class ATL_NO_VTABLE CElementTokenNode :
+    public CComObjectRoot,
+    public INodeImpl<ElementTokenNode, &IID_ElementTokenNode, &LIBID_GROVE, nodeClassElementToken> {
+public:
+      CElementTokenNode() { }
+BEGIN_COM_MAP(CElementTokenNode)
+  COM_INTERFACE_ENTRY(IDispatch)
+  COM_INTERFACE_ENTRY(ElementTokenNode)
+  COM_INTERFACE_ENTRY(Node)
+END_COM_MAP()
+  STRING_PROP(Gi)
+  ENUM_PROP(OccurIndicator)
+};
+
+class ATL_NO_VTABLE CPcdataTokenNode :
+    public CComObjectRoot,
+    public INodeImpl<PcdataTokenNode, &IID_PcdataTokenNode, &LIBID_GROVE, nodeClassPcdataToken> {
+public:
+      CPcdataTokenNode() { }
+BEGIN_COM_MAP(CPcdataTokenNode)
+  COM_INTERFACE_ENTRY(IDispatch)
+  COM_INTERFACE_ENTRY(PcdataTokenNode)
+  COM_INTERFACE_ENTRY(Node)
+END_COM_MAP()
+};
+
+class ATL_NO_VTABLE CMessageNode :
+    public CComObjectRoot,
+    public INodeImpl<MessageNode, &IID_MessageNode, &LIBID_GROVE, nodeClassMessage> {
+public:
+  CMessageNode() { }
+BEGIN_COM_MAP(CMessageNode)
+  COM_INTERFACE_ENTRY(IDispatch)
+  COM_INTERFACE_ENTRY(MessageNode)
+  COM_INTERFACE_ENTRY(Node)
+END_COM_MAP()
+  STRING_PROP(Text)
+  STDMETHOD(get_Severity)(Severity *retval) {
+    TRY
+    GROVE_NAMESPACE::Node::Severity type;
+    if (nd_->getSeverity(type) == accessOK)
+      *retval = Severity(type);
+    return NOERROR;
+    CATCH
+  }
+};
+
+class ATL_NO_VTABLE CEnumNodeList :
+       public CComObjectRoot,
+       public IEnumVARIANT {
+public:
+    CEnumNodeList() { }
+BEGIN_COM_MAP(CEnumNodeList)
+   COM_INTERFACE_ENTRY(IEnumVARIANT)
+END_COM_MAP()
+  // IEnumVARIANT
+  STDMETHOD(Next)(ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched);
+  STDMETHOD(Skip)(ULONG celt);
+  STDMETHOD(Reset)();
+  STDMETHOD(Clone)(IEnumVARIANT **ppEnum);
+  static HRESULT make(const NodeListPtr &, const NodeTablePtr &table, IUnknown **);
+private:
+  NodeListPtr nl_;
+  NodeListPtr cur_;
+  NodeTablePtr table_;
+};
+
+class ATL_NO_VTABLE CEnumChunkNodeList :
+       public CComObjectRoot,
+       public IEnumVARIANT {
+public:
+    CEnumChunkNodeList() { }
+BEGIN_COM_MAP(CEnumChunkNodeList)
+   COM_INTERFACE_ENTRY(IEnumVARIANT)
+END_COM_MAP()
+  // IEnumVARIANT
+  STDMETHOD(Next)(ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched);
+  STDMETHOD(Skip)(ULONG celt);
+  STDMETHOD(Reset)();
+  STDMETHOD(Clone)(IEnumVARIANT **ppEnum);
+  static HRESULT make(const NodeListPtr &, const NodeTablePtr &table, IUnknown **);
+private:
+  NodeListPtr nl_;
+  NodeListPtr cur_;
+  NodeTablePtr table_;
+};
+
+struct BuildVisitor :  public GROVE_NAMESPACE::NodeVisitor {
+public:
+  BuildVisitor(const NodePtr &n, const NodeTablePtr &t)
+    : nd(n), table(t), retval(0), hRes(NOERROR) { }
+#define BUILD(mem, Cls) \
+  void mem(GROVE_NAMESPACE::Node &) { \
+    CComObject<Cls> *p; \
+    hRes = CComObject<Cls>::CreateInstance(&p); \
+    if (!FAILED(hRes)) { \
+      p->init(nd, table); \
+      retval = p; \
+      (retval)->AddRef(); \
+    } \
+  }
+  BUILD(element, CElementNode)
+  BUILD(attributeAssignment, CAttributeAssignmentNode)
+  BUILD(attributeValueToken, CAttributeValueTokenNode)
+  BUILD(sgmlDocument, CSgmlDocumentNode)
+  BUILD(dataChar, CDataCharNode)
+  BUILD(sgmlConstants, CSgmlConstantsNode)
+  BUILD(pi, CPiNode)
+  BUILD(sdata, CSdataNode)
+  BUILD(documentType, CDocumentTypeNode)
+  BUILD(entity, CEntityNode)
+  BUILD(notation, CNotationNode)
+  BUILD(externalId, CExternalIdNode)
+  BUILD(externalData, CExternalDataNode)
+  BUILD(subdocument, CSubdocNode)
+  BUILD(message, CMessageNode)
+  BUILD(elementType, CElementTypeNode)
+  BUILD(modelGroup, CModelGroupNode)
+  BUILD(elementToken, CElementTokenNode)
+  BUILD(pcdataToken, CPcdataTokenNode)
+  BUILD(defaultEntity, CDefaultEntityNode)
+  BUILD(attributeDef, CAttributeDefNode)
+#undef BUILD
+  NodePtr nd;
+  HRESULT hRes;
+  Node *retval;
+  NodeTablePtr table;
+};
+
+HRESULT CNodeBase::make(const NodePtr &nd, const NodeTablePtr &table, Node **retval)
+{
+  CNodeBase *nb = table->lookup(*nd);
+  if (nb) {
+    *retval = nb->asNode();
+    (*retval)->AddRef();
+    return NOERROR;
+  }
+  else {
+    BuildVisitor visitor(nd, table);
+    nd->accept(visitor);
+    *retval = visitor.retval;
+    return visitor.hRes;
+  }
+}
+
+CNodeBase::~CNodeBase()
+{
+  CNodeBase *tem = table_->remove(*nd_);
+  if (tem != this)
+    abort();
+}
+
+void CNodeBase::init(const NodePtr &nd, const NodeTablePtr &table)
+{
+  table_ = table;
+  nd_ = nd;
+  table_->insert(this);
+}
+
+BSTR CNodeBase::makeBSTR(const GroveString &str)
+{
+  CComBSTR bstr(str.size(), str.data());
+  return bstr.Detach();
+}
+
+HRESULT CNodeBase::internalGetStoragePos(StoragePos **retval)
+{
+  TRY
+  const SP_NAMESPACE::LocNode *lp = SP_NAMESPACE::LocNode::convert(nd_);
+  if (lp) {
+    SP_NAMESPACE::Location loc;
+    if (lp->getLocation(loc) == accessOK) {
+      const SP_NAMESPACE::Origin *origin = loc.origin().pointer();
+      SP_NAMESPACE::Index index = loc.index();
+      while (origin) {
+       const SP_NAMESPACE::ExternalInfo *info
+         = origin->externalInfo();
+       if (info)
+         return CStoragePos::make(info, origin->startOffset(index), nd_, retval);
+       const SP_NAMESPACE::Location &loc = origin->parent();
+       index = loc.index();
+       origin = loc.origin().pointer();
+      }
+    }
+  }
+  *retval = 0;
+  return NOERROR;
+  CATCH
+}
+
+STDMETHODIMP CDataCharNode::get_CharChunk(BSTR *retval)
+{
+  TRY
+  *retval = 0;
+  GroveString str;
+  if (nd_->charChunk(SdataMapper(), str) == accessOK)
+    *retval = makeBSTR(str);
+  else
+    *retval = makeEmptyBSTR();
+  return NOERROR;
+  CATCH
+}
+
+STDMETHODIMP CDataCharNode::get_Char(long *retval)
+{
+  TRY
+  GroveChar ch;
+  if (nd_->getChar(SdataMapper(), ch) == accessOK)
+    *retval = ch;
+  else
+    *retval = -1;
+  return NOERROR;
+  CATCH
+}
+
+STDMETHODIMP CDataCharNode::get_NonSgml(long *retval)
+{
+  TRY
+  unsigned long n;
+  if (nd_->getNonSgml(n) == accessOK)
+    *retval = n;
+  else
+    *retval = -1;
+  return NOERROR;
+  CATCH
+}
+// ----------
+
+HRESULT CStringList::make(const GroveStringListPtr &sl, StringList **retval)
+{
+  CComObject<CStringList> *p;
+  HRESULT hRes = CComObject<CStringList>::CreateInstance(&p);
+  if (FAILED(hRes))
+    return hRes;
+  CStringList *np = p;
+  np->sl_ = sl;
+  *retval = p;
+  (*retval)->AddRef();
+  return NOERROR;
+}
+
+STDMETHODIMP CStringList::First(BSTR *retval)
+{
+  TRY
+  *retval = 0;
+  GroveString str;
+  if (sl_->first(str) == accessOK) {
+    *retval = CNodeBase::makeBSTR(str);
+  }
+  return NOERROR;
+  CATCH
+}
+
+STDMETHODIMP CStringList::Rest(StringList **retval)
+{
+  TRY
+  *retval = 0;
+  GroveStringListPtr sl;
+  if (sl_->rest(sl) == accessOK)
+    return CStringList::make(sl, retval);
+  return NOERROR;
+  CATCH
+}
+
+STDMETHODIMP CStringList::get_Count(long *retval)
+{
+  TRY
+  long n = 0;
+  for (ConstGroveStringListIter iter(sl_->iter()); !iter.done(); iter.next())
+    n++;
+  *retval = n;
+  return NOERROR;
+  CATCH
+}
+
+STDMETHODIMP CStringList::get_Item(long i, BSTR *retval)
+{
+  TRY
+  *retval = 0;
+  if (i <= 0)
+    return E_INVALIDARG;
+  ConstGroveStringListIter iter(*sl_);
+  for (long n = 1; n < i && !iter.done(); n++)
+    iter.next();
+  if (iter.done())
+    return E_INVALIDARG;
+  GroveString str;
+  str = iter.cur();
+  *retval = CNodeBase::makeBSTR(str);
+  return NOERROR;
+  CATCH
+}
+// -----------
+
+HRESULT CNodeList::make(const NodeListPtr &nl, const NodeTablePtr &table, NodeList **retval)
+{
+  CComObject<CNodeList> *p;
+  HRESULT hRes = CComObject<CNodeList>::CreateInstance(&p);
+  if (FAILED(hRes))
+    return hRes;
+  CNodeList *np = p;
+  np->nl_ = nl;
+  np->table_ = table;
+  *retval = p;
+  (*retval)->AddRef();
+  return NOERROR;
+}
+
+STDMETHODIMP CNodeList::First(Node **retval)
+{
+  TRY
+  *retval = 0;
+  NodePtr nd;
+  if (nl_->first(nd) == accessOK)
+    return CNodeBase::make(nd, table_, retval);
+  return NOERROR;
+  CATCH
+}
+
+STDMETHODIMP CNodeList::Rest(NodeList **retval)
+{
+  TRY
+  *retval = 0;
+  NodeListPtr nl;
+  if (nl_->rest(nl) == accessOK)
+    return CNodeList::make(nl, table_, retval);
+  return NOERROR;
+  CATCH
+}
+
+STDMETHODIMP CNodeList::get_Count(long *retval)
+{
+  TRY
+  long n = 0;
+  NodeListPtr nl;
+  if (nl_->rest(nl) == accessOK) {
+    n++;
+    while (nl.assignRest() == accessOK)
+      n++;
+  }
+  *retval = n;
+  return NOERROR;
+  CATCH
+}
+
+STDMETHODIMP CNodeList::get_Item(long i, Node **retval)
+{
+  TRY
+  *retval = 0;
+  NodePtr nd;
+  if (i <= 0)
+    return E_INVALIDARG;
+  if (nl_->ref(i - 1, nd) != accessOK)
+    return E_INVALIDARG;
+  return CNodeBase::make(nd, table_, retval);
+  CATCH
+}
+
+STDMETHODIMP CNodeList::get__NewEnum(IUnknown **retval)
+{
+  TRY
+  return CEnumNodeList::make(nl_, table_, retval);
+  CATCH
+}
+
+HRESULT CChunkNodeList::make(const NodeListPtr &nl, const NodeTablePtr &table, NodeList **retval)
+{
+  CComObject<CChunkNodeList> *p;
+  HRESULT hRes = CComObject<CChunkNodeList>::CreateInstance(&p);
+  if (FAILED(hRes))
+    return hRes;
+  CChunkNodeList *np = p;
+  np->nl_ = nl;
+  np->table_ = table;
+  *retval = p;
+  (*retval)->AddRef();
+  return NOERROR;
+}
+
+STDMETHODIMP CChunkNodeList::First(Node **retval)
+{
+  TRY
+  *retval = 0;
+  NodePtr nd;
+  if (nl_->first(nd) == accessOK)
+    return CNodeBase::make(nd, table_, retval);
+  return NOERROR;
+  CATCH
+}
+
+STDMETHODIMP CChunkNodeList::Rest(NodeList **retval)
+{
+  TRY
+  *retval = 0;
+  NodeListPtr nl;
+  if (nl_->chunkRest(nl) == accessOK)
+    return CNodeList::make(nl, table_, retval);
+  return NOERROR;
+  CATCH
+}
+
+STDMETHODIMP CChunkNodeList::get__NewEnum(IUnknown **retval)
+{
+  TRY
+  return CEnumChunkNodeList::make(nl_, table_, retval);
+  CATCH
+}
+
+STDMETHODIMP CChunkNodeList::get_Count(long *retval)
+{
+  TRY
+  long n = 0;
+  NodeListPtr nl;
+  if (nl_->chunkRest(nl) == accessOK) {
+    n++;
+    while (nl.assignChunkRest() == accessOK)
+      n++;
+  }
+  *retval = n;
+  return NOERROR;
+  CATCH
+}
+
+STDMETHODIMP CChunkNodeList::get_Item(long i, Node **retval)
+{
+  TRY
+  *retval = 0;
+  if (i <= 0)
+    return E_INVALIDARG;
+  if (i == 1)
+    return First(retval);
+  NodeListPtr nl(nl_);
+  do {
+    if (nl.assignChunkRest() != accessOK)
+      return E_INVALIDARG;
+  } while (--i > 1);
+  NodePtr nd;
+  if (nl->first(nd) != accessOK)
+    return E_INVALIDARG;
+  return CNodeBase::make(nd, table_, retval);
+  CATCH
+}
+
+STDMETHODIMP CNamedNodeList::get_Count(long *retval)
+{
+  TRY
+  NodeListPtr nl(nnl_->nodeListNoOrder());
+  long n = 0;
+  while (nl.assignRest() == accessOK)
+    n++;
+  *retval = n;
+  return NOERROR;
+  CATCH
+}
+
+STDMETHODIMP CNamedNodeList::get_Item(BSTR name, Node **retval)
+{
+  TRY
+  *retval = 0;
+  if (!name)
+    return E_INVALIDARG;
+  GroveString tem(name, ::SysStringLen(name));
+  NodePtr nd;
+  if (nnl_->namedNode(tem, nd) != accessOK)
+    return E_INVALIDARG;
+  return CNodeBase::make(nd, table_, retval);
+  CATCH
+}
+
+STDMETHODIMP CNamedNodeList::get_NodeList(NodeList **retval)
+{
+  TRY
+  return CNodeList::make(nnl_->nodeList(), table_, retval);
+  CATCH
+}
+
+STDMETHODIMP CNamedNodeList::get__NewEnum(IUnknown **retval)
+{
+  TRY
+  return CEnumNodeList::make(nnl_->nodeListNoOrder(), table_, retval);
+  CATCH
+}
+
+STDMETHODIMP CNamedNodeList::Normalize(BSTR name, BSTR *retval)
+{
+  TRY
+  *retval = 0;
+  if (name) {
+    size_t len = ::SysStringLen(name);
+    BSTR tem = ::SysAllocStringLen(name, len);
+    size_t newLen = nnl_->normalize(tem, len);
+    if (newLen != len && !::SysReAllocStringLen(&tem, tem, newLen)) {
+      ::SysFreeString(tem);
+      return E_OUTOFMEMORY;
+    }
+    *retval = tem;
+  }
+  else
+    *retval = makeEmptyBSTR();
+  return NOERROR;
+  CATCH
+}
+
+STDMETHODIMP CNamedNodeList::NodeName(Node *nd, BSTR *retval)
+{
+  TRY
+  *retval = 0;
+  switch (nnl_->type()) {
+#define CASE(T, I, P) \
+  case GROVE_NAMESPACE::NamedNodeList::T: \
+    { \
+      I *tem; \
+      if (SUCCEEDED(nd->QueryInterface(IID_##I, (void **)&tem))) { \
+       HRESULT hRes = tem->get_##P(retval); \
+       tem->Release(); \
+       return hRes; \
+      } \
+      return NOERROR; \
+    }
+    CASE(elements,ElementNode,Id)
+    CASE(entities,EntityNode,Name)
+    CASE(notations,NotationNode,Name)
+    CASE(attributes,AttributeAssignmentNode,Name)
+    CASE(doctypesAndLinktypes,DocumentTypeNode,Name)
+    CASE(elementTypes,ElementTypeNode,Gi)
+    CASE(attributeDefs,AttributeDefNode,Name)
+  }
+  return NOERROR;
+  CATCH
+}
+
+HRESULT CNamedNodeList::make(const NamedNodeListPtr &nnl,
+                            const NodeTablePtr &table,
+                            NamedNodeList **retval)
+{
+  CComObject<CNamedNodeList> *p;
+  HRESULT hRes = CComObject<CNamedNodeList>::CreateInstance(&p);
+  if (FAILED(hRes))
+    return hRes;
+  CNamedNodeList *np = p;
+  np->nnl_ = nnl;
+  np->table_ = table;
+  *retval = p;
+  (*retval)->AddRef();
+  return NOERROR;
+}
+
+HRESULT CEnumNodeList::make(const NodeListPtr &nl, const NodeTablePtr &table,
+                           IUnknown **retval)
+{
+  CComObject<CEnumNodeList> *p;
+  HRESULT hRes = CComObject<CEnumNodeList>::CreateInstance(&p);
+  if (FAILED(hRes))
+    return hRes;
+  CEnumNodeList *np = p;
+  np->nl_ = nl;
+  np->cur_ = nl;
+  np->table_ = table;
+  return p->QueryInterface(IID_IUnknown, (void **)retval);
+}
+
+STDMETHODIMP CEnumNodeList::Next(ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched)
+{
+  TRY
+  ULONG n = 0;
+  for (; celt > 0; celt--, rgVar++, n++) {
+    NodePtr nd;
+    if (cur_->first(nd) != accessOK)
+      break;
+    if (cur_.assignRest() != accessOK)
+      goto error;
+    Node *ip;
+    if (FAILED(CNodeBase::make(nd, table_, &ip)))
+      goto error;
+    rgVar->vt = VT_DISPATCH;
+    rgVar->pdispVal = ip;
+  }
+  if (pCeltFetched)
+    *pCeltFetched = n;
+  return celt ? S_FALSE : NOERROR;
+error:
+  while (n > 0) {
+    --n ;
+    --rgVar;
+    VariantClear(rgVar);
+  }
+  if (pCeltFetched)
+    *pCeltFetched = 0;
+  return S_FALSE;
+  CATCH
+}
+
+STDMETHODIMP CEnumNodeList::Skip(ULONG celt)
+{
+  TRY
+  for (; celt > 0; celt--) {
+    if (cur_.assignRest() != accessOK)
+      return S_FALSE;
+  }
+  return NOERROR;
+  CATCH
+}
+
+STDMETHODIMP CEnumNodeList::Reset()
+{
+  TRY
+  cur_ = nl_;
+  return NOERROR;
+  CATCH
+}
+
+STDMETHODIMP CEnumNodeList::Clone(IEnumVARIANT **ppEnum)
+{
+  TRY
+  CComObject<CEnumNodeList> *p;
+  HRESULT hRes = CComObject<CEnumNodeList>::CreateInstance(&p);
+  if (FAILED(hRes))
+    return hRes;
+  CEnumNodeList *np = p;
+  np->nl_ = nl_;
+  np->cur_ = cur_;
+  np->table_ = table_;
+  *ppEnum = p;
+  (*ppEnum)->AddRef();
+  return NOERROR;
+  CATCH
+}
+
+HRESULT CEnumChunkNodeList::make(const NodeListPtr &nl, const NodeTablePtr &table,
+                           IUnknown **retval)
+{
+  CComObject<CEnumChunkNodeList> *p;
+  HRESULT hRes = CComObject<CEnumChunkNodeList>::CreateInstance(&p);
+  if (FAILED(hRes))
+    return hRes;
+  CEnumChunkNodeList *np = p;
+  np->nl_ = nl;
+  np->cur_ = nl;
+  np->table_ = table;
+  return p->QueryInterface(IID_IUnknown, (void **)retval);
+}
+
+STDMETHODIMP CEnumChunkNodeList::Next(ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched)
+{
+  TRY
+  ULONG n = 0;
+  for (; celt > 0; celt--, rgVar++, n++) {
+    NodePtr nd;
+    if (cur_->first(nd) != accessOK)
+      break;
+    if (cur_.assignChunkRest() != accessOK)
+      goto error;
+    Node *ip;
+    if (FAILED(CNodeBase::make(nd, table_, &ip)))
+      goto error;
+    rgVar->vt = VT_DISPATCH;
+    rgVar->pdispVal = ip;
+  }
+  if (pCeltFetched)
+    *pCeltFetched = n;
+  return celt ? S_FALSE : NOERROR;
+error:
+  while (n > 0) {
+    --n ;
+    --rgVar;
+    VariantClear(rgVar);
+  }
+  if (pCeltFetched)
+    *pCeltFetched = 0;
+  return S_FALSE;
+  CATCH
+}
+
+STDMETHODIMP CEnumChunkNodeList::Skip(ULONG celt)
+{
+  TRY
+  for (; celt > 0; celt--) {
+    if (cur_.assignChunkRest() != accessOK)
+      return S_FALSE;
+  }
+  return NOERROR;
+  CATCH
+}
+
+STDMETHODIMP CEnumChunkNodeList::Reset()
+{
+  TRY
+  cur_ = nl_;
+  return NOERROR;
+  CATCH
+}
+
+STDMETHODIMP CEnumChunkNodeList::Clone(IEnumVARIANT **ppEnum)
+{
+  TRY
+  CComObject<CEnumChunkNodeList> *p;
+  HRESULT hRes = CComObject<CEnumChunkNodeList>::CreateInstance(&p);
+  if (FAILED(hRes))
+    return hRes;
+  CEnumChunkNodeList *np = p;
+  np->nl_ = nl_;
+  np->cur_ = cur_;
+  np->table_ = table_;
+  *ppEnum = p;
+  (*ppEnum)->AddRef();
+  return NOERROR;
+  CATCH
+}
+
+HRESULT CStoragePos::make(const SP_NAMESPACE::ExternalInfo *info,
+                         SP_NAMESPACE::Offset offset,
+                         const NodePtr &nd,
+                         StoragePos **retval)
+{
+  *retval = 0;
+  CComObject<CStoragePos> *p;
+  HRESULT hRes = CComObject<CStoragePos>::CreateInstance(&p);
+  if (FAILED(hRes))
+    return hRes;
+  CStoragePos *tem = p;
+  if (!SP_NAMESPACE::ExtendEntityManager::externalize(info, offset, tem->loc_)) {
+    delete p;
+    return NOERROR;
+  }
+  tem->nd_ = nd;
+  *retval = p;
+  (*retval)->AddRef();
+  return NOERROR;
+}
+
+HRESULT makeRootNode(const GROVE_NAMESPACE::NodePtr &root,
+                    SP_NAMESPACE::Owner<ParserThread> &parser,
+                    SgmlDocumentNode **retval)
+{
+  TRY
+  NodeTablePtr table(new NodeTable(parser));
+  Node *tem;
+  HRESULT hRes = CNodeBase::make(root, table, &tem);
+  *retval = (SgmlDocumentNode *)tem;
+  return hRes;
+  CATCH
+}
diff --git a/groveoa/GroveNode.h b/groveoa/GroveNode.h
new file mode 100644 (file)
index 0000000..ac9944c
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef GroveNode_INCLUDED
+#define GroveNode_INCLUDED 1
+
+#include "Owner.h"
+#include "Boolean.h"
+#include "Node.h"
+
+struct ParserThread {
+  virtual ~ParserThread() { }
+};
+
+HRESULT makeRootNode(const GROVE_NAMESPACE::NodePtr &,
+                    SP_NAMESPACE::Owner<ParserThread> &,
+                    SgmlDocumentNode **);
+
+#endif /* not GroveNode_INCLUDED */
diff --git a/groveoa/StdAfx.cxx b/groveoa/StdAfx.cxx
new file mode 100644 (file)
index 0000000..a5eea17
--- /dev/null
@@ -0,0 +1,12 @@
+// stdafx.cpp : source file that includes just the standard includes
+//  stdafx.pch will be the pre-compiled header
+//  stdafx.obj will contain the pre-compiled type information
+
+#include "stdafx.h"
+
+#ifdef _ATL_STATIC_REGISTRY
+#include <statreg.h>
+#include <statreg.cpp>
+#endif
+
+#include <atlimpl.cpp>
diff --git a/groveoa/StdAfx.h b/groveoa/StdAfx.h
new file mode 100644 (file)
index 0000000..801551a
--- /dev/null
@@ -0,0 +1,14 @@
+// stdafx.h : include file for standard system include files,
+//      or project specific include files that are used frequently,
+//      but are changed infrequently
+
+#define STRICT
+
+// #define _WIN32_WINNT 0x0400
+#define _ATL_APARTMENT_THREADED
+
+#include <atlbase.h>
+//You may derive a class from CComModule and use it if you want to override
+//something, but do not change the name of _Module
+extern CComModule _Module;
+#include <atlcom.h>
diff --git a/groveoa/groveoa.cxx b/groveoa/groveoa.cxx
new file mode 100644 (file)
index 0000000..24e7f0b
--- /dev/null
@@ -0,0 +1,92 @@
+// groveoa.cxx : Implementation of DLL Exports.
+
+// You will need VC 4.2 and the full 4.2b patch (http://msvc/vc42b/vc42b.htm) in 
+// order to build this project.  This patch includes the final NT 4.0 SDK.
+// You will also need MIDL 3.00.75, which is included with ATL 2.0.
+
+// Note: Proxy/Stub Information
+//             To merge the proxy/stub code into the object DLL, add the file 
+//             dlldatax.c to the project.  Make sure precompiled headers 
+//             are turned off for this file, and add _MERGE_PROXYSTUB to the 
+//             defines for the project.  
+//
+//             If you are not running MIDL with /Oicf (the default), you will need
+//             to remove the following defines from the top of dlldatax.c.
+//             #define _WIN32_WINNT 0x0400
+//             #define USE_STUBLESS_PROXY
+//
+//             Modify the custom build rule for groveoa.idl by adding the following 
+//             files to the Outputs.
+//                     groveoa_p.c
+//                     dlldata.c
+//             To build a separate proxy/stub DLL, 
+//             run nmake -f groveoaps.mk in the project directory.
+
+#include "stdafx.h"
+#include "resource.h"
+#include "groveoa.h"
+
+#include "groveoa_i.c"
+#include "CGroveBuilder.h"
+
+CComModule _Module;
+
+BEGIN_OBJECT_MAP(ObjectMap)
+       OBJECT_ENTRY(CLSID_GroveBuilder, CGroveBuilder)
+END_OBJECT_MAP()
+
+/////////////////////////////////////////////////////////////////////////////
+// DLL Entry Point
+
+extern "C"
+BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
+{
+       lpReserved;
+       if (dwReason == DLL_PROCESS_ATTACH)
+       {
+               _Module.Init(ObjectMap, hInstance);
+               DisableThreadLibraryCalls(hInstance);
+       }
+       else if (dwReason == DLL_PROCESS_DETACH)
+               _Module.Term();
+       return TRUE;    // ok
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// Used to determine whether the DLL can be unloaded by OLE
+
+STDAPI DllCanUnloadNow(void)
+{
+       return (_Module.GetLockCount()==0) ? S_OK : S_FALSE;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// Returns a class factory to create an object of the requested type
+
+STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
+{
+       return _Module.GetClassObject(rclsid, riid, ppv);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// DllRegisterServer - Adds entries to the system registry
+
+STDAPI DllRegisterServer(void)
+{
+       // registers object, typelib and all interfaces in typelib
+       return _Module.RegisterServer(TRUE);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// DllUnregisterServer - Removes entries from the system registry
+
+STDAPI DllUnregisterServer(void)
+{
+       _Module.UnregisterServer();
+#if _WIN32_WINNT >= 0x0400
+       UnRegisterTypeLib(LIBID_GROVE, 1, 0, LOCALE_USER_DEFAULT, SYS_WIN32);
+#endif
+       return S_OK;
+}
+
+
diff --git a/groveoa/groveoa.def b/groveoa/groveoa.def
new file mode 100644 (file)
index 0000000..30b5a8b
--- /dev/null
@@ -0,0 +1,9 @@
+; groveoa.def : Declares the module parameters.
+
+LIBRARY      "groveoa.DLL"
+
+EXPORTS
+       DllCanUnloadNow     @1 PRIVATE
+       DllGetClassObject   @2 PRIVATE
+       DllRegisterServer   @3 PRIVATE
+       DllUnregisterServer     @4 PRIVATE
diff --git a/groveoa/groveoa.dsp b/groveoa/groveoa.dsp
new file mode 100644 (file)
index 0000000..7c9f480
--- /dev/null
@@ -0,0 +1,163 @@
+# Microsoft Developer Studio Project File - Name="groveoa" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=groveoa - Win32 Release
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "groveoa.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "groveoa.mak" CFG="groveoa - Win32 Release"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "groveoa - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "groveoa - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "groveoa - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir ".\Release"
+# PROP BASE Intermediate_Dir ".\Release"
+# PROP BASE Target_Dir "."
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir ".\Release"
+# PROP Intermediate_Dir ".\Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir "."
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\include" /I "..\grove" /I "..\spgrove" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /D "_WINDLL" /D "NDEBUG" /D "_WINDOWS" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D "SP_MULTI_BYTE" /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 /out:"..\bin\ogroveoa.dll"
+# Begin Special Build Tool
+TargetPath=\users\Avi\jadetest\jade\bin\ogroveoa.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=regsvr32 /s /c "$(TargetPath)"
+# End Special Build Tool
+
+!ELSEIF  "$(CFG)" == "groveoa - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir ".\Debug"
+# PROP BASE Intermediate_Dir ".\Debug"
+# PROP BASE Target_Dir "."
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir ".\Debug"
+# PROP Intermediate_Dir ".\Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir "."
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\include" /I "..\grove" /I "..\spgrove" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /D "_WINDLL" /D "_DEBUG" /D "_WINDOWS" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D "SP_MULTI_BYTE" /YX /FD /c
+# ADD BASE MTL /nologo /D "_DEBUG" /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"..\dbgbin\ogroveoa.dll"
+# SUBTRACT LINK32 /incremental:no
+
+!ENDIF 
+
+# Begin Target
+
+# Name "groveoa - Win32 Release"
+# Name "groveoa - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat;for;f90"
+# Begin Source File
+
+SOURCE=.\CGroveBuilder.cxx
+# ADD CPP /Yu"stdafx.h"
+# End Source File
+# Begin Source File
+
+SOURCE=.\GroveNode.cxx
+# ADD CPP /Yu"stdafx.h"
+# End Source File
+# Begin Source File
+
+SOURCE=.\groveoa.cxx
+# ADD CPP /Yu"stdafx.h"
+# End Source File
+# Begin Source File
+
+SOURCE=.\groveoa.def
+# End Source File
+# Begin Source File
+
+SOURCE=.\groveoa.idl
+# ADD MTL /tlb "groveoa.tlb" /h "groveoa.h" /iid "groveoa_i.c" /Oicf
+# SUBTRACT MTL /mktyplib203
+# End Source File
+# Begin Source File
+
+SOURCE=.\StdAfx.cxx
+# ADD CPP /Yc"stdafx.h"
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd"
+# Begin Source File
+
+SOURCE=.\CGroveBuilder.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\GroveNode.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\resource.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\StdAfx.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"
+# Begin Source File
+
+SOURCE=.\groveoa.rc
+# End Source File
+# End Group
+# Begin Source File
+
+SOURCE=.\GroveBuilder.rgs
+# End Source File
+# End Target
+# End Project
diff --git a/groveoa/groveoa.idl b/groveoa/groveoa.idl
new file mode 100644 (file)
index 0000000..21da0ef
--- /dev/null
@@ -0,0 +1,773 @@
+// groveoa.idl : IDL source for groveoa.dll
+
+// This file will be processed by the MIDL tool to
+// produce the type library (groveoa.tlb) and marshalling code.
+
+import "oaidl.idl";
+
+interface Node;
+interface NodeList;
+interface NamedNodeList;
+interface StringList;
+
+interface ElementNode;
+interface AttributeAssignmentNode;
+interface AttributeValueTokenNode;
+interface DataCharNode;
+interface SgmlDocumentNode;
+interface SgmlConstantsNode;
+interface PiNode;
+interface SdataNode;
+interface DocumentTypeNode;
+interface EntityNode;
+interface NotationNode;
+interface ExternalIdNode;
+interface ExternalDataNode;
+interface SubdocNode;
+interface MessageNode;
+interface StoragePos;
+interface ElementTypeNode;
+interface AttributeDefNode;
+interface ModelGroupNode;
+interface ElementTokenNode;
+interface PcdataTokenNode;
+interface DefaultEntityNode;
+
+enum NodeClass {
+       nodeClassElement,
+       nodeClassAttributeAssignment,
+       nodeClassAttributeValueToken,
+       nodeClassDataChar,
+       nodeClassSgmlDocument,
+       nodeClassSgmlConstants,
+       nodeClassPi,
+       nodeClassSdata,
+       nodeClassDocumentType,
+       nodeClassEntity,
+       nodeClassNotation,
+       nodeClassExternalId,
+       nodeClassExternalData,
+       nodeClassSubdoc,
+       nodeClassMessage,
+       nodeClassElementType,
+       nodeClassAttributeDef,
+       nodeClassElementToken,
+       nodeClassPcdataToken,
+       nodeClassDefaultEntity,
+       nodeClassModelGroup
+};
+
+enum EntityType {
+       entityTypeText,
+       entityTypeCdata,
+       entityTypeSdata,
+       entityTypeNdata,
+       entityTypeSubdocument,
+       entityTypePi
+};
+
+enum ContentType {
+       contentTypeCdata,
+       contentTypeRcdata,
+       contentTypeEmpty,
+       contentTypeAny,
+       contentTypeModelGroup
+};
+
+enum DeclValueType {
+       declValueTypeCdata,
+       declValueTypeEntity,
+       declValueTypeEntities,
+       declValueTypeId,
+       declValueTypeIdref,
+       declValueTypeIdrefs,
+       declValueTypeName,
+       declValueTypeNames,
+       declValueTypeNmtoken,
+    declValueTypeNmtokens,
+       declValueTypeNumber,
+       declValueTypeNumbers,
+       declValueTypeNutoken,
+       declValueTypeNutokens,
+       declValueTypeNotation,
+       declValueTypeNmtkgrp
+};
+
+enum DefaultValueType {
+       defaultValueTypeValue,
+       defaultValueTypeFixed,
+       defaultValueTypeRequired,
+       defaultValueTypeCurrent,
+       defaultValueTypeConref,
+       defaultValueTypeImplied
+};
+
+enum Connector {
+       connectorAnd,
+       connectorOr,
+       connectorSeq
+};
+
+enum OccurIndicator {
+       occurIndicatorOpt,
+       occurIndicatorPlus,
+       occurIndicatorRep
+};
+
+enum Severity {
+       severityInfo,
+       severityWarning,
+       severityError
+};
+
+[
+       object,
+       uuid(B3BE8C20-BA4A-11d0-9083-0020AF41CFC2),
+       dual,
+       pointer_default(unique)
+]
+interface Node : IDispatch
+{
+       [propget]
+       HRESULT Parent([out, retval] Node **);
+       [propget]
+       HRESULT Origin([out, retval] Node **);
+       /* Using SgmlDocumentNode as the return type doesn't work. */
+       [propget]
+       HRESULT GroveRoot([out, retval] Node **);
+       [propget]
+       HRESULT TreeRoot([out, retval] Node **);
+       [propget]
+       HRESULT Children([out, retval] NodeList **);
+       [propget]
+       HRESULT ChunkChildren([out, retval] NodeList **);
+       [propget]
+       HRESULT Class([out, retval] enum NodeClass *);
+       [propget]
+       HRESULT StoragePos([out, retval] StoragePos **);
+       [propget]
+       HRESULT SiblingIndex([out, retval] long *);
+
+       HRESULT FirstChild([out, retval] Node **);
+       HRESULT NextSibling([out, retval] Node **);
+       HRESULT NextChunkSibling([out, retval] Node **);
+}
+
+[
+       object,
+    uuid(D8334201-9FD6-11d0-9083-0020AF41CFC2),
+       dual,
+       pointer_default(unique)
+]
+interface SgmlDocumentNode : Node
+{
+       [propget]
+       HRESULT DocumentElement([out, retval] ElementNode **);
+       [propget]
+       HRESULT SgmlConstants([out, retval] SgmlConstantsNode **);
+       [propget]
+       HRESULT ApplicationInfo([out, retval] BSTR *);
+       [propget]
+       HRESULT ApplicationInfoNull([out, retval] VARIANT_BOOL *);
+       [propget]
+       HRESULT Prolog([out, retval] NodeList **);
+       [propget]
+       HRESULT Epilog([out, retval] NodeList **);
+       [propget]
+       HRESULT Elements([out, retval] NamedNodeList **);
+       [propget]
+       HRESULT Entities([out, retval] NamedNodeList **);
+       [propget]
+       HRESULT DefaultedEntities([out, retval] NamedNodeList **);
+       [propget]
+       HRESULT GoverningDoctype([out, retval] DocumentTypeNode **);
+       [propget]
+       HRESULT DoctypesAndLinktypes([out, retval] NamedNodeList **);
+       [propget]
+       HRESULT Messages([out, retval] NodeList **);
+}
+
+[
+       object,
+       uuid(D8334202-9FD6-11d0-9083-0020AF41CFC2),
+       dual,
+       pointer_default(unique)
+]
+interface ElementNode : Node
+{
+       [propget]
+       HRESULT Gi([out, retval] BSTR *);
+       [propget]
+       HRESULT Attributes([out, retval] NamedNodeList **);
+       [propget]
+       HRESULT Id([out, retval] BSTR *);
+       [propget]
+       HRESULT Content([out, retval] NodeList **);
+       [propget]
+       HRESULT ChunkContent([out, retval] NodeList **);
+       [propget]
+       HRESULT Included([out, retval] VARIANT_BOOL *);
+       [propget]
+       HRESULT MustOmitEndTag([out, retval] VARIANT_BOOL *);
+       [propget]
+       HRESULT ElementType([out, retval] ElementTypeNode **);
+}
+
+[
+       object,
+       uuid(D8334203-9FD6-11d0-9083-0020AF41CFC2),
+       dual,
+       pointer_default(unique)
+]
+interface DataCharNode : Node
+{
+       [propget]
+       HRESULT Char([out, retval] long *);
+       [propget]
+       HRESULT NonSgml([out, retval] long *);
+       [propget]
+       HRESULT CharChunk([out, retval] BSTR *);
+}
+
+[
+       object,
+       uuid(D8334204-9FD6-11d0-9083-0020AF41CFC2),
+       dual,
+       pointer_default(unique)
+]
+interface AttributeAssignmentNode : Node
+{
+       [propget]
+       HRESULT Name([out, retval] BSTR *);
+       [propget]
+       HRESULT Implied([out, retval] VARIANT_BOOL *);
+       [propget]
+       HRESULT Value([out, retval] NodeList **);
+       [propget]
+       HRESULT ChunkValue([out, retval] NodeList **);
+       [propget]
+       HRESULT TokenSep([out, retval] long *);
+       [propget, id(DISPID_VALUE)]
+       HRESULT StringValue([out, retval] BSTR *);
+       [propget]
+       HRESULT AttributeDef([out, retval] AttributeDefNode **);
+}
+
+[
+       object,
+       uuid(D8334205-9FD6-11d0-9083-0020AF41CFC2),
+       dual,
+       pointer_default(unique)
+]
+interface AttributeValueTokenNode : Node
+{
+       [propget, id(DISPID_VALUE)]
+       HRESULT Token([out, retval] BSTR *);
+       [propget]
+       HRESULT Referent([out, retval] ElementNode **);
+       [propget]
+       HRESULT Entity([out, retval] EntityNode **);
+       [propget]
+       HRESULT Notation([out, retval] NotationNode **);
+}
+
+[
+       object,
+       uuid(D8334206-9FD6-11d0-9083-0020AF41CFC2),
+       dual,
+       pointer_default(unique)
+]
+interface SgmlConstantsNode : Node
+{
+}
+
+[
+       object,
+       uuid(D8334207-9FD6-11d0-9083-0020AF41CFC2),
+       dual,
+       pointer_default(unique)
+]
+interface PiNode : Node
+{
+       [propget]
+       HRESULT SystemData([out, retval] BSTR *);
+       [propget]
+       HRESULT Entity([out, retval] EntityNode **);
+       [propget]
+       HRESULT EntityName([out, retval] BSTR *);
+}
+
+[
+       object,
+       uuid(D8334208-9FD6-11d0-9083-0020AF41CFC2),
+       dual,
+       pointer_default(unique)
+]
+interface SdataNode : Node
+{
+       [propget]
+       HRESULT SystemData([out, retval] BSTR *);
+       [propget]
+       HRESULT Entity([out, retval] EntityNode **);
+       [propget]
+       HRESULT EntityName([out, retval] BSTR *);
+}
+
+[
+       object,
+       uuid(D8334209-9FD6-11d0-9083-0020AF41CFC2),
+       dual,
+       pointer_default(unique)
+]
+interface DocumentTypeNode : Node
+{
+       [propget]
+       HRESULT Name([out, retval] BSTR *);
+       [propget]
+       HRESULT Governing([out, retval] VARIANT_BOOL *);
+       [propget]
+       HRESULT GeneralEntities([out, retval] NamedNodeList **);
+       [propget]
+       HRESULT Notations([out, retval] NamedNodeList **);
+       [propget]
+       HRESULT ElementTypes([out, retval] NamedNodeList **);
+       [propget]
+       HRESULT ParameterEntities([out, retval] NamedNodeList **);
+       [propget]
+       HRESULT DefaultEntity([out, retval] DefaultEntityNode **);
+}
+
+[
+       object,
+       uuid(D833420A-9FD6-11d0-9083-0020AF41CFC2),
+       dual,
+       pointer_default(unique)
+]
+interface EntityNode : Node
+{
+       [propget]
+       HRESULT Name([out, retval] BSTR *);
+       [propget]
+       HRESULT Text([out, retval] BSTR *);
+       [propget]
+       HRESULT TextNull([out, retval] VARIANT_BOOL *);
+       [propget]
+       HRESULT Notation([out, retval] NotationNode **);
+       [propget]
+       HRESULT NotationName([out, retval] BSTR *);
+       [propget]
+       HRESULT EntityType([out, retval] enum EntityType *);
+       [propget]
+       HRESULT Defaulted([out, retval] VARIANT_BOOL *);
+       [propget]
+       HRESULT Attributes([out, retval] NamedNodeList **);
+       [propget]
+       HRESULT ExternalId([out, retval] ExternalIdNode **);
+}
+
+[
+       object,
+       uuid(D833420B-9FD6-11d0-9083-0020AF41CFC2),
+       dual,
+       pointer_default(unique)
+]
+interface NotationNode : Node
+{
+       [propget]
+       HRESULT Name([out, retval] BSTR *);
+       [propget]
+       HRESULT ExternalId([out, retval] ExternalIdNode **);
+       [propget]
+       HRESULT AttributeDefs([out, retval] NamedNodeList **);
+}
+
+[
+       object,
+       uuid(D833420C-9FD6-11d0-9083-0020AF41CFC2),
+       dual,
+       pointer_default(unique)
+]
+interface ExternalIdNode : Node
+{
+       [propget]
+       HRESULT PublicId([out, retval] BSTR *);
+       [propget]
+       HRESULT PublicIdNull([out, retval] VARIANT_BOOL *);
+       [propget]
+       HRESULT SystemId([out, retval] BSTR *);
+       [propget]
+       HRESULT SystemIdNull([out, retval] VARIANT_BOOL *);
+       [propget]
+       HRESULT GeneratedSystemId([out, retval] BSTR *);
+}
+
+[
+       object,
+       uuid(D833420D-9FD6-11d0-9083-0020AF41CFC2),
+       dual,
+       pointer_default(unique)
+]
+interface ExternalDataNode : Node
+{
+       [propget]
+       HRESULT Entity([out, retval] EntityNode **);
+       [propget]
+       HRESULT EntityName([out, retval] BSTR *);
+}
+
+[
+       object,
+       uuid(D833420E-9FD6-11d0-9083-0020AF41CFC2),
+       dual,
+       pointer_default(unique)
+]
+interface SubdocNode : Node
+{
+       [propget]
+       HRESULT Entity([out, retval] EntityNode **);
+       [propget]
+       HRESULT EntityName([out, retval] BSTR *);
+}
+
+[
+       object,
+       uuid(D833420F-9FD6-11d0-9083-0020AF41CFC2),
+       dual,
+       pointer_default(unique)
+]
+interface ElementTypeNode : Node
+{
+       [propget]
+       HRESULT Gi([out, retval] BSTR *);
+       [propget]
+       HRESULT AttributeDefs([out, retval] NamedNodeList **);
+       [propget]
+       HRESULT ContentType([out, retval] enum ContentType *);
+       [propget]
+       HRESULT Exclusions([out, retval] StringList **);
+       [propget]
+       HRESULT Inclusions([out, retval] StringList **);
+       [propget]
+       HRESULT ModelGroup([out, retval] ModelGroupNode **);
+       [propget]
+       HRESULT OmitEndTag([out, retval] VARIANT_BOOL *);
+       [propget]
+       HRESULT OmitStartTag([out, retval] VARIANT_BOOL *);
+}
+
+[
+       object,
+       uuid(D8334210-9FD6-11d0-9083-0020AF41CFC2),
+       dual,
+       pointer_default(unique)
+]
+interface AttributeDefNode : Node
+{
+       [propget]
+       HRESULT Name([out, retval] BSTR *);
+       [propget]
+       HRESULT DeclValueType([out, retval] enum DeclValueType *);
+       [propget]
+       HRESULT DefaultValueType([out, retval] enum DefaultValueType *);
+       [propget]
+       HRESULT Tokens([out, retval] StringList **);
+       [propget]
+       HRESULT CurrentAttributeIndex([out, retval] long *);
+       [propget]
+       HRESULT CurrentGroup([out, retval] NodeList **);
+       [propget]
+       HRESULT DefaultValue([out, retval] NodeList **);
+}
+
+[
+       object,
+       uuid(D8334211-9FD6-11d0-9083-0020AF41CFC2),
+       dual,
+       pointer_default(unique)
+]
+interface ModelGroupNode : Node
+{
+       [propget]
+       HRESULT Connector([out, retval] enum Connector *);
+       [propget]
+       HRESULT OccurIndicator([out, retval] enum OccurIndicator *);
+       [propget]
+       HRESULT ContentTokens([out, retval] NodeList **);
+}
+
+[
+       object,
+       uuid(D8334212-9FD6-11d0-9083-0020AF41CFC2),
+       dual,
+       pointer_default(unique)
+]
+interface ElementTokenNode : Node
+{
+       [propget]
+       HRESULT Gi([out, retval] BSTR *);
+       [propget]
+       HRESULT OccurIndicator([out, retval] enum OccurIndicator *);
+}
+
+[
+       object,
+       uuid(D8334213-9FD6-11d0-9083-0020AF41CFC2),
+       dual,
+       pointer_default(unique)
+]
+interface PcdataTokenNode : Node
+{
+}
+
+[
+       object,
+       uuid(D8334214-9FD6-11d0-9083-0020AF41CFC2),
+       dual,
+       pointer_default(unique)
+]
+interface DefaultEntityNode : Node
+{
+       [propget]
+       HRESULT Name([out, retval] BSTR *);
+       [propget]
+       HRESULT Text([out, retval] BSTR *);
+       [propget]
+       HRESULT TextNull([out, retval] VARIANT_BOOL *);
+       [propget]
+       HRESULT Notation([out, retval] NotationNode **);
+       [propget]
+       HRESULT NotationName([out, retval] BSTR *);
+       [propget]
+       HRESULT EntityType([out, retval] enum EntityType *);
+       [propget]
+       HRESULT Attributes([out, retval] NamedNodeList **);
+       [propget]
+       HRESULT ExternalId([out, retval] ExternalIdNode **);
+}
+
+[
+       object,
+       uuid(8E5A3821-A213-11d0-9083-0020AF41CFC2),
+       dual,
+       pointer_default(unique)
+]
+interface MessageNode : Node
+{
+       [propget]
+       HRESULT Text([out, retval] BSTR *);
+       [propget]
+       HRESULT Severity([out, retval] enum Severity *);
+}
+
+[
+       object,
+       uuid(BA7A21C0-9FA9-11d0-9083-0020AF41CFC2),
+       dual,
+       pointer_default(unique)
+]
+interface NamedNodeList : IDispatch
+{
+       [propget, helpstring("Returns number of nodes.")]
+       HRESULT Count([out, retval] long *retval);
+
+       [propget, id(DISPID_VALUE), helpstring("Given a name, return the node.")]
+       /* if you use "name" for the parameter name, MIDL outputs a TLB file
+          that uses "name" instead of "Name" for "Name" properties */
+       HRESULT Item([in] BSTR nodeName, [out, retval] Node **retval);
+       [propget, restricted, id(DISPID_NEWENUM)]
+       HRESULT _NewEnum([out, retval] IUnknown **retval);
+
+    [propget]
+       HRESULT NodeList([out, retval] NodeList **retval);
+
+       HRESULT Normalize([in] BSTR nodeName, [out, retval] BSTR *);
+       HRESULT NodeName([in] Node *, [out, retval] BSTR *);
+}
+
+[
+       object,
+       uuid(BA7A21C1-9FA9-11d0-9083-0020AF41CFC2),
+       dual
+]
+interface NodeList : IDispatch
+{
+       HRESULT First([out, retval] Node **);
+       HRESULT Rest([out, retval] NodeList **);
+
+       [propget, helpstring("Returns number of nodes.")]
+       HRESULT Count([out, retval] long *retval);
+
+       [propget, id(DISPID_VALUE),
+        helpstring("Given an index, return the node.  First node has index 1.")]
+       HRESULT Item([in] long index, [out, retval] Node **retval);
+
+       [propget, restricted, id(DISPID_NEWENUM)]
+       HRESULT _NewEnum([out, retval] IUnknown **retval);      
+}
+
+[
+       object,
+       uuid(BA7A21C2-9FA9-11d0-9083-0020AF41CFC2),
+       dual
+]
+interface StringList : IDispatch
+{
+       HRESULT First([out, retval] BSTR *);
+       HRESULT Rest([out, retval] StringList **);
+
+       [propget, helpstring("Returns number of strings.")]
+       HRESULT Count([out, retval] long *retval);
+
+       [propget, id(DISPID_VALUE),
+        helpstring("Given an index, return the string.  First string has index 1.")]
+       HRESULT Item([in] long index, [out, retval] BSTR *retval);
+}
+
+[
+       object,
+       uuid(18E670A0-AE01-11D0-9083-0020AF41CFC2),
+       dual,
+       pointer_default(unique)
+]
+interface StoragePos : IDispatch
+{
+       [propget]
+       HRESULT StorageManagerName([out, retval] BSTR *);
+       [propget]
+       HRESULT StorageObjectId([out, retval] BSTR *);
+       [propget]
+       HRESULT LineNumber([out, retval] long *);
+       [propget]
+       HRESULT ColumnNumber([out, retval] long *);
+       [propget]
+       HRESULT ByteIndex([out, retval] long *);
+       [propget]
+       HRESULT CharacterIndex([out, retval] long *);
+}
+
+enum ErrorType {
+  errorIdref,
+  errorSignificant,
+  errorAfdr,
+  errorLpdNotation,
+  errorValid
+};
+
+enum WarningType {
+  warningSgmlDecl,
+  warningDuplicateEntity,
+  warningShould,
+  warningUndefinedElement,
+  warningDefaultEntityReference,
+  warningMixedContent,
+  warningUnclosedTag,
+  warningNet,
+  warningEmptyTag,
+  warningUnusedMap,
+  warningUnusedParam,
+  warningNotationSystemId
+};
+
+[
+       object,
+       uuid(557CE381-9EBD-11D0-9083-0020AF41CFC2),
+       dual,
+       hidden,
+       pointer_default(unique)
+]
+interface _GroveBuilder : IDispatch
+{
+       [propget]
+       HRESULT ExtraCatalogs([out, retval] BSTR *);
+       [propput]
+       HRESULT ExtraCatalogs([in] BSTR catalogs);
+       [propget]
+       HRESULT DefaultCatalogs([out, retval] BSTR *);
+       [propput]
+       HRESULT DefaultCatalogs([in] BSTR catalogs);
+       [propget]
+       HRESULT ExtraDirectories([out, retval] BSTR *);
+       [propput]
+       HRESULT ExtraDirectories([in] BSTR dirs);
+       [propget]
+       HRESULT DefaultDirectories([out, retval] BSTR *);
+       [propput]
+       HRESULT DefaultDirectories([in] BSTR dirs);
+       [propget]
+       HRESULT Encoding([out, retval] BSTR *);
+       [propput]
+       HRESULT Encoding([in] BSTR name);
+       [propget]
+       HRESULT DefaultEncoding([out, retval] BSTR *);
+       [propput]
+       HRESULT DefaultEncoding([in] BSTR name);
+       [propget]
+       HRESULT Includes([out, retval] BSTR *);
+       [propput]
+       HRESULT Includes([in] BSTR entityNames);
+    [propget]
+       HRESULT Warning([in] enum WarningType type, [out, retval] VARIANT_BOOL *);
+    [propput]
+       HRESULT Warning([in] enum WarningType type, [in] VARIANT_BOOL);
+    [propget]
+       HRESULT Error([in] enum ErrorType type, [out, retval] VARIANT_BOOL *);
+    [propput]
+       HRESULT Error([in] enum ErrorType type, [in] VARIANT_BOOL);
+    [propget]
+       HRESULT ValidateOnly([out, retval] VARIANT_BOOL *);
+    [propput]
+       HRESULT ValidateOnly([in] VARIANT_BOOL);
+
+       HRESULT parse([in] BSTR systemId, [out, retval] SgmlDocumentNode **);
+
+       HRESULT archParse([in] BSTR systemId,
+                                         [in] BSTR archNames,
+                                         [out, retval] SgmlDocumentNode **);
+}
+
+[
+       uuid(8E1C3D40-9EBC-11D0-9083-0020AF41CFC2),
+       version(1.0),
+       helpstring("SP Grove 1.0 Type Library")
+]
+library GROVE
+{
+       importlib("stdole32.tlb");
+       importlib("stdole2.tlb");
+
+       interface Node;
+       interface NodeList;
+       interface NamedNodeList;
+       interface StringList;
+
+       interface ElementNode;
+       interface AttributeAssignmentNode;
+       interface AttributeValueTokenNode;
+       interface DataCharNode;
+       interface SgmlDocumentNode;
+       interface SgmlConstantsNode;
+       interface PiNode;
+       interface SdataNode;
+       interface DocumentTypeNode;
+       interface EntityNode;
+       interface NotationNode;
+       interface ExternalIdNode;
+       interface ExternalDataNode;
+       interface SubdocNode;
+       interface MessageNode;
+       interface StoragePos;
+       interface ElementTypeNode;
+       interface AttributeDefNode;
+       interface ModelGroupNode;
+       interface ElementTokenNode;
+       interface PcdataTokenNode;
+       interface DefaultEntityNode;
+       
+       [
+               uuid(557CE382-9EBD-11D0-9083-0020AF41CFC2)
+       ]
+       coclass GroveBuilder
+       {
+               [default] interface _GroveBuilder;
+       }
+}
diff --git a/groveoa/groveoa.rc b/groveoa/groveoa.rc
new file mode 100644 (file)
index 0000000..1847edd
--- /dev/null
@@ -0,0 +1,136 @@
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "winres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "#include ""winres.h""\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "1 TYPELIB ""groveoa.tlb""\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+#ifndef _MAC
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 1,0,0,1
+ PRODUCTVERSION 1,0,0,1
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904B0"
+        BEGIN
+            VALUE "CompanyName", "\0"
+            VALUE "FileDescription", "groveoa Module\0"
+            VALUE "FileVersion", "1, 0, 0, 1\0"
+            VALUE "InternalName", "GROVEOA\0"
+            VALUE "LegalCopyright", "Copyright Â© 1995\0"
+            VALUE "OriginalFilename", "GROVEOA.DLL\0"
+            VALUE "ProductName", "groveoa Module\0"
+            VALUE "ProductVersion", "1, 0, 0, 1\0"
+            VALUE "OLESelfRegister", "\0"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x409, 1200
+    END
+END
+
+#endif    // !_MAC
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE DISCARDABLE 
+BEGIN
+    IDS_PROJNAME            "Groveoa"
+END
+
+#endif    // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.K.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// REGISTRY
+//
+
+IDR_GROVEBUILDER        REGISTRY DISCARDABLE    "GroveBuilder.rgs"
+#endif    // English (U.K.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+1 TYPELIB "groveoa.tlb"
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+
diff --git a/groveoa/resource.h b/groveoa/resource.h
new file mode 100644 (file)
index 0000000..a761496
--- /dev/null
@@ -0,0 +1,17 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by groveoa.rc
+//
+#define IDS_PROJNAME                    100
+#define IDR_GROVEBUILDER                101
+
+// Next default values for new objects
+// 
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE        201
+#define _APS_NEXT_COMMAND_VALUE         32768
+#define _APS_NEXT_CONTROL_VALUE         201
+#define _APS_NEXT_SYMED_VALUE           102
+#endif
+#endif
diff --git a/include/config.h.in b/include/config.h.in
new file mode 100644 (file)
index 0000000..2a6fd39
--- /dev/null
@@ -0,0 +1,336 @@
+// Copyright (c) 1994, 1995, 1996 James Clark
+// See the file COPYING for copying permission.
+
+#ifndef config_INCLUDED
+#define config_INCLUDED 1
+
+// This is a nasty hack to make sure that we have
+// the same sort of setup as was used for 
+// building libosp
+#include "@SPINCLUDEDIR@/config.h"
+
+#ifdef SP_NAMESPACE
+#ifndef GROVE_NAMESPACE
+#define GROVE_NAMESPACE OpenJade_Grove
+#endif
+#ifndef DSSSL_NAMESPACE
+#define DSSSL_NAMESPACE OpenJade_DSSSL
+#endif
+#endif
+
+#define OPENJADE_PACKAGE PACKAGE
+#define OPENJADE_VERSION VERSION
+#ifndef OPENJADE_MESSAGE_DOMAIN
+#define OPENJADE_MESSAGE_DOMAIN ""
+#endif
+#ifndef OPENJADE_LOCALE_DIR
+#define OPENJADE_LOCALE_DIR ""
+#endif
+
+#define SP_INCLUDE_UNISTD_H
+#define SP_POSIX_FILENAMES
+
+#ifdef __GNUG__
+// It's not missing, but it pulls in libg++
+#define SP_NEW_H_MISSING
+// set_new_handler() has to be declared extern "C"
+#define SP_SET_NEW_HANDLER_EXTERN_C
+#ifdef __APPLE__
+#define SP_DEFINE_TEMPLATES
+#undef SP_MANUAL_INST
+#endif
+#ifndef SP_ANSI_CLASS_INST
+#define SP_ANSI_CLASS_INST
+#endif
+#ifndef SP_HAVE_BOOL
+#define SP_HAVE_BOOL
+#endif
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
+#define SP_ANSI_FOR_SCOPE
+#endif
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8)
+#ifndef SP_ANSI_LIB
+#define SP_ANSI_LIB
+#endif
+#define SP_NO_STD_NAMESPACE
+#undef SP_NEW_H_MISSING
+#endif
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 9)
+#undef SP_NO_STD_NAMESPACE
+#endif
+#endif /* __GNUG__ */
+
+#if defined(sun) || defined(__sun)
+// struct stat has st_blksize member
+#define SP_STAT_BLKSIZE
+#endif
+
+#if (defined __MACH__) && (! defined __GNU__) && (! defined __APPLE__)
+#define SP_MUTEX_MACH
+#endif
+
+// MacOS X uses pthreads
+#if (defined __MACH__) && (defined __APPLE__)
+#define SP_USE_PTHREADS
+#endif
+
+#ifdef __EMX__
+// EMX 0.9a for OS/2
+#undef SP_POSIX_FILENAMES
+#define SP_MSDOS_FILENAMES
+#endif
+
+#ifdef _MSC_VER
+// Microsoft Visual C++ 4.0
+#undef SP_INCLUDE_UNISTD_H
+#define SP_INCLUDE_IO_H
+#ifndef SP_ANSI_CLASS_INST
+#define SP_ANSI_CLASS_INST
+#endif
+#undef SP_POSIX_FILENAMES
+#define SP_MSDOS_FILENAMES
+#define SP_SHORT_HEADERS
+#pragma warning ( disable : 4660 ) // already instantiated
+#pragma warning ( disable : 4661 ) // missing def for decl member
+#pragma warning ( disable : 4786 ) // debug symbol truncated (>255 chars)
+#pragma warning ( disable : 4018 ) // signed/unsigned mismatch
+#pragma warning ( disable : 4251 ) // __declspec(dllexport)
+#pragma warning ( disable : 4275 )
+#pragma warning ( disable : 4237 ) // future reserved keyword
+#define huge verybig
+#if _MSC_VER == 900
+#define SP_DECLARE_PLACEMENT_OPERATOR_NEW
+#endif
+#define set_new_handler _set_new_handler
+// Function passed to set_new_handler() returns int and takes size_t argument.
+#define SP_FANCY_NEW_HANDLER
+
+#if _MSC_VER >= 1100
+// Visual C++ 5.0
+#define SP_HAVE_BOOL
+#define SP_SIZEOF_BOOL_1
+#pragma warning ( disable : 4800 ) // forcing value to bool 'true' or
+                                   // 'false' (performance warning)
+#endif
+
+#if _MSC_VER >= 1200
+// Visual C++ 6.0
+#define SP_HAVE_PLACEMENT_OPERATOR_DELETE
+#define SP_HAVE_TYPENAME
+#endif
+
+#define SP_HAVE_SETMODE
+#define SP_DLLEXPORT __declspec(dllexport)
+#define SP_DLLIMPORT __declspec(dllimport)
+
+#ifdef _DLL
+#define SP_USE_DLL
+#endif
+
+#ifdef SP_USE_DLL
+#ifndef BUILD_LIBSP
+// It's not possible to export templates using __declspec(dllexport),
+// so instead we include the template definitions in the headers,
+// which allows Visual C++ to instantiate any needed templates
+// in the client.
+#define SP_DEFINE_TEMPLATES
+#endif
+#endif /* SP_USE_DLL */
+
+#ifndef SP_MANUAL_INST
+#ifndef SP_DEFINE_TEMPLATES
+#define SP_MANUAL_INST
+#endif
+#endif /* not SP_MANUAL_INST */
+
+#ifdef SP_MULTI_BYTE
+#define SP_WIDE_SYSTEM
+#endif
+
+// wchar_t's base type is an unsigned short
+#define SP_WCHAR_T_USHORT
+
+// Enable precompiled header support.
+#define SP_PCH
+// Don't compile in message text.
+#define SP_NO_MESSAGE_TEXT
+#ifdef _MT
+// Use Win32 critical section facilities
+#define SP_MUTEX_WIN32
+// Use the new Standard C++ library
+#ifndef SP_ANSI_LIB
+#define SP_ANSI_LIB
+#endif
+#if _MSC_VER < 1100
+// Versions prior to 5.0 don't use the std namespace
+#define SP_NO_STD_NAMESPACE
+#endif
+#endif /* _MT */
+#endif /* _MSC_VER */
+
+#ifdef __WATCOMC__
+// Watcom C++ 10.0a
+#define SP_MANUAL_INST
+#undef SP_POSIX_FILENAMES
+#define SP_MSDOS_FILENAMES
+#undef SP_INCLUDE_UNISTD_H
+#define SP_INCLUDE_IO_H
+#pragma warning 004 9
+#undef huge
+// Cannot handle T::~T in template.
+#define SP_QUAL_TEMPLATE_DTOR_BROKEN
+#define SP_HAVE_SETMODE
+#define _setmode setmode
+#if __WATCOMC__ < 1050
+#define _O_BINARY O_BINARY
+#endif
+#define SP_WCHAR_T_USHORT
+#if __WATCOMC__ >= 1100
+#define SP_HAVE_BOOL
+// #define SP_SIZEOF_BOOL_1
+#endif
+#endif /* __WATCOMC__ */
+
+#ifdef __BORLANDC__
+// Borland C++ 5.0
+#define SP_ANSI_FOR_SCOPE
+#define SP_HAVE_RTTI
+#define SP_HAVE_SETMODE
+#undef SP_INCLUDE_UNISTD_H
+#define SP_INCLUDE_IO_H
+#undef SP_POSIX_FILENAMES
+#define SP_MSDOS_FILENAMES
+#define SP_HAVE_BOOL
+#define SP_SHORT_HEADERS
+#define _O_BINARY O_BINARY
+#define _setmode setmode
+#define SP_ANSI_CLASS_INST
+#define SP_MANUAL_INST
+// Building as a DLL doesn't work with Borland C++ yet.
+#define SP_DLLEXPORT __declspec(dllexport)
+#define SP_DLLIMPORT __declspec(dllimport)
+#ifdef SP_USE_DLL
+#ifndef BUILD_LIBSP
+#define SP_DEFINE_TEMPLATES
+#endif
+#endif /* SP_USE_DLL */
+#define SP_WCHAR_T_USHORT
+#endif /* __BORLANDC__ */
+
+#ifdef __IBMCPP__
+// IBM CSet++ 2.1 from Horst Szillat <szillat@berlin.snafu.de>.
+#undef SP_POSIX_FILENAMES
+#define SP_MANUAL_INST
+#define SP_SHORT_HEADERS
+#define SP_MSDOS_FILENAMES
+#undef SP_INCLUDE_UNISTD_H
+#define SP_INCLUDE_IO_H
+#define S_IFMT (S_IFDIR|S_IFCHR|S_IFREG)
+#endif
+
+#ifdef __xlC__
+// IBM CSet++ 3.1 on AIX 4.1.
+// Use CXX=xlC and CC=xlC in the Makefile.
+// Note that -g creates massive executables and that -O
+// takes ages to compile and creates core dumping executables!
+// I havn't tried the socket stuff.
+// <Chris_Paulson-Ellis@3mail.3com.com>
+#define SP_MANUAL_INST
+#define SP_HAVE_LOCALE
+#define SP_STAT_BLKSIZE
+#endif /* __xlC__ */
+
+#ifdef macintosh
+// Apple MacOS. Tested only with Metrowerks CW10.
+// From Ashley Colin Yakeley <AshleyB@halcyon.com>
+#undef SP_POSIX_FILENAMES
+#define SP_MAC_FILENAMES
+#define SP_LINE_TERM1 '\r'
+
+#ifdef __MWERKS__
+// Metrowerks for some platform (MacOS in this case)
+
+#pragma mpwc_newline off
+#define SP_DEFINE_TEMPLATES
+// #define SP_USE_DLL -- __declspec doesn't work with classes (yet)
+#ifdef SP_USE_DLL
+#define SP_DLLEXPORT __declspec(export)
+#define SP_DLLIMPORT __declspec(import)
+#endif // SP_USE_DLL
+
+#if __MWERKS__ >= 0x1000
+// bool option only defined for CW10 and later (note __MWERKS__ is BCD)
+#if __option(bool)
+#define SP_HAVE_BOOL
+#endif // __option(bool)
+#endif // __MWERKS__ >= 0x1000
+#endif // __MWERKS__
+
+#if ('\n' != 10) || ('\r' != 13)
+#error "newlines incorrect"
+#endif
+
+#endif /* macintosh */
+
+#ifdef SP_HAVE_SETMODE
+#ifndef SP_LINE_TERM1
+#define SP_LINE_TERM1 '\r'
+#define SP_LINE_TERM2 '\n'
+#endif
+#endif /* not SP_HAVE_SETMODE */
+
+#ifndef SP_LINE_TERM1
+#define SP_LINE_TERM1 '\n'
+#endif
+
+#ifndef SP_ANSI_FOR_SCOPE
+// This simulates the new ANSI "for" scope rules
+#define for if (0); else for
+#endif
+
+#ifndef SP_HAVE_TYPENAME
+#define typename /* as nothing */
+#endif
+
+#ifndef SP_DLLEXPORT
+#define SP_DLLEXPORT /* as nothing */
+#endif
+
+#ifndef SP_DLLIMPORT
+#define SP_DLLIMPORT /* as nothing */
+#endif
+
+#ifdef SP_USE_DLL
+
+#ifdef BUILD_LIBSP
+#define SP_API SP_DLLEXPORT
+#else
+#define SP_API SP_DLLIMPORT
+#endif
+
+#else /* not SP_USE_DLL */
+
+#define SP_API /* as nothing */
+
+#endif /* not SP_USE_DLL */
+
+// SP_WIDE_SYSTEM says that your OS provides wide character interfaces
+// SP_WIDE_SYSTEM currently works only with Visual C++ and Windows NT/95
+// SP_WIDE_SYSTEM implies SP_MULTI_BYTE
+#ifdef SP_WIDE_SYSTEM
+#ifndef SP_MULTI_BYTE
+#define SP_MULTI_BYTE
+#endif
+#endif
+
+#ifdef SP_NAMESPACE
+#define SP_NAMESPACE_SCOPE SP_NAMESPACE::
+#else
+#define SP_NAMESPACE_SCOPE
+#endif
+
+#ifndef DEFAULT_SCHEME_BUILTINS
+#define DEFAULT_SCHEME_BUILTINS "builtins.dsl"
+#endif
+
+#endif /* not config_INCLUDED */
diff --git a/include/dsssl_ns.h b/include/dsssl_ns.h
new file mode 100644 (file)
index 0000000..c1d5c32
--- /dev/null
@@ -0,0 +1,48 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef dsssl_ns_INCLUDED
+#define dsssl_ns_INCLUDED 1
+
+#ifdef DSSSL_NAMESPACE
+
+#ifdef SP_NAMESPACE
+namespace SP_NAMESPACE { }
+#endif
+
+#ifdef GROVE_NAMESPACE
+namespace GROVE_NAMESPACE { }
+#endif
+
+namespace DSSSL_NAMESPACE {
+
+#ifdef SP_NAMESPACE
+  using namespace SP_NAMESPACE;
+#endif
+
+#ifdef GROVE_NAMESPACE
+  using namespace GROVE_NAMESPACE;
+#endif
+
+#if _MSC_VER >= 1100
+  /* This works around a bug with using directives in Visual C++ 6.0.
+     I don't know if it also works in 5.0 */
+  const int work_around_bug_in_visual_c_6 = 0;
+}
+
+namespace DSSSL_NAMESPACE {
+
+#ifdef SP_NAMESPACE
+  using namespace SP_NAMESPACE;
+#endif
+
+#ifdef GROVE_NAMESPACE
+  using namespace GROVE_NAMESPACE;
+#endif
+
+#endif /* _MSC_VER >= 1100 */
+}
+
+#endif /* DSSSL_NAMESPACE */
+
+#endif /* not dsssl_ns_INCLUDED */
diff --git a/instmac.pl b/instmac.pl
new file mode 100755 (executable)
index 0000000..25ebc0a
--- /dev/null
@@ -0,0 +1,79 @@
+#! /bin/perl -w
+#
+# Copyright (c) 1999 Avi Kivity
+# instmac.pl --  generate template instantiations
+#                derived from James Clark's instmac.m4
+#
+
+$index = 0;
+$func_index = 0;
+
+sub header
+    {
+    print <<__HEADER__;
+#ifdef SP_NAMESPACE
+namespace SP_NAMESPACE {
+#endif
+
+
+#ifdef SP_NAMESPACE
+}
+#endif
+__HEADER__
+    }
+
+sub instantiate
+    {
+    my ($class) = @_;
+    print <<__INSTANTIATION__;
+#ifdef __DECCXX
+#pragma define_template $class
+#else
+#ifdef __xlC__
+#pragma define($class)
+#else
+#ifdef SP_ANSI_CLASS_INST
+template class $class;
+#else
+typedef $class Dummy_$index;
+#endif
+#endif
+#endif
+__INSTANTIATION__
+    ++$index;
+    }
+
+sub func_instantiate
+    {
+    my ($a1, $a2, $a3, $a4) = @_;
+    print <<__FUNC_INSTANTIATION__;
+#ifdef __GNUG__
+template void $a1($a2, $a3, $a4);
+#else
+static
+void  func_$func_index ($a2 arg1, $a3 arg2, $a4 arg3) {
+(void)$a1(arg1, arg2, arg3);
+}
+#endif
+__FUNC_INSTANTIATION__
+    ++$func_index;
+    }
+
+header;
+while (<ARGV>)
+    {
+    if (/^__instantiate\((.*)\)\s*$/)
+        {
+        $arg = $1;
+        $arg = $1 if /`(.*)'/;
+        instantiate $arg;
+        }
+    elsif (/^__instantiate\((.*)\)\s*$/)
+        {
+        die "instantiate_func3 found!";
+        }
+    else
+        {
+        print;
+        }
+    }
diff --git a/jade-generate.mak b/jade-generate.mak
new file mode 100644 (file)
index 0000000..58e7fbb
--- /dev/null
@@ -0,0 +1,39 @@
+# This is a Makefile for nmake that makes all the .cxx and .h files that
+# are automatically generated.  It's too painful to do in the IDE.
+# You'll need perl in your PATH to use this.
+
+PERL=perl
+
+GENSRCS=\
+style\style_inst.cxx \
+style\FlowObj_inst.cxx \
+style\primitive_inst.cxx \
+style\common_inst.cxx \
+spgrove\grove_inst.cxx \
+jade\HtmlFOTBuilder_inst.cxx \
+jade\RtfFOTBuilder_inst.cxx \
+jade\TeXFOTBuilder_inst.cxx \
+jade\MifFOTBuilder_inst.cxx \
+jade\TransformFOTBuilder_inst.cxx \
+jade\JadeMessages.h \
+jade\HtmlMessages.h \
+jade\RtfMessages.h \
+jade\TeXMessages.h \
+jade\MifMessages.h \
+style\DssslAppMessages.h \
+style\InterpreterMessages.h
+
+.SUFFIXES: .m4 .msg
+
+all: $(GENSRCS)
+
+
+.m4.cxx:
+       del /f $@ 2> nul
+       $(PERL) lib\instmac.pl $< >$@
+       attrib +r $@
+
+.msg.h:
+       del /f $@ 2> nul
+       $(PERL) -w msggen.pl $<
+       attrib +r $@
diff --git a/jade.dsw b/jade.dsw
new file mode 100644 (file)
index 0000000..304bf8d
--- /dev/null
+++ b/jade.dsw
@@ -0,0 +1,252 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "all"=.\all\all.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name groveoa
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name jade
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name nsgmls
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name sgmlnorm
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name spam
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name spent
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name sx
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "grove"=.\grove\grove.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "groveoa"=.\groveoa\groveoa.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name grove
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name spgrove
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name lib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "jade"=.\jade\jade.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+    begin source code control
+    c:\home\work\sp\jade.pj
+    .
+    end source code control
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name grove
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name spgrove
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name style
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name lib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "jadedist"=.\jadedist\jadedist.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name all
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "lib"=.\lib\lib.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "nsgmls"=.\nsgmls\nsgmls.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name lib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "sgmlnorm"=.\sgmlnorm\sgmlnorm.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name lib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "spam"=.\spam\spam.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name lib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "spent"=.\spent\spent.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name lib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "spgrove"=.\spgrove\spgrove.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name grove
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name lib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "style"=.\style\style.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name grove
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name spgrove
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name lib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "sx"=.\sx\sx.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name lib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/jade.mak b/jade.mak
new file mode 100644 (file)
index 0000000..33765b3
--- /dev/null
+++ b/jade.mak
@@ -0,0 +1,6956 @@
+# Microsoft Developer Studio Generated NMAKE File, Format Version 4.20
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+# TARGTYPE "Win32 (x86) External Target" 0x0106
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+!IF "$(CFG)" == ""
+CFG=groveoa - Win32 Debug
+!MESSAGE No configuration specified.  Defaulting to groveoa - Win32 Debug.
+!ENDIF 
+
+!IF "$(CFG)" != "grove - Win32 Release" && "$(CFG)" != "grove - Win32 Debug" &&\
+ "$(CFG)" != "spgrove - Win32 Release" && "$(CFG)" != "spgrove - Win32 Debug" &&\
+ "$(CFG)" != "style - Win32 Release" && "$(CFG)" != "style - Win32 Debug" &&\
+ "$(CFG)" != "jade - Win32 Release" && "$(CFG)" != "jade - Win32 Debug" &&\
+ "$(CFG)" != "jadedist - Win32 Release" && "$(CFG)" != "groveoa - Win32 Release"\
+ && "$(CFG)" != "groveoa - Win32 Debug"
+!MESSAGE Invalid configuration "$(CFG)" specified.
+!MESSAGE You can specify a configuration when running NMAKE on this makefile
+!MESSAGE by defining the macro CFG on the command line.  For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "jade.mak" CFG="groveoa - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "grove - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "grove - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "spgrove - Win32 Release" (based on\
+ "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "spgrove - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "style - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "style - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "jade - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "jade - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE "jadedist - Win32 Release" (based on "Win32 (x86) External Target")
+!MESSAGE "groveoa - Win32 Release" (based on\
+ "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "groveoa - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE 
+!ERROR An invalid configuration is specified.
+!ENDIF 
+
+!IF "$(OS)" == "Windows_NT"
+NULL=
+!ELSE 
+NULL=nul
+!ENDIF 
+################################################################################
+# Begin Project
+# PROP Target_Last_Scanned "groveoa - Win32 Debug"
+
+!IF  "$(CFG)" == "grove - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "grove\Release"
+# PROP BASE Intermediate_Dir "grove\Release"
+# PROP BASE Target_Dir "grove"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "grove\Release"
+# PROP Intermediate_Dir "grove\Release"
+# PROP Target_Dir "grove"
+OUTDIR=.\grove\Release
+INTDIR=.\grove\Release
+
+ALL : ".\bin\grove.dll"
+
+CLEAN : 
+       -@erase "$(INTDIR)\LocNode.obj"
+       -@erase "$(INTDIR)\Node.obj"
+       -@erase "$(OUTDIR)\grove.exp"
+       -@erase "$(OUTDIR)\grove.lib"
+       -@erase ".\bin\grove.dll"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "SP_MULTI_BYTE" /D GROVE_NAMESPACE=James_Clark_GROVE /D SP_NAMESPACE=James_Clark_SP /D "BUILD_LIBGROVE" /YX /c
+CPP_PROJ=/nologo /MD /W3 /GX /O2 /I "include" /D "NDEBUG" /D "WIN32" /D\
+ "_WINDOWS" /D "SP_MULTI_BYTE" /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ SP_NAMESPACE=James_Clark_SP /D "BUILD_LIBGROVE" /Fp"$(INTDIR)/grove.pch" /YX\
+ /Fo"$(INTDIR)/" /c 
+CPP_OBJS=.\grove\Release/
+CPP_SBRS=.\.
+
+.c{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.c{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+MTL=mktyplib.exe
+# ADD BASE MTL /nologo /D "NDEBUG" /win32
+# ADD MTL /nologo /D "NDEBUG" /win32
+MTL_PROJ=/nologo /D "NDEBUG" /win32 
+RSC=rc.exe
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/grove.bsc" 
+BSC32_SBRS= \
+       
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:0x20200000 /subsystem:windows /dll /machine:I386 /out:"bin\grove.dll"
+# SUBTRACT LINK32 /profile
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
+ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\
+ odbccp32.lib /nologo /base:0x20200000 /subsystem:windows /dll /incremental:no\
+ /pdb:"$(OUTDIR)/grove.pdb" /machine:I386 /out:"bin\grove.dll"\
+ /implib:"$(OUTDIR)/grove.lib" 
+LINK32_OBJS= \
+       "$(INTDIR)\LocNode.obj" \
+       "$(INTDIR)\Node.obj"
+
+".\bin\grove.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+    $(LINK32) @<<
+  $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF  "$(CFG)" == "grove - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "grove\Debug"
+# PROP BASE Intermediate_Dir "grove\Debug"
+# PROP BASE Target_Dir "grove"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "grove\Debug"
+# PROP Intermediate_Dir "grove\Debug"
+# PROP Target_Dir "grove"
+OUTDIR=.\grove\Debug
+INTDIR=.\grove\Debug
+
+ALL : ".\dbgbin\grove.dll"
+
+CLEAN : 
+       -@erase "$(INTDIR)\LocNode.obj"
+       -@erase "$(INTDIR)\Node.obj"
+       -@erase "$(INTDIR)\vc40.idb"
+       -@erase "$(INTDIR)\vc40.pdb"
+       -@erase "$(OUTDIR)\grove.exp"
+       -@erase "$(OUTDIR)\grove.lib"
+       -@erase "$(OUTDIR)\grove.pdb"
+       -@erase ".\dbgbin\grove.dll"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "SP_MULTI_BYTE" /D GROVE_NAMESPACE=James_Clark_GROVE /D SP_NAMESPACE=James_Clark_SP /D "BUILD_LIBGROVE" /YX /c
+CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /I "include" /D "_DEBUG" /D "WIN32"\
+ /D "_WINDOWS" /D "SP_MULTI_BYTE" /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ SP_NAMESPACE=James_Clark_SP /D "BUILD_LIBGROVE" /Fp"$(INTDIR)/grove.pch" /YX\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c 
+CPP_OBJS=.\grove\Debug/
+CPP_SBRS=.\.
+
+.c{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.c{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+MTL=mktyplib.exe
+# ADD BASE MTL /nologo /D "_DEBUG" /win32
+# ADD MTL /nologo /D "_DEBUG" /win32
+MTL_PROJ=/nologo /D "_DEBUG" /win32 
+RSC=rc.exe
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/grove.bsc" 
+BSC32_SBRS= \
+       
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:0x20200000 /subsystem:windows /dll /incremental:no /debug /machine:I386 /out:"dbgbin\grove.dll"
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
+ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\
+ odbccp32.lib /nologo /base:0x20200000 /subsystem:windows /dll /incremental:no\
+ /pdb:"$(OUTDIR)/grove.pdb" /debug /machine:I386 /out:"dbgbin\grove.dll"\
+ /implib:"$(OUTDIR)/grove.lib" 
+LINK32_OBJS= \
+       "$(INTDIR)\LocNode.obj" \
+       "$(INTDIR)\Node.obj"
+
+".\dbgbin\grove.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+    $(LINK32) @<<
+  $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF  "$(CFG)" == "spgrove - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "spgrove\Release"
+# PROP BASE Intermediate_Dir "spgrove\Release"
+# PROP BASE Target_Dir "spgrove"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "spgrove\Release"
+# PROP Intermediate_Dir "spgrove\Release"
+# PROP Target_Dir "spgrove"
+OUTDIR=.\spgrove\Release
+INTDIR=.\spgrove\Release
+
+ALL : "grove - Win32 Release" ".\bin\spgrove.dll"
+
+CLEAN : 
+       -@erase "$(INTDIR)\GroveApp.obj"
+       -@erase "$(INTDIR)\GroveBuilder.obj"
+       -@erase "$(INTDIR)\SdNode.obj"
+       -@erase "$(OUTDIR)\spgrove.exp"
+       -@erase "$(OUTDIR)\spgrove.lib"
+       -@erase ".\bin\spgrove.dll"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "include" /I "grove" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "SP_MULTI_BYTE" /D GROVE_NAMESPACE=James_Clark_GROVE /D SP_NAMESPACE=James_Clark_SP /D "BUILD_LIBSPGROVE" /YX /c
+CPP_PROJ=/nologo /MD /W3 /GX /O2 /I "include" /I "grove" /D "NDEBUG" /D "WIN32"\
+ /D "_WINDOWS" /D "SP_MULTI_BYTE" /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ SP_NAMESPACE=James_Clark_SP /D "BUILD_LIBSPGROVE" /Fp"$(INTDIR)/spgrove.pch"\
+ /YX /Fo"$(INTDIR)/" /c 
+CPP_OBJS=.\spgrove\Release/
+CPP_SBRS=.\.
+
+.c{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.c{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+MTL=mktyplib.exe
+# ADD BASE MTL /nologo /D "NDEBUG" /win32
+# ADD MTL /nologo /D "NDEBUG" /win32
+MTL_PROJ=/nologo /D "NDEBUG" /win32 
+RSC=rc.exe
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/spgrove.bsc" 
+BSC32_SBRS= \
+       
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
+# ADD LINK32 lib\Release\sp133.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:0x20100000 /subsystem:windows /dll /machine:I386 /out:"bin/spgrove.dll"
+# SUBTRACT LINK32 /profile
+LINK32_FLAGS=lib\Release\sp133.lib kernel32.lib user32.lib gdi32.lib\
+ winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib\
+ uuid.lib odbc32.lib odbccp32.lib /nologo /base:0x20100000 /subsystem:windows\
+ /dll /incremental:no /pdb:"$(OUTDIR)/spgrove.pdb" /machine:I386\
+ /out:"bin/spgrove.dll" /implib:"$(OUTDIR)/spgrove.lib" 
+LINK32_OBJS= \
+       "$(INTDIR)\GroveApp.obj" \
+       "$(INTDIR)\GroveBuilder.obj" \
+       "$(INTDIR)\SdNode.obj" \
+       ".\grove\Release\grove.lib"
+
+".\bin\spgrove.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+    $(LINK32) @<<
+  $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF  "$(CFG)" == "spgrove - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "spgrove\Debug"
+# PROP BASE Intermediate_Dir "spgrove\Debug"
+# PROP BASE Target_Dir "spgrove"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "spgrove\Debug"
+# PROP Intermediate_Dir "spgrove\Debug"
+# PROP Target_Dir "spgrove"
+OUTDIR=.\spgrove\Debug
+INTDIR=.\spgrove\Debug
+
+ALL : "grove - Win32 Debug" ".\dbgbin\spgrove.dll"
+
+CLEAN : 
+       -@erase "$(INTDIR)\GroveApp.obj"
+       -@erase "$(INTDIR)\GroveBuilder.obj"
+       -@erase "$(INTDIR)\SdNode.obj"
+       -@erase "$(INTDIR)\vc40.idb"
+       -@erase "$(INTDIR)\vc40.pdb"
+       -@erase "$(OUTDIR)\spgrove.exp"
+       -@erase "$(OUTDIR)\spgrove.lib"
+       -@erase "$(OUTDIR)\spgrove.pdb"
+       -@erase ".\dbgbin\spgrove.dll"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "include" /I "grove" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "SP_MULTI_BYTE" /D GROVE_NAMESPACE=James_Clark_GROVE /D SP_NAMESPACE=James_Clark_SP /D "BUILD_LIBSPGROVE" /YX /c
+CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /I "include" /I "grove" /D "_DEBUG"\
+ /D "WIN32" /D "_WINDOWS" /D "SP_MULTI_BYTE" /D\
+ GROVE_NAMESPACE=James_Clark_GROVE /D SP_NAMESPACE=James_Clark_SP /D\
+ "BUILD_LIBSPGROVE" /Fp"$(INTDIR)/spgrove.pch" /YX /Fo"$(INTDIR)/"\
+ /Fd"$(INTDIR)/" /c 
+CPP_OBJS=.\spgrove\Debug/
+CPP_SBRS=.\.
+
+.c{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.c{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+MTL=mktyplib.exe
+# ADD BASE MTL /nologo /D "_DEBUG" /win32
+# ADD MTL /nologo /D "_DEBUG" /win32
+MTL_PROJ=/nologo /D "_DEBUG" /win32 
+RSC=rc.exe
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/spgrove.bsc" 
+BSC32_SBRS= \
+       
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386
+# ADD LINK32 lib\Debug\sp133d.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:0x20100000 /subsystem:windows /dll /incremental:no /debug /machine:I386 /out:"dbgbin\spgrove.dll"
+LINK32_FLAGS=lib\Debug\sp133d.lib kernel32.lib user32.lib gdi32.lib\
+ winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib\
+ uuid.lib odbc32.lib odbccp32.lib /nologo /base:0x20100000 /subsystem:windows\
+ /dll /incremental:no /pdb:"$(OUTDIR)/spgrove.pdb" /debug /machine:I386\
+ /out:"dbgbin\spgrove.dll" /implib:"$(OUTDIR)/spgrove.lib" 
+LINK32_OBJS= \
+       "$(INTDIR)\GroveApp.obj" \
+       "$(INTDIR)\GroveBuilder.obj" \
+       "$(INTDIR)\SdNode.obj" \
+       ".\grove\Debug\grove.lib"
+
+".\dbgbin\spgrove.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+    $(LINK32) @<<
+  $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF  "$(CFG)" == "style - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "style\Release"
+# PROP BASE Intermediate_Dir "style\Release"
+# PROP BASE Target_Dir "style"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "style\Release"
+# PROP Intermediate_Dir "style\Release"
+# PROP Target_Dir "style"
+OUTDIR=.\style\Release
+INTDIR=.\style\Release
+
+ALL : "spgrove - Win32 Release" "grove - Win32 Release" ".\bin\style.dll"
+
+CLEAN : 
+       -@erase "$(INTDIR)\Collector.obj"
+       -@erase "$(INTDIR)\common_inst.obj"
+       -@erase "$(INTDIR)\DssslApp.obj"
+       -@erase "$(INTDIR)\DssslSpecEventHandler.obj"
+       -@erase "$(INTDIR)\ELObj.obj"
+       -@erase "$(INTDIR)\ELObjMessageArg.obj"
+       -@erase "$(INTDIR)\Expression.obj"
+       -@erase "$(INTDIR)\FlowObj.obj"
+       -@erase "$(INTDIR)\FOTBuilder.obj"
+       -@erase "$(INTDIR)\GroveManager.obj"
+       -@erase "$(INTDIR)\InheritedC.obj"
+       -@erase "$(INTDIR)\Insn.obj"
+       -@erase "$(INTDIR)\Interpreter.obj"
+       -@erase "$(INTDIR)\InterpreterMessages.obj"
+       -@erase "$(INTDIR)\MacroFlowObj.obj"
+       -@erase "$(INTDIR)\NumberCache.obj"
+       -@erase "$(INTDIR)\Pattern.obj"
+       -@erase "$(INTDIR)\primitive.obj"
+       -@erase "$(INTDIR)\ProcessContext.obj"
+       -@erase "$(INTDIR)\ProcessingMode.obj"
+       -@erase "$(INTDIR)\SchemeParser.obj"
+       -@erase "$(INTDIR)\Style.obj"
+       -@erase "$(INTDIR)\style.pch"
+       -@erase "$(INTDIR)\style_inst.obj"
+       -@erase "$(INTDIR)\StyleEngine.obj"
+       -@erase "$(INTDIR)\stylelib.obj"
+       -@erase "$(OUTDIR)\style.exp"
+       -@erase "$(OUTDIR)\style.lib"
+       -@erase ".\bin\style.dll"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "spgrove" /I "grove" /I "include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D "SP_MULTI_BYTE" /YX /c
+CPP_PROJ=/nologo /MD /W3 /GX /O2 /I "spgrove" /I "grove" /I "include" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/style.pch" /YX /Fo"$(INTDIR)/" /c 
+CPP_OBJS=.\style\Release/
+CPP_SBRS=.\.
+
+.c{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.c{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+MTL=mktyplib.exe
+# ADD BASE MTL /nologo /D "NDEBUG" /win32
+# ADD MTL /nologo /D "NDEBUG" /win32
+MTL_PROJ=/nologo /D "NDEBUG" /win32 
+RSC=rc.exe
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/style.bsc" 
+BSC32_SBRS= \
+       
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
+# ADD LINK32 lib\Release\sp133.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:0x20000000 /subsystem:windows /dll /machine:I386 /out:"bin\style.dll"
+# SUBTRACT LINK32 /profile
+LINK32_FLAGS=lib\Release\sp133.lib kernel32.lib user32.lib gdi32.lib\
+ winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib\
+ uuid.lib odbc32.lib odbccp32.lib /nologo /base:0x20000000 /subsystem:windows\
+ /dll /incremental:no /pdb:"$(OUTDIR)/style.pdb" /machine:I386\
+ /out:"bin\style.dll" /implib:"$(OUTDIR)/style.lib" 
+LINK32_OBJS= \
+       "$(INTDIR)\Collector.obj" \
+       "$(INTDIR)\common_inst.obj" \
+       "$(INTDIR)\DssslApp.obj" \
+       "$(INTDIR)\DssslSpecEventHandler.obj" \
+       "$(INTDIR)\ELObj.obj" \
+       "$(INTDIR)\ELObjMessageArg.obj" \
+       "$(INTDIR)\Expression.obj" \
+       "$(INTDIR)\FlowObj.obj" \
+       "$(INTDIR)\FOTBuilder.obj" \
+       "$(INTDIR)\GroveManager.obj" \
+       "$(INTDIR)\InheritedC.obj" \
+       "$(INTDIR)\Insn.obj" \
+       "$(INTDIR)\Interpreter.obj" \
+       "$(INTDIR)\InterpreterMessages.obj" \
+       "$(INTDIR)\MacroFlowObj.obj" \
+       "$(INTDIR)\NumberCache.obj" \
+       "$(INTDIR)\Pattern.obj" \
+       "$(INTDIR)\primitive.obj" \
+       "$(INTDIR)\ProcessContext.obj" \
+       "$(INTDIR)\ProcessingMode.obj" \
+       "$(INTDIR)\SchemeParser.obj" \
+       "$(INTDIR)\Style.obj" \
+       "$(INTDIR)\style_inst.obj" \
+       "$(INTDIR)\StyleEngine.obj" \
+       "$(INTDIR)\stylelib.obj" \
+       ".\grove\Release\grove.lib" \
+       ".\spgrove\Release\spgrove.lib"
+
+".\bin\style.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+    $(LINK32) @<<
+  $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "style\Debug"
+# PROP BASE Intermediate_Dir "style\Debug"
+# PROP BASE Target_Dir "style"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "style\Debug"
+# PROP Intermediate_Dir "style\Debug"
+# PROP Target_Dir "style"
+OUTDIR=.\style\Debug
+INTDIR=.\style\Debug
+
+ALL : "spgrove - Win32 Debug" "grove - Win32 Debug" ".\dbgbin\style.dll"\
+ "$(OUTDIR)\style.bsc"
+
+CLEAN : 
+       -@erase "$(INTDIR)\Collector.obj"
+       -@erase "$(INTDIR)\Collector.sbr"
+       -@erase "$(INTDIR)\common_inst.obj"
+       -@erase "$(INTDIR)\common_inst.sbr"
+       -@erase "$(INTDIR)\DssslApp.obj"
+       -@erase "$(INTDIR)\DssslApp.sbr"
+       -@erase "$(INTDIR)\DssslSpecEventHandler.obj"
+       -@erase "$(INTDIR)\DssslSpecEventHandler.sbr"
+       -@erase "$(INTDIR)\ELObj.obj"
+       -@erase "$(INTDIR)\ELObj.sbr"
+       -@erase "$(INTDIR)\ELObjMessageArg.obj"
+       -@erase "$(INTDIR)\ELObjMessageArg.sbr"
+       -@erase "$(INTDIR)\Expression.obj"
+       -@erase "$(INTDIR)\Expression.sbr"
+       -@erase "$(INTDIR)\FlowObj.obj"
+       -@erase "$(INTDIR)\FlowObj.sbr"
+       -@erase "$(INTDIR)\FOTBuilder.obj"
+       -@erase "$(INTDIR)\FOTBuilder.sbr"
+       -@erase "$(INTDIR)\GroveManager.obj"
+       -@erase "$(INTDIR)\GroveManager.sbr"
+       -@erase "$(INTDIR)\InheritedC.obj"
+       -@erase "$(INTDIR)\InheritedC.sbr"
+       -@erase "$(INTDIR)\Insn.obj"
+       -@erase "$(INTDIR)\Insn.sbr"
+       -@erase "$(INTDIR)\Interpreter.obj"
+       -@erase "$(INTDIR)\Interpreter.sbr"
+       -@erase "$(INTDIR)\InterpreterMessages.obj"
+       -@erase "$(INTDIR)\InterpreterMessages.sbr"
+       -@erase "$(INTDIR)\MacroFlowObj.obj"
+       -@erase "$(INTDIR)\MacroFlowObj.sbr"
+       -@erase "$(INTDIR)\NumberCache.obj"
+       -@erase "$(INTDIR)\NumberCache.sbr"
+       -@erase "$(INTDIR)\Pattern.obj"
+       -@erase "$(INTDIR)\Pattern.sbr"
+       -@erase "$(INTDIR)\primitive.obj"
+       -@erase "$(INTDIR)\primitive.sbr"
+       -@erase "$(INTDIR)\ProcessContext.obj"
+       -@erase "$(INTDIR)\ProcessContext.sbr"
+       -@erase "$(INTDIR)\ProcessingMode.obj"
+       -@erase "$(INTDIR)\ProcessingMode.sbr"
+       -@erase "$(INTDIR)\SchemeParser.obj"
+       -@erase "$(INTDIR)\SchemeParser.sbr"
+       -@erase "$(INTDIR)\Style.obj"
+       -@erase "$(INTDIR)\style.pch"
+       -@erase "$(INTDIR)\Style.sbr"
+       -@erase "$(INTDIR)\style_inst.obj"
+       -@erase "$(INTDIR)\style_inst.sbr"
+       -@erase "$(INTDIR)\StyleEngine.obj"
+       -@erase "$(INTDIR)\StyleEngine.sbr"
+       -@erase "$(INTDIR)\stylelib.obj"
+       -@erase "$(INTDIR)\stylelib.sbr"
+       -@erase "$(INTDIR)\vc40.pdb"
+       -@erase "$(OUTDIR)\style.bsc"
+       -@erase "$(OUTDIR)\style.exp"
+       -@erase "$(OUTDIR)\style.lib"
+       -@erase "$(OUTDIR)\style.pdb"
+       -@erase ".\dbgbin\style.dll"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /MDd /W3 /GX /Zi /Od /I "spgrove" /I "grove" /I "include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D "SP_MULTI_BYTE" /FR /YX /c
+CPP_PROJ=/nologo /MDd /W3 /GX /Zi /Od /I "spgrove" /I "grove" /I "include" /D\
+ "_DEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /FR"$(INTDIR)/" /Fp"$(INTDIR)/style.pch" /YX /Fo"$(INTDIR)/"\
+ /Fd"$(INTDIR)/" /c 
+CPP_OBJS=.\style\Debug/
+CPP_SBRS=.\style\Debug/
+
+.c{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.c{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+MTL=mktyplib.exe
+# ADD BASE MTL /nologo /D "_DEBUG" /win32
+# ADD MTL /nologo /D "_DEBUG" /win32
+MTL_PROJ=/nologo /D "_DEBUG" /win32 
+RSC=rc.exe
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/style.bsc" 
+BSC32_SBRS= \
+       "$(INTDIR)\Collector.sbr" \
+       "$(INTDIR)\common_inst.sbr" \
+       "$(INTDIR)\DssslApp.sbr" \
+       "$(INTDIR)\DssslSpecEventHandler.sbr" \
+       "$(INTDIR)\ELObj.sbr" \
+       "$(INTDIR)\ELObjMessageArg.sbr" \
+       "$(INTDIR)\Expression.sbr" \
+       "$(INTDIR)\FlowObj.sbr" \
+       "$(INTDIR)\FOTBuilder.sbr" \
+       "$(INTDIR)\GroveManager.sbr" \
+       "$(INTDIR)\InheritedC.sbr" \
+       "$(INTDIR)\Insn.sbr" \
+       "$(INTDIR)\Interpreter.sbr" \
+       "$(INTDIR)\InterpreterMessages.sbr" \
+       "$(INTDIR)\MacroFlowObj.sbr" \
+       "$(INTDIR)\NumberCache.sbr" \
+       "$(INTDIR)\Pattern.sbr" \
+       "$(INTDIR)\primitive.sbr" \
+       "$(INTDIR)\ProcessContext.sbr" \
+       "$(INTDIR)\ProcessingMode.sbr" \
+       "$(INTDIR)\SchemeParser.sbr" \
+       "$(INTDIR)\Style.sbr" \
+       "$(INTDIR)\style_inst.sbr" \
+       "$(INTDIR)\StyleEngine.sbr" \
+       "$(INTDIR)\stylelib.sbr"
+
+"$(OUTDIR)\style.bsc" : "$(OUTDIR)" $(BSC32_SBRS)
+    $(BSC32) @<<
+  $(BSC32_FLAGS) $(BSC32_SBRS)
+<<
+
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386
+# ADD LINK32 lib\Debug\sp133d.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:0x20000000 /subsystem:windows /dll /incremental:no /debug /machine:I386 /out:"dbgbin\style.dll"
+# SUBTRACT LINK32 /map
+LINK32_FLAGS=lib\Debug\sp133d.lib kernel32.lib user32.lib gdi32.lib\
+ winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib\
+ uuid.lib odbc32.lib odbccp32.lib /nologo /base:0x20000000 /subsystem:windows\
+ /dll /incremental:no /pdb:"$(OUTDIR)/style.pdb" /debug /machine:I386\
+ /out:"dbgbin\style.dll" /implib:"$(OUTDIR)/style.lib" 
+LINK32_OBJS= \
+       "$(INTDIR)\Collector.obj" \
+       "$(INTDIR)\common_inst.obj" \
+       "$(INTDIR)\DssslApp.obj" \
+       "$(INTDIR)\DssslSpecEventHandler.obj" \
+       "$(INTDIR)\ELObj.obj" \
+       "$(INTDIR)\ELObjMessageArg.obj" \
+       "$(INTDIR)\Expression.obj" \
+       "$(INTDIR)\FlowObj.obj" \
+       "$(INTDIR)\FOTBuilder.obj" \
+       "$(INTDIR)\GroveManager.obj" \
+       "$(INTDIR)\InheritedC.obj" \
+       "$(INTDIR)\Insn.obj" \
+       "$(INTDIR)\Interpreter.obj" \
+       "$(INTDIR)\InterpreterMessages.obj" \
+       "$(INTDIR)\MacroFlowObj.obj" \
+       "$(INTDIR)\NumberCache.obj" \
+       "$(INTDIR)\Pattern.obj" \
+       "$(INTDIR)\primitive.obj" \
+       "$(INTDIR)\ProcessContext.obj" \
+       "$(INTDIR)\ProcessingMode.obj" \
+       "$(INTDIR)\SchemeParser.obj" \
+       "$(INTDIR)\Style.obj" \
+       "$(INTDIR)\style_inst.obj" \
+       "$(INTDIR)\StyleEngine.obj" \
+       "$(INTDIR)\stylelib.obj" \
+       ".\grove\Debug\grove.lib" \
+       ".\spgrove\Debug\spgrove.lib"
+
+".\dbgbin\style.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+    $(LINK32) @<<
+  $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "jade\Release"
+# PROP BASE Intermediate_Dir "jade\Release"
+# PROP BASE Target_Dir "jade"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "jade\Release"
+# PROP Intermediate_Dir "jade\Release"
+# PROP Target_Dir "jade"
+OUTDIR=.\jade\Release
+INTDIR=.\jade\Release
+
+ALL : "style - Win32 Release" "spgrove - Win32 Release" "grove - Win32 Release"\
+ ".\bin\jade.exe"
+
+CLEAN : 
+       -@erase "$(INTDIR)\HtmlFOTBuilder.obj"
+       -@erase "$(INTDIR)\jade.obj"
+       -@erase "$(INTDIR)\jade.res"
+       -@erase "$(INTDIR)\MifFOTBuilder.obj"
+       -@erase "$(INTDIR)\RtfFOTBuilder.obj"
+       -@erase "$(INTDIR)\RtfOle.obj"
+       -@erase "$(INTDIR)\SgmlFOTBuilder.obj"
+       -@erase "$(INTDIR)\TeXFOTBuilder.obj"
+       -@erase "$(INTDIR)\TransformFOTBuilder.obj"
+       -@erase ".\bin\jade.exe"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "include" /I "style" /I "grove" /I "spgrove" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D SP_NAMESPACE=James_Clark_SP /D DSSSL_NAMESPACE=James_Clark_DSSSL /D GROVE_NAMESPACE=James_Clark_GROVE /D "SP_MULTI_BYTE" /YX /c
+CPP_PROJ=/nologo /MD /W3 /GX /O2 /I "include" /I "style" /I "grove" /I\
+ "spgrove" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D SP_NAMESPACE=James_Clark_SP\
+ /D DSSSL_NAMESPACE=James_Clark_DSSSL /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/jade.pch" /YX /Fo"$(INTDIR)/" /c 
+CPP_OBJS=.\jade\Release/
+CPP_SBRS=.\.
+
+.c{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.c{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+RSC=rc.exe
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+RSC_PROJ=/l 0x809 /fo"$(INTDIR)/jade.res" /d "NDEBUG" 
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/jade.bsc" 
+BSC32_SBRS= \
+       
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 lib\Release\sp133.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"bin/jade.exe"
+# SUBTRACT LINK32 /profile
+LINK32_FLAGS=lib\Release\sp133.lib kernel32.lib user32.lib gdi32.lib\
+ winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib\
+ uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no\
+ /pdb:"$(OUTDIR)/jade.pdb" /machine:I386 /out:"bin/jade.exe" 
+LINK32_OBJS= \
+       "$(INTDIR)\HtmlFOTBuilder.obj" \
+       "$(INTDIR)\jade.obj" \
+       "$(INTDIR)\jade.res" \
+       "$(INTDIR)\MifFOTBuilder.obj" \
+       "$(INTDIR)\RtfFOTBuilder.obj" \
+       "$(INTDIR)\RtfOle.obj" \
+       "$(INTDIR)\SgmlFOTBuilder.obj" \
+       "$(INTDIR)\TeXFOTBuilder.obj" \
+       "$(INTDIR)\TransformFOTBuilder.obj" \
+       ".\grove\Release\grove.lib" \
+       ".\spgrove\Release\spgrove.lib" \
+       ".\style\Release\style.lib"
+
+".\bin\jade.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+    $(LINK32) @<<
+  $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "jade\Debug"
+# PROP BASE Intermediate_Dir "jade\Debug"
+# PROP BASE Target_Dir "jade"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "jade\Debug"
+# PROP Intermediate_Dir "jade\Debug"
+# PROP Target_Dir "jade"
+OUTDIR=.\jade\Debug
+INTDIR=.\jade\Debug
+
+ALL : "style - Win32 Debug" "spgrove - Win32 Debug" "grove - Win32 Debug"\
+ ".\dbgbin\jade.exe"
+
+CLEAN : 
+       -@erase "$(INTDIR)\HtmlFOTBuilder.obj"
+       -@erase "$(INTDIR)\jade.obj"
+       -@erase "$(INTDIR)\jade.res"
+       -@erase "$(INTDIR)\MifFOTBuilder.obj"
+       -@erase "$(INTDIR)\RtfFOTBuilder.obj"
+       -@erase "$(INTDIR)\RtfOle.obj"
+       -@erase "$(INTDIR)\SgmlFOTBuilder.obj"
+       -@erase "$(INTDIR)\TeXFOTBuilder.obj"
+       -@erase "$(INTDIR)\TransformFOTBuilder.obj"
+       -@erase "$(INTDIR)\vc40.pdb"
+       -@erase "$(OUTDIR)\jade.pdb"
+       -@erase ".\dbgbin\jade.exe"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /c
+# ADD CPP /nologo /MDd /W3 /GX /Zi /Od /I "include" /I "style" /I "grove" /I "spgrove" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D SP_NAMESPACE=James_Clark_SP /D DSSSL_NAMESPACE=James_Clark_DSSSL /D GROVE_NAMESPACE=James_Clark_GROVE /D "SP_MULTI_BYTE" /YX /c
+CPP_PROJ=/nologo /MDd /W3 /GX /Zi /Od /I "include" /I "style" /I "grove" /I\
+ "spgrove" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D SP_NAMESPACE=James_Clark_SP\
+ /D DSSSL_NAMESPACE=James_Clark_DSSSL /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/jade.pch" /YX /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c 
+CPP_OBJS=.\jade\Debug/
+CPP_SBRS=.\.
+
+.c{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.c{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+RSC=rc.exe
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+RSC_PROJ=/l 0x809 /fo"$(INTDIR)/jade.res" /d "_DEBUG" 
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/jade.bsc" 
+BSC32_SBRS= \
+       
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386
+# ADD LINK32 lib\Debug\sp133d.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"dbgbin\jade.exe"
+LINK32_FLAGS=lib\Debug\sp133d.lib kernel32.lib user32.lib gdi32.lib\
+ winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib\
+ uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no\
+ /pdb:"$(OUTDIR)/jade.pdb" /debug /machine:I386 /out:"dbgbin\jade.exe" 
+LINK32_OBJS= \
+       "$(INTDIR)\HtmlFOTBuilder.obj" \
+       "$(INTDIR)\jade.obj" \
+       "$(INTDIR)\jade.res" \
+       "$(INTDIR)\MifFOTBuilder.obj" \
+       "$(INTDIR)\RtfFOTBuilder.obj" \
+       "$(INTDIR)\RtfOle.obj" \
+       "$(INTDIR)\SgmlFOTBuilder.obj" \
+       "$(INTDIR)\TeXFOTBuilder.obj" \
+       "$(INTDIR)\TransformFOTBuilder.obj" \
+       ".\grove\Debug\grove.lib" \
+       ".\spgrove\Debug\spgrove.lib" \
+       ".\style\Debug\style.lib"
+
+".\dbgbin\jade.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+    $(LINK32) @<<
+  $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF  "$(CFG)" == "jadedist - Win32 Release"
+
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "jadedist\Release"
+# PROP BASE Intermediate_Dir "jadedist\Release"
+# PROP BASE Target_Dir "jadedist"
+# PROP BASE Cmd_Line "NMAKE /f jadedist.mak"
+# PROP BASE Rebuild_Opt "/a"
+# PROP BASE Target_File "jadedist\jadedist.exe"
+# PROP BASE Bsc_Name "jadedist\jadedist.bsc"
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "jadedist\Release"
+# PROP Intermediate_Dir "jadedist\Release"
+# PROP Target_Dir "jadedist"
+# PROP Cmd_Line "makedist"
+# PROP Rebuild_Opt ""
+# PROP Target_File "jadedist\jade.zip"
+# PROP Bsc_Name ""
+OUTDIR=.\jadedist\Release
+INTDIR=.\jadedist\Release
+
+ALL : "jade - Win32 Release" 
+
+CLEAN : 
+       -@erase 
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+!ELSEIF  "$(CFG)" == "groveoa - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "groveoa\Release"
+# PROP BASE Intermediate_Dir "groveoa\Release"
+# PROP BASE Target_Dir "groveoa"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "groveoa\Release"
+# PROP Intermediate_Dir "groveoa\Release"
+# PROP Target_Dir "groveoa"
+OUTDIR=.\groveoa\Release
+INTDIR=.\groveoa\Release
+# Begin Custom Macros
+OutDir=.\groveoa\Release
+# End Custom Macros
+
+ALL : "spgrove - Win32 Release" "grove - Win32 Release" ".\bin\groveoa.dll"\
+ "$(OUTDIR)\regsvr32.trg"
+
+CLEAN : 
+       -@erase "$(INTDIR)\CGroveBuilder.obj"
+       -@erase "$(INTDIR)\GroveNode.obj"
+       -@erase "$(INTDIR)\groveoa.obj"
+       -@erase "$(INTDIR)\groveoa.pch"
+       -@erase "$(INTDIR)\groveoa.res"
+       -@erase "$(INTDIR)\StdAfx.obj"
+       -@erase "$(OUTDIR)\groveoa.exp"
+       -@erase "$(OUTDIR)\groveoa.lib"
+       -@erase "$(OUTDIR)\regsvr32.trg"
+       -@erase ".\bin\groveoa.dll"
+       -@erase ".\groveoa\groveoa.h"
+       -@erase ".\groveoa\groveoa.tlb"
+       -@erase ".\groveoa\groveoa_i.c"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "include" /I "grove" /I "spgrove" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /D "_WINDLL" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE" /D GROVE_NAMESPACE=James_Clark_GROVE /YX /c
+CPP_PROJ=/nologo /MD /W3 /GX /O2 /I "include" /I "grove" /I "spgrove" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /D\
+ "_WINDLL" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE" /D\
+ GROVE_NAMESPACE=James_Clark_GROVE /Fp"$(INTDIR)/groveoa.pch" /YX\
+ /Fo"$(INTDIR)/" /c 
+CPP_OBJS=.\groveoa\Release/
+CPP_SBRS=.\.
+
+.c{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.c{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+MTL=mktyplib.exe
+# ADD BASE MTL /nologo /D "NDEBUG" /win32
+# ADD MTL /nologo /D "NDEBUG" /win32
+MTL_PROJ=/nologo /D "NDEBUG" /win32 
+RSC=rc.exe
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+RSC_PROJ=/l 0x809 /fo"$(INTDIR)/groveoa.res" /d "NDEBUG" 
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/groveoa.bsc" 
+BSC32_SBRS= \
+       
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
+# ADD LINK32 lib\Release\sp133.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 /out:"bin/groveoa.dll"
+LINK32_FLAGS=lib\Release\sp133.lib kernel32.lib user32.lib gdi32.lib\
+ winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib\
+ uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll\
+ /incremental:no /pdb:"$(OUTDIR)/groveoa.pdb" /machine:I386\
+ /def:".\groveoa\groveoa.def" /out:"bin/groveoa.dll"\
+ /implib:"$(OUTDIR)/groveoa.lib" 
+DEF_FILE= \
+       ".\groveoa\groveoa.def"
+LINK32_OBJS= \
+       "$(INTDIR)\CGroveBuilder.obj" \
+       "$(INTDIR)\GroveNode.obj" \
+       "$(INTDIR)\groveoa.obj" \
+       "$(INTDIR)\groveoa.res" \
+       "$(INTDIR)\StdAfx.obj" \
+       ".\grove\Release\grove.lib" \
+       ".\spgrove\Release\spgrove.lib"
+
+".\bin\groveoa.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+    $(LINK32) @<<
+  $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+# Begin Custom Build
+OutDir=.\groveoa\Release
+TargetPath=.\bin\groveoa.dll
+InputPath=.\bin\groveoa.dll
+SOURCE=$(InputPath)
+
+"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+   regsvr32 /s /c "$(TargetPath)"
+   echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg"
+
+# End Custom Build
+
+!ELSEIF  "$(CFG)" == "groveoa - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "groveoa\Debug"
+# PROP BASE Intermediate_Dir "groveoa\Debug"
+# PROP BASE Target_Dir "groveoa"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "groveoa\Debug"
+# PROP Intermediate_Dir "groveoa\Debug"
+# PROP Target_Dir "groveoa"
+OUTDIR=.\groveoa\Debug
+INTDIR=.\groveoa\Debug
+
+ALL : "spgrove - Win32 Debug" "grove - Win32 Debug" ".\dbgbin\groveoa.dll"
+
+CLEAN : 
+       -@erase "$(INTDIR)\CGroveBuilder.obj"
+       -@erase "$(INTDIR)\GroveNode.obj"
+       -@erase "$(INTDIR)\groveoa.obj"
+       -@erase "$(INTDIR)\groveoa.pch"
+       -@erase "$(INTDIR)\groveoa.res"
+       -@erase "$(INTDIR)\StdAfx.obj"
+       -@erase "$(INTDIR)\vc40.idb"
+       -@erase "$(INTDIR)\vc40.pdb"
+       -@erase "$(OUTDIR)\groveoa.exp"
+       -@erase "$(OUTDIR)\groveoa.lib"
+       -@erase "$(OUTDIR)\groveoa.pdb"
+       -@erase ".\dbgbin\groveoa.dll"
+       -@erase ".\dbgbin\groveoa.ilk"
+       -@erase ".\groveoa\groveoa.h"
+       -@erase ".\groveoa\groveoa.tlb"
+       -@erase ".\groveoa\groveoa_i.c"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "include" /I "grove" /I "spgrove" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /D "_WINDLL" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE" /D GROVE_NAMESPACE=James_Clark_GROVE /YX /c
+CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /I "include" /I "grove" /I "spgrove"\
+ /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /D\
+ "_WINDLL" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE" /D\
+ GROVE_NAMESPACE=James_Clark_GROVE /Fp"$(INTDIR)/groveoa.pch" /YX\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c 
+CPP_OBJS=.\groveoa\Debug/
+CPP_SBRS=.\.
+
+.c{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.c{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+MTL=mktyplib.exe
+# ADD BASE MTL /nologo /D "_DEBUG" /win32
+# ADD MTL /nologo /D "_DEBUG" /win32
+MTL_PROJ=/nologo /D "_DEBUG" /win32 
+RSC=rc.exe
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+RSC_PROJ=/l 0x809 /fo"$(INTDIR)/groveoa.res" /d "_DEBUG" 
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/groveoa.bsc" 
+BSC32_SBRS= \
+       
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386
+# ADD LINK32 lib\Debug\sp133d.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"dbgbin\groveoa.dll"
+# SUBTRACT LINK32 /incremental:no
+LINK32_FLAGS=lib\Debug\sp133d.lib kernel32.lib user32.lib gdi32.lib\
+ winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib\
+ uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll\
+ /incremental:yes /pdb:"$(OUTDIR)/groveoa.pdb" /debug /machine:I386\
+ /def:".\groveoa\groveoa.def" /out:"dbgbin\groveoa.dll"\
+ /implib:"$(OUTDIR)/groveoa.lib" 
+DEF_FILE= \
+       ".\groveoa\groveoa.def"
+LINK32_OBJS= \
+       "$(INTDIR)\CGroveBuilder.obj" \
+       "$(INTDIR)\GroveNode.obj" \
+       "$(INTDIR)\groveoa.obj" \
+       "$(INTDIR)\groveoa.res" \
+       "$(INTDIR)\StdAfx.obj" \
+       ".\grove\Debug\grove.lib" \
+       ".\spgrove\Debug\spgrove.lib"
+
+".\dbgbin\groveoa.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+    $(LINK32) @<<
+  $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ENDIF 
+
+################################################################################
+# Begin Target
+
+# Name "grove - Win32 Release"
+# Name "grove - Win32 Debug"
+
+!IF  "$(CFG)" == "grove - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "grove - Win32 Debug"
+
+!ENDIF 
+
+################################################################################
+# Begin Source File
+
+SOURCE=.\grove\Node.cxx
+DEP_CPP_NODE_=\
+       ".\grove\Node.h"\
+       ".\include\Boolean.h"\
+       ".\include\config.h"\
+       ".\include\macros.h"\
+       
+
+"$(INTDIR)\Node.obj" : $(SOURCE) $(DEP_CPP_NODE_) "$(INTDIR)"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\grove\LocNode.cxx
+DEP_CPP_LOCNO=\
+       ".\grove\LocNode.h"\
+       ".\grove\Node.h"\
+       ".\include\Boolean.h"\
+       ".\include\config.h"\
+       
+
+"$(INTDIR)\LocNode.obj" : $(SOURCE) $(DEP_CPP_LOCNO) "$(INTDIR)"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+# End Target
+################################################################################
+# Begin Target
+
+# Name "spgrove - Win32 Release"
+# Name "spgrove - Win32 Debug"
+
+!IF  "$(CFG)" == "spgrove - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "spgrove - Win32 Debug"
+
+!ENDIF 
+
+################################################################################
+# Begin Source File
+
+SOURCE=.\spgrove\GroveBuilder.cxx
+DEP_CPP_GROVE=\
+       ".\grove\LocNode.h"\
+       ".\grove\Node.h"\
+       ".\include\Allocator.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spgrove\grove_inst.cxx"\
+       ".\spgrove\GroveBuilder.h"\
+       ".\spgrove\SdNode.h"\
+       ".\spgrove\threads.h"\
+       
+
+"$(INTDIR)\GroveBuilder.obj" : $(SOURCE) $(DEP_CPP_GROVE) "$(INTDIR)"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\spgrove\GroveApp.cxx
+DEP_CPP_GROVEA=\
+       ".\grove\Node.h"\
+       ".\include\Allocator.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spgrove\GroveApp.h"\
+       ".\spgrove\GroveBuilder.h"\
+       ".\spgrove\threads.h"\
+       
+
+"$(INTDIR)\GroveApp.obj" : $(SOURCE) $(DEP_CPP_GROVEA) "$(INTDIR)"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Project Dependency
+
+# Project_Dep_Name "grove"
+
+!IF  "$(CFG)" == "spgrove - Win32 Release"
+
+"grove - Win32 Release" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\jade.mak" CFG="grove - Win32 Release" 
+
+!ELSEIF  "$(CFG)" == "spgrove - Win32 Debug"
+
+"grove - Win32 Debug" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\jade.mak" CFG="grove - Win32 Debug" 
+
+!ENDIF 
+
+# End Project Dependency
+################################################################################
+# Begin Source File
+
+SOURCE=.\spgrove\SdNode.cxx
+DEP_CPP_SDNOD=\
+       ".\grove\Node.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Location.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spgrove\GroveBuilder.h"\
+       ".\spgrove\SdNode.h"\
+       
+
+"$(INTDIR)\SdNode.obj" : $(SOURCE) $(DEP_CPP_SDNOD) "$(INTDIR)"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+# End Target
+################################################################################
+# Begin Target
+
+# Name "style - Win32 Release"
+# Name "style - Win32 Debug"
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+!ENDIF 
+
+################################################################################
+# Begin Project Dependency
+
+# Project_Dep_Name "grove"
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+"grove - Win32 Release" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\jade.mak" CFG="grove - Win32 Release" 
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+"grove - Win32 Debug" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\jade.mak" CFG="grove - Win32 Debug" 
+
+!ENDIF 
+
+# End Project Dependency
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\stylelib.cxx
+DEP_CPP_STYLE=\
+       ".\grove\Node.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spgrove\GroveApp.h"\
+       ".\spgrove\GroveBuilder.h"\
+       ".\style\Collector.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\DssslApp.h"\
+       ".\style\DssslSpecEventHandler.h"\
+       ".\style\ELObj.h"\
+       ".\style\ELObjMessageArg.h"\
+       ".\style\EvalContext.h"\
+       ".\style\Expression.h"\
+       ".\style\FOTBuilder.h"\
+       ".\style\GroveManager.h"\
+       ".\style\Insn.h"\
+       ".\style\Insn2.h"\
+       ".\style\Interpreter.h"\
+       ".\style\InterpreterMessages.h"\
+       ".\style\MacroFlowObj.h"\
+       ".\style\NumberCache.h"\
+       ".\style\Pattern.h"\
+       ".\style\ProcessContext.h"\
+       ".\style\ProcessingMode.h"\
+       ".\style\SchemeParser.h"\
+       ".\style\SosofoObj.h"\
+       ".\style\Style.h"\
+       ".\style\style_pch.h"\
+       ".\style\StyleEngine.h"\
+       ".\style\stylelib.h"\
+       ".\style\VM.h"\
+       
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# ADD CPP /Yc"stylelib.h"
+
+BuildCmds= \
+       $(CPP) /nologo /MD /W3 /GX /O2 /I "spgrove" /I "grove" /I "include" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/style.pch" /Yc"stylelib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE) \
+       
+
+"$(INTDIR)\stylelib.obj" : $(SOURCE) $(DEP_CPP_STYLE) "$(INTDIR)"
+   $(BuildCmds)
+
+"$(INTDIR)\style.pch" : $(SOURCE) $(DEP_CPP_STYLE) "$(INTDIR)"
+   $(BuildCmds)
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# ADD CPP /Yc"stylelib.h"
+
+BuildCmds= \
+       $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "spgrove" /I "grove" /I "include" /D\
+ "_DEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /FR"$(INTDIR)/" /Fp"$(INTDIR)/style.pch" /Yc"stylelib.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE) \
+       
+
+"$(INTDIR)\stylelib.obj" : $(SOURCE) $(DEP_CPP_STYLE) "$(INTDIR)"
+   $(BuildCmds)
+
+"$(INTDIR)\stylelib.sbr" : $(SOURCE) $(DEP_CPP_STYLE) "$(INTDIR)"
+   $(BuildCmds)
+
+"$(INTDIR)\style.pch" : $(SOURCE) $(DEP_CPP_STYLE) "$(INTDIR)"
+   $(BuildCmds)
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\StyleEngine.cxx
+DEP_CPP_STYLEE=\
+       ".\grove\Node.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spgrove\GroveApp.h"\
+       ".\spgrove\GroveBuilder.h"\
+       ".\style\Collector.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\DssslApp.h"\
+       ".\style\DssslSpecEventHandler.h"\
+       ".\style\ELObj.h"\
+       ".\style\ELObjMessageArg.h"\
+       ".\style\EvalContext.h"\
+       ".\style\Expression.h"\
+       ".\style\FOTBuilder.h"\
+       ".\style\GroveManager.h"\
+       ".\style\Insn.h"\
+       ".\style\Insn2.h"\
+       ".\style\Interpreter.h"\
+       ".\style\InterpreterMessages.h"\
+       ".\style\MacroFlowObj.h"\
+       ".\style\NumberCache.h"\
+       ".\style\Pattern.h"\
+       ".\style\ProcessContext.h"\
+       ".\style\ProcessingMode.h"\
+       ".\style\SchemeParser.h"\
+       ".\style\SosofoObj.h"\
+       ".\style\Style.h"\
+       ".\style\style_pch.h"\
+       ".\style\StyleEngine.h"\
+       ".\style\stylelib.h"\
+       ".\style\VM.h"\
+       
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# ADD CPP /Yu"stylelib.h"
+
+"$(INTDIR)\StyleEngine.obj" : $(SOURCE) $(DEP_CPP_STYLEE) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "spgrove" /I "grove" /I "include" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# ADD CPP /Yu"stylelib.h"
+
+BuildCmds= \
+       $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "spgrove" /I "grove" /I "include" /D\
+ "_DEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /FR"$(INTDIR)/" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE) \
+       
+
+"$(INTDIR)\StyleEngine.obj" : $(SOURCE) $(DEP_CPP_STYLEE) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+"$(INTDIR)\StyleEngine.sbr" : $(SOURCE) $(DEP_CPP_STYLEE) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\Style.cxx
+DEP_CPP_STYLE_=\
+       ".\grove\Node.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spgrove\GroveApp.h"\
+       ".\spgrove\GroveBuilder.h"\
+       ".\style\Collector.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\DssslApp.h"\
+       ".\style\DssslSpecEventHandler.h"\
+       ".\style\ELObj.h"\
+       ".\style\ELObjMessageArg.h"\
+       ".\style\EvalContext.h"\
+       ".\style\Expression.h"\
+       ".\style\FOTBuilder.h"\
+       ".\style\GroveManager.h"\
+       ".\style\Insn.h"\
+       ".\style\Insn2.h"\
+       ".\style\Interpreter.h"\
+       ".\style\InterpreterMessages.h"\
+       ".\style\MacroFlowObj.h"\
+       ".\style\NumberCache.h"\
+       ".\style\Pattern.h"\
+       ".\style\ProcessContext.h"\
+       ".\style\ProcessingMode.h"\
+       ".\style\SchemeParser.h"\
+       ".\style\SosofoObj.h"\
+       ".\style\Style.h"\
+       ".\style\style_pch.h"\
+       ".\style\StyleEngine.h"\
+       ".\style\stylelib.h"\
+       ".\style\VM.h"\
+       
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# ADD CPP /Yu"stylelib.h"
+
+"$(INTDIR)\Style.obj" : $(SOURCE) $(DEP_CPP_STYLE_) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "spgrove" /I "grove" /I "include" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# ADD CPP /Yu"stylelib.h"
+
+BuildCmds= \
+       $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "spgrove" /I "grove" /I "include" /D\
+ "_DEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /FR"$(INTDIR)/" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE) \
+       
+
+"$(INTDIR)\Style.obj" : $(SOURCE) $(DEP_CPP_STYLE_) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+"$(INTDIR)\Style.sbr" : $(SOURCE) $(DEP_CPP_STYLE_) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\ProcessingMode.cxx
+DEP_CPP_PROCE=\
+       ".\grove\LocNode.h"\
+       ".\grove\Node.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spgrove\GroveApp.h"\
+       ".\spgrove\GroveBuilder.h"\
+       ".\style\Collector.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\DssslApp.h"\
+       ".\style\DssslSpecEventHandler.h"\
+       ".\style\ELObj.h"\
+       ".\style\ELObjMessageArg.h"\
+       ".\style\EvalContext.h"\
+       ".\style\Expression.h"\
+       ".\style\FOTBuilder.h"\
+       ".\style\GroveManager.h"\
+       ".\style\Insn.h"\
+       ".\style\Insn2.h"\
+       ".\style\Interpreter.h"\
+       ".\style\InterpreterMessages.h"\
+       ".\style\MacroFlowObj.h"\
+       ".\style\NumberCache.h"\
+       ".\style\Pattern.h"\
+       ".\style\ProcessContext.h"\
+       ".\style\ProcessingMode.h"\
+       ".\style\SchemeParser.h"\
+       ".\style\SosofoObj.h"\
+       ".\style\Style.h"\
+       ".\style\style_pch.h"\
+       ".\style\StyleEngine.h"\
+       ".\style\stylelib.h"\
+       ".\style\VM.h"\
+       
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# ADD CPP /Yu"stylelib.h"
+
+"$(INTDIR)\ProcessingMode.obj" : $(SOURCE) $(DEP_CPP_PROCE) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "spgrove" /I "grove" /I "include" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# ADD CPP /Yu"stylelib.h"
+
+BuildCmds= \
+       $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "spgrove" /I "grove" /I "include" /D\
+ "_DEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /FR"$(INTDIR)/" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE) \
+       
+
+"$(INTDIR)\ProcessingMode.obj" : $(SOURCE) $(DEP_CPP_PROCE) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+"$(INTDIR)\ProcessingMode.sbr" : $(SOURCE) $(DEP_CPP_PROCE) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\ProcessContext.cxx
+DEP_CPP_PROCES=\
+       ".\grove\Node.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spgrove\GroveApp.h"\
+       ".\spgrove\GroveBuilder.h"\
+       ".\style\Collector.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\DssslApp.h"\
+       ".\style\DssslSpecEventHandler.h"\
+       ".\style\ELObj.h"\
+       ".\style\ELObjMessageArg.h"\
+       ".\style\EvalContext.h"\
+       ".\style\Expression.h"\
+       ".\style\FOTBuilder.h"\
+       ".\style\GroveManager.h"\
+       ".\style\Insn.h"\
+       ".\style\Insn2.h"\
+       ".\style\Interpreter.h"\
+       ".\style\InterpreterMessages.h"\
+       ".\style\MacroFlowObj.h"\
+       ".\style\NumberCache.h"\
+       ".\style\Pattern.h"\
+       ".\style\ProcessContext.h"\
+       ".\style\ProcessingMode.h"\
+       ".\style\SchemeParser.h"\
+       ".\style\SosofoObj.h"\
+       ".\style\Style.h"\
+       ".\style\style_pch.h"\
+       ".\style\StyleEngine.h"\
+       ".\style\stylelib.h"\
+       ".\style\VM.h"\
+       
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# ADD CPP /Yu"stylelib.h"
+
+"$(INTDIR)\ProcessContext.obj" : $(SOURCE) $(DEP_CPP_PROCES) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "spgrove" /I "grove" /I "include" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# ADD CPP /Yu"stylelib.h"
+
+BuildCmds= \
+       $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "spgrove" /I "grove" /I "include" /D\
+ "_DEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /FR"$(INTDIR)/" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE) \
+       
+
+"$(INTDIR)\ProcessContext.obj" : $(SOURCE) $(DEP_CPP_PROCES) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+"$(INTDIR)\ProcessContext.sbr" : $(SOURCE) $(DEP_CPP_PROCES) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\primitive.cxx
+DEP_CPP_PRIMI=\
+       ".\grove\LocNode.h"\
+       ".\grove\Node.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spgrove\GroveApp.h"\
+       ".\spgrove\GroveBuilder.h"\
+       ".\style\Collector.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\DssslApp.h"\
+       ".\style\DssslSpecEventHandler.h"\
+       ".\style\ELObj.h"\
+       ".\style\ELObjMessageArg.h"\
+       ".\style\EvalContext.h"\
+       ".\style\Expression.h"\
+       ".\style\FOTBuilder.h"\
+       ".\style\GroveManager.h"\
+       ".\style\Insn.h"\
+       ".\style\Insn2.h"\
+       ".\style\Interpreter.h"\
+       ".\style\InterpreterMessages.h"\
+       ".\style\MacroFlowObj.h"\
+       ".\style\NumberCache.h"\
+       ".\style\Pattern.h"\
+       ".\style\primitive.h"\
+       ".\style\primitive_inst.cxx"\
+       ".\style\ProcessContext.h"\
+       ".\style\ProcessingMode.h"\
+       ".\style\SchemeParser.h"\
+       ".\style\SosofoObj.h"\
+       ".\style\Style.h"\
+       ".\style\style_pch.h"\
+       ".\style\StyleEngine.h"\
+       ".\style\stylelib.h"\
+       ".\style\VM.h"\
+       
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# ADD CPP /Yu"stylelib.h"
+
+"$(INTDIR)\primitive.obj" : $(SOURCE) $(DEP_CPP_PRIMI) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "spgrove" /I "grove" /I "include" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# ADD CPP /Yu"stylelib.h"
+
+BuildCmds= \
+       $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "spgrove" /I "grove" /I "include" /D\
+ "_DEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /FR"$(INTDIR)/" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE) \
+       
+
+"$(INTDIR)\primitive.obj" : $(SOURCE) $(DEP_CPP_PRIMI) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+"$(INTDIR)\primitive.sbr" : $(SOURCE) $(DEP_CPP_PRIMI) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\NumberCache.cxx
+DEP_CPP_NUMBE=\
+       ".\grove\Node.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spgrove\GroveApp.h"\
+       ".\spgrove\GroveBuilder.h"\
+       ".\style\Collector.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\DssslApp.h"\
+       ".\style\DssslSpecEventHandler.h"\
+       ".\style\ELObj.h"\
+       ".\style\ELObjMessageArg.h"\
+       ".\style\EvalContext.h"\
+       ".\style\Expression.h"\
+       ".\style\FOTBuilder.h"\
+       ".\style\GroveManager.h"\
+       ".\style\Insn.h"\
+       ".\style\Insn2.h"\
+       ".\style\Interpreter.h"\
+       ".\style\InterpreterMessages.h"\
+       ".\style\MacroFlowObj.h"\
+       ".\style\NumberCache.h"\
+       ".\style\Pattern.h"\
+       ".\style\ProcessContext.h"\
+       ".\style\ProcessingMode.h"\
+       ".\style\SchemeParser.h"\
+       ".\style\SosofoObj.h"\
+       ".\style\Style.h"\
+       ".\style\style_pch.h"\
+       ".\style\StyleEngine.h"\
+       ".\style\stylelib.h"\
+       ".\style\VM.h"\
+       
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# ADD CPP /Yu"stylelib.h"
+
+"$(INTDIR)\NumberCache.obj" : $(SOURCE) $(DEP_CPP_NUMBE) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "spgrove" /I "grove" /I "include" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# ADD CPP /Yu"stylelib.h"
+
+BuildCmds= \
+       $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "spgrove" /I "grove" /I "include" /D\
+ "_DEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /FR"$(INTDIR)/" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE) \
+       
+
+"$(INTDIR)\NumberCache.obj" : $(SOURCE) $(DEP_CPP_NUMBE) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+"$(INTDIR)\NumberCache.sbr" : $(SOURCE) $(DEP_CPP_NUMBE) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\InterpreterMessages.cxx
+DEP_CPP_INTER=\
+       ".\include\Boolean.h"\
+       ".\include\config.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Location.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\TypeId.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\xnew.h"\
+       ".\style\InterpreterMessages.h"\
+       
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# SUBTRACT CPP /YX
+
+"$(INTDIR)\InterpreterMessages.obj" : $(SOURCE) $(DEP_CPP_INTER) "$(INTDIR)"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "spgrove" /I "grove" /I "include" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /Fo"$(INTDIR)/" /c $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# SUBTRACT CPP /YX
+
+BuildCmds= \
+       $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "spgrove" /I "grove" /I "include" /D\
+ "_DEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /FR"$(INTDIR)/" /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE) \
+       
+
+"$(INTDIR)\InterpreterMessages.obj" : $(SOURCE) $(DEP_CPP_INTER) "$(INTDIR)"
+   $(BuildCmds)
+
+"$(INTDIR)\InterpreterMessages.sbr" : $(SOURCE) $(DEP_CPP_INTER) "$(INTDIR)"
+   $(BuildCmds)
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\Interpreter.cxx
+DEP_CPP_INTERP=\
+       ".\grove\LocNode.h"\
+       ".\grove\Node.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spgrove\GroveApp.h"\
+       ".\spgrove\GroveBuilder.h"\
+       ".\style\charNames.h"\
+       ".\style\Collector.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\DssslApp.h"\
+       ".\style\DssslSpecEventHandler.h"\
+       ".\style\ELObj.h"\
+       ".\style\ELObjMessageArg.h"\
+       ".\style\EvalContext.h"\
+       ".\style\Expression.h"\
+       ".\style\FOTBuilder.h"\
+       ".\style\GroveManager.h"\
+       ".\style\Insn.h"\
+       ".\style\Insn2.h"\
+       ".\style\Interpreter.h"\
+       ".\style\InterpreterMessages.h"\
+       ".\style\MacroFlowObj.h"\
+       ".\style\NumberCache.h"\
+       ".\style\Pattern.h"\
+       ".\style\ProcessContext.h"\
+       ".\style\ProcessingMode.h"\
+       ".\style\SchemeParser.h"\
+       ".\style\sdata.h"\
+       ".\style\SosofoObj.h"\
+       ".\style\Style.h"\
+       ".\style\style_pch.h"\
+       ".\style\StyleEngine.h"\
+       ".\style\stylelib.h"\
+       ".\style\VM.h"\
+       
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# ADD CPP /Yu"stylelib.h"
+
+"$(INTDIR)\Interpreter.obj" : $(SOURCE) $(DEP_CPP_INTERP) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "spgrove" /I "grove" /I "include" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# ADD CPP /Yu"stylelib.h"
+
+BuildCmds= \
+       $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "spgrove" /I "grove" /I "include" /D\
+ "_DEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /FR"$(INTDIR)/" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE) \
+       
+
+"$(INTDIR)\Interpreter.obj" : $(SOURCE) $(DEP_CPP_INTERP) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+"$(INTDIR)\Interpreter.sbr" : $(SOURCE) $(DEP_CPP_INTERP) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\Insn.cxx
+DEP_CPP_INSN_=\
+       ".\grove\Node.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spgrove\GroveApp.h"\
+       ".\spgrove\GroveBuilder.h"\
+       ".\style\Collector.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\DssslApp.h"\
+       ".\style\DssslSpecEventHandler.h"\
+       ".\style\ELObj.h"\
+       ".\style\ELObjMessageArg.h"\
+       ".\style\EvalContext.h"\
+       ".\style\Expression.h"\
+       ".\style\FOTBuilder.h"\
+       ".\style\GroveManager.h"\
+       ".\style\Insn.h"\
+       ".\style\Insn2.h"\
+       ".\style\Interpreter.h"\
+       ".\style\InterpreterMessages.h"\
+       ".\style\MacroFlowObj.h"\
+       ".\style\NumberCache.h"\
+       ".\style\Pattern.h"\
+       ".\style\ProcessContext.h"\
+       ".\style\ProcessingMode.h"\
+       ".\style\SchemeParser.h"\
+       ".\style\SosofoObj.h"\
+       ".\style\Style.h"\
+       ".\style\style_pch.h"\
+       ".\style\StyleEngine.h"\
+       ".\style\stylelib.h"\
+       ".\style\VM.h"\
+       
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# ADD CPP /Yu"stylelib.h"
+
+"$(INTDIR)\Insn.obj" : $(SOURCE) $(DEP_CPP_INSN_) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "spgrove" /I "grove" /I "include" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# ADD CPP /Yu"stylelib.h"
+
+BuildCmds= \
+       $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "spgrove" /I "grove" /I "include" /D\
+ "_DEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /FR"$(INTDIR)/" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE) \
+       
+
+"$(INTDIR)\Insn.obj" : $(SOURCE) $(DEP_CPP_INSN_) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+"$(INTDIR)\Insn.sbr" : $(SOURCE) $(DEP_CPP_INSN_) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\FOTBuilder.cxx
+DEP_CPP_FOTBU=\
+       ".\grove\Node.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spgrove\GroveApp.h"\
+       ".\spgrove\GroveBuilder.h"\
+       ".\style\Collector.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\DssslApp.h"\
+       ".\style\DssslSpecEventHandler.h"\
+       ".\style\ELObj.h"\
+       ".\style\ELObjMessageArg.h"\
+       ".\style\EvalContext.h"\
+       ".\style\Expression.h"\
+       ".\style\FOTBuilder.h"\
+       ".\style\GroveManager.h"\
+       ".\style\Insn.h"\
+       ".\style\Insn2.h"\
+       ".\style\Interpreter.h"\
+       ".\style\InterpreterMessages.h"\
+       ".\style\MacroFlowObj.h"\
+       ".\style\NumberCache.h"\
+       ".\style\Pattern.h"\
+       ".\style\ProcessContext.h"\
+       ".\style\ProcessingMode.h"\
+       ".\style\SchemeParser.h"\
+       ".\style\SosofoObj.h"\
+       ".\style\Style.h"\
+       ".\style\style_pch.h"\
+       ".\style\StyleEngine.h"\
+       ".\style\stylelib.h"\
+       ".\style\VM.h"\
+       
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# ADD CPP /Yu"stylelib.h"
+
+"$(INTDIR)\FOTBuilder.obj" : $(SOURCE) $(DEP_CPP_FOTBU) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "spgrove" /I "grove" /I "include" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# ADD CPP /Yu"stylelib.h"
+
+BuildCmds= \
+       $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "spgrove" /I "grove" /I "include" /D\
+ "_DEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /FR"$(INTDIR)/" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE) \
+       
+
+"$(INTDIR)\FOTBuilder.obj" : $(SOURCE) $(DEP_CPP_FOTBU) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+"$(INTDIR)\FOTBuilder.sbr" : $(SOURCE) $(DEP_CPP_FOTBU) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\Expression.cxx
+DEP_CPP_EXPRE=\
+       ".\grove\Node.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spgrove\GroveApp.h"\
+       ".\spgrove\GroveBuilder.h"\
+       ".\style\Collector.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\DssslApp.h"\
+       ".\style\DssslSpecEventHandler.h"\
+       ".\style\ELObj.h"\
+       ".\style\ELObjMessageArg.h"\
+       ".\style\EvalContext.h"\
+       ".\style\Expression.h"\
+       ".\style\FOTBuilder.h"\
+       ".\style\GroveManager.h"\
+       ".\style\Insn.h"\
+       ".\style\Insn2.h"\
+       ".\style\Interpreter.h"\
+       ".\style\InterpreterMessages.h"\
+       ".\style\MacroFlowObj.h"\
+       ".\style\NumberCache.h"\
+       ".\style\Pattern.h"\
+       ".\style\ProcessContext.h"\
+       ".\style\ProcessingMode.h"\
+       ".\style\SchemeParser.h"\
+       ".\style\SosofoObj.h"\
+       ".\style\Style.h"\
+       ".\style\style_pch.h"\
+       ".\style\StyleEngine.h"\
+       ".\style\stylelib.h"\
+       ".\style\VM.h"\
+       
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# ADD CPP /Yu"stylelib.h"
+
+"$(INTDIR)\Expression.obj" : $(SOURCE) $(DEP_CPP_EXPRE) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "spgrove" /I "grove" /I "include" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# ADD CPP /Yu"stylelib.h"
+
+BuildCmds= \
+       $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "spgrove" /I "grove" /I "include" /D\
+ "_DEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /FR"$(INTDIR)/" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE) \
+       
+
+"$(INTDIR)\Expression.obj" : $(SOURCE) $(DEP_CPP_EXPRE) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+"$(INTDIR)\Expression.sbr" : $(SOURCE) $(DEP_CPP_EXPRE) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\ELObjMessageArg.cxx
+DEP_CPP_ELOBJ=\
+       ".\grove\Node.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spgrove\GroveApp.h"\
+       ".\spgrove\GroveBuilder.h"\
+       ".\style\Collector.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\DssslApp.h"\
+       ".\style\DssslSpecEventHandler.h"\
+       ".\style\ELObj.h"\
+       ".\style\ELObjMessageArg.h"\
+       ".\style\EvalContext.h"\
+       ".\style\Expression.h"\
+       ".\style\FOTBuilder.h"\
+       ".\style\GroveManager.h"\
+       ".\style\Insn.h"\
+       ".\style\Insn2.h"\
+       ".\style\Interpreter.h"\
+       ".\style\InterpreterMessages.h"\
+       ".\style\MacroFlowObj.h"\
+       ".\style\NumberCache.h"\
+       ".\style\Pattern.h"\
+       ".\style\ProcessContext.h"\
+       ".\style\ProcessingMode.h"\
+       ".\style\SchemeParser.h"\
+       ".\style\SosofoObj.h"\
+       ".\style\Style.h"\
+       ".\style\style_pch.h"\
+       ".\style\StyleEngine.h"\
+       ".\style\stylelib.h"\
+       ".\style\VM.h"\
+       
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# ADD CPP /Yu"stylelib.h"
+
+"$(INTDIR)\ELObjMessageArg.obj" : $(SOURCE) $(DEP_CPP_ELOBJ) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "spgrove" /I "grove" /I "include" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# ADD CPP /Yu"stylelib.h"
+
+BuildCmds= \
+       $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "spgrove" /I "grove" /I "include" /D\
+ "_DEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /FR"$(INTDIR)/" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE) \
+       
+
+"$(INTDIR)\ELObjMessageArg.obj" : $(SOURCE) $(DEP_CPP_ELOBJ) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+"$(INTDIR)\ELObjMessageArg.sbr" : $(SOURCE) $(DEP_CPP_ELOBJ) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\ELObj.cxx
+DEP_CPP_ELOBJ_=\
+       ".\grove\Node.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spgrove\GroveApp.h"\
+       ".\spgrove\GroveBuilder.h"\
+       ".\style\Collector.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\DssslApp.h"\
+       ".\style\DssslSpecEventHandler.h"\
+       ".\style\ELObj.h"\
+       ".\style\ELObjMessageArg.h"\
+       ".\style\EvalContext.h"\
+       ".\style\Expression.h"\
+       ".\style\FOTBuilder.h"\
+       ".\style\GroveManager.h"\
+       ".\style\Insn.h"\
+       ".\style\Insn2.h"\
+       ".\style\Interpreter.h"\
+       ".\style\InterpreterMessages.h"\
+       ".\style\MacroFlowObj.h"\
+       ".\style\NumberCache.h"\
+       ".\style\Pattern.h"\
+       ".\style\ProcessContext.h"\
+       ".\style\ProcessingMode.h"\
+       ".\style\SchemeParser.h"\
+       ".\style\SosofoObj.h"\
+       ".\style\Style.h"\
+       ".\style\style_pch.h"\
+       ".\style\StyleEngine.h"\
+       ".\style\stylelib.h"\
+       ".\style\VM.h"\
+       
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# ADD CPP /Yu"stylelib.h"
+
+"$(INTDIR)\ELObj.obj" : $(SOURCE) $(DEP_CPP_ELOBJ_) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "spgrove" /I "grove" /I "include" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# ADD CPP /Yu"stylelib.h"
+
+BuildCmds= \
+       $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "spgrove" /I "grove" /I "include" /D\
+ "_DEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /FR"$(INTDIR)/" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE) \
+       
+
+"$(INTDIR)\ELObj.obj" : $(SOURCE) $(DEP_CPP_ELOBJ_) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+"$(INTDIR)\ELObj.sbr" : $(SOURCE) $(DEP_CPP_ELOBJ_) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\DssslSpecEventHandler.cxx
+DEP_CPP_DSSSL=\
+       ".\grove\Node.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\InternalInputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spgrove\GroveApp.h"\
+       ".\spgrove\GroveBuilder.h"\
+       ".\style\Collector.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\DssslApp.h"\
+       ".\style\DssslSpecEventHandler.h"\
+       ".\style\ELObj.h"\
+       ".\style\ELObjMessageArg.h"\
+       ".\style\EvalContext.h"\
+       ".\style\Expression.h"\
+       ".\style\FOTBuilder.h"\
+       ".\style\GroveManager.h"\
+       ".\style\Insn.h"\
+       ".\style\Insn2.h"\
+       ".\style\Interpreter.h"\
+       ".\style\InterpreterMessages.h"\
+       ".\style\MacroFlowObj.h"\
+       ".\style\NumberCache.h"\
+       ".\style\Pattern.h"\
+       ".\style\ProcessContext.h"\
+       ".\style\ProcessingMode.h"\
+       ".\style\SchemeParser.h"\
+       ".\style\SosofoObj.h"\
+       ".\style\Style.h"\
+       ".\style\style_pch.h"\
+       ".\style\StyleEngine.h"\
+       ".\style\stylelib.h"\
+       ".\style\VM.h"\
+       
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# ADD CPP /Yu"stylelib.h"
+
+"$(INTDIR)\DssslSpecEventHandler.obj" : $(SOURCE) $(DEP_CPP_DSSSL) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "spgrove" /I "grove" /I "include" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# ADD CPP /Yu"stylelib.h"
+
+BuildCmds= \
+       $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "spgrove" /I "grove" /I "include" /D\
+ "_DEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /FR"$(INTDIR)/" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE) \
+       
+
+"$(INTDIR)\DssslSpecEventHandler.obj" : $(SOURCE) $(DEP_CPP_DSSSL) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+"$(INTDIR)\DssslSpecEventHandler.sbr" : $(SOURCE) $(DEP_CPP_DSSSL) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\Collector.cxx
+DEP_CPP_COLLE=\
+       ".\include\Boolean.h"\
+       ".\include\config.h"\
+       ".\include\macros.h"\
+       ".\style\Collector.h"\
+       
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# SUBTRACT CPP /YX
+
+"$(INTDIR)\Collector.obj" : $(SOURCE) $(DEP_CPP_COLLE) "$(INTDIR)"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "spgrove" /I "grove" /I "include" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /Fo"$(INTDIR)/" /c $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# SUBTRACT CPP /YX
+
+BuildCmds= \
+       $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "spgrove" /I "grove" /I "include" /D\
+ "_DEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /FR"$(INTDIR)/" /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE) \
+       
+
+"$(INTDIR)\Collector.obj" : $(SOURCE) $(DEP_CPP_COLLE) "$(INTDIR)"
+   $(BuildCmds)
+
+"$(INTDIR)\Collector.sbr" : $(SOURCE) $(DEP_CPP_COLLE) "$(INTDIR)"
+   $(BuildCmds)
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\FlowObj.cxx
+DEP_CPP_FLOWO=\
+       ".\grove\Node.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spgrove\GroveApp.h"\
+       ".\spgrove\GroveBuilder.h"\
+       ".\style\Collector.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\DssslApp.h"\
+       ".\style\DssslSpecEventHandler.h"\
+       ".\style\ELObj.h"\
+       ".\style\ELObjMessageArg.h"\
+       ".\style\EvalContext.h"\
+       ".\style\Expression.h"\
+       ".\style\FlowObj_inst.cxx"\
+       ".\style\FOTBuilder.h"\
+       ".\style\GroveManager.h"\
+       ".\style\Insn.h"\
+       ".\style\Insn2.h"\
+       ".\style\Interpreter.h"\
+       ".\style\InterpreterMessages.h"\
+       ".\style\MacroFlowObj.h"\
+       ".\style\NumberCache.h"\
+       ".\style\Pattern.h"\
+       ".\style\ProcessContext.h"\
+       ".\style\ProcessingMode.h"\
+       ".\style\SchemeParser.h"\
+       ".\style\SosofoObj.h"\
+       ".\style\Style.h"\
+       ".\style\style_pch.h"\
+       ".\style\StyleEngine.h"\
+       ".\style\stylelib.h"\
+       ".\style\VM.h"\
+       
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# ADD CPP /Yu"stylelib.h"
+
+"$(INTDIR)\FlowObj.obj" : $(SOURCE) $(DEP_CPP_FLOWO) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "spgrove" /I "grove" /I "include" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# ADD CPP /Yu"stylelib.h"
+
+BuildCmds= \
+       $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "spgrove" /I "grove" /I "include" /D\
+ "_DEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /FR"$(INTDIR)/" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE) \
+       
+
+"$(INTDIR)\FlowObj.obj" : $(SOURCE) $(DEP_CPP_FLOWO) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+"$(INTDIR)\FlowObj.sbr" : $(SOURCE) $(DEP_CPP_FLOWO) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\InheritedC.cxx
+DEP_CPP_INHER=\
+       ".\grove\Node.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spgrove\GroveApp.h"\
+       ".\spgrove\GroveBuilder.h"\
+       ".\style\Collector.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\DssslApp.h"\
+       ".\style\DssslSpecEventHandler.h"\
+       ".\style\ELObj.h"\
+       ".\style\ELObjMessageArg.h"\
+       ".\style\EvalContext.h"\
+       ".\style\Expression.h"\
+       ".\style\FOTBuilder.h"\
+       ".\style\GroveManager.h"\
+       ".\style\Insn.h"\
+       ".\style\Insn2.h"\
+       ".\style\Interpreter.h"\
+       ".\style\InterpreterMessages.h"\
+       ".\style\MacroFlowObj.h"\
+       ".\style\NumberCache.h"\
+       ".\style\Pattern.h"\
+       ".\style\ProcessContext.h"\
+       ".\style\ProcessingMode.h"\
+       ".\style\SchemeParser.h"\
+       ".\style\SosofoObj.h"\
+       ".\style\Style.h"\
+       ".\style\style_pch.h"\
+       ".\style\StyleEngine.h"\
+       ".\style\stylelib.h"\
+       ".\style\VM.h"\
+       
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# ADD CPP /Yu"stylelib.h"
+
+"$(INTDIR)\InheritedC.obj" : $(SOURCE) $(DEP_CPP_INHER) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "spgrove" /I "grove" /I "include" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# ADD CPP /Yu"stylelib.h"
+
+BuildCmds= \
+       $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "spgrove" /I "grove" /I "include" /D\
+ "_DEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /FR"$(INTDIR)/" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE) \
+       
+
+"$(INTDIR)\InheritedC.obj" : $(SOURCE) $(DEP_CPP_INHER) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+"$(INTDIR)\InheritedC.sbr" : $(SOURCE) $(DEP_CPP_INHER) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\style_inst.cxx
+DEP_CPP_STYLE_I=\
+       ".\grove\Node.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spgrove\GroveApp.h"\
+       ".\spgrove\GroveBuilder.h"\
+       ".\style\Collector.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\DssslApp.h"\
+       ".\style\DssslSpecEventHandler.h"\
+       ".\style\ELObj.h"\
+       ".\style\ELObjMessageArg.h"\
+       ".\style\EvalContext.h"\
+       ".\style\Expression.h"\
+       ".\style\FOTBuilder.h"\
+       ".\style\GroveManager.h"\
+       ".\style\Insn.h"\
+       ".\style\Insn2.h"\
+       ".\style\Interpreter.h"\
+       ".\style\InterpreterMessages.h"\
+       ".\style\MacroFlowObj.h"\
+       ".\style\NumberCache.h"\
+       ".\style\Pattern.h"\
+       ".\style\ProcessContext.h"\
+       ".\style\ProcessingMode.h"\
+       ".\style\SchemeParser.h"\
+       ".\style\SosofoObj.h"\
+       ".\style\Style.h"\
+       ".\style\style_pch.h"\
+       ".\style\StyleEngine.h"\
+       ".\style\stylelib.h"\
+       ".\style\VM.h"\
+       
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# ADD CPP /Yu"stylelib.h"
+
+"$(INTDIR)\style_inst.obj" : $(SOURCE) $(DEP_CPP_STYLE_I) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "spgrove" /I "grove" /I "include" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# ADD CPP /Yu"stylelib.h"
+
+BuildCmds= \
+       $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "spgrove" /I "grove" /I "include" /D\
+ "_DEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /FR"$(INTDIR)/" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE) \
+       
+
+"$(INTDIR)\style_inst.obj" : $(SOURCE) $(DEP_CPP_STYLE_I) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+"$(INTDIR)\style_inst.sbr" : $(SOURCE) $(DEP_CPP_STYLE_I) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\common_inst.cxx
+DEP_CPP_COMMO=\
+       ".\grove\Node.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spgrove\GroveApp.h"\
+       ".\spgrove\GroveBuilder.h"\
+       ".\style\Collector.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\DssslApp.h"\
+       ".\style\DssslSpecEventHandler.h"\
+       ".\style\ELObj.h"\
+       ".\style\ELObjMessageArg.h"\
+       ".\style\EvalContext.h"\
+       ".\style\Expression.h"\
+       ".\style\FOTBuilder.h"\
+       ".\style\GroveManager.h"\
+       ".\style\Insn.h"\
+       ".\style\Insn2.h"\
+       ".\style\Interpreter.h"\
+       ".\style\InterpreterMessages.h"\
+       ".\style\MacroFlowObj.h"\
+       ".\style\NumberCache.h"\
+       ".\style\Pattern.h"\
+       ".\style\ProcessContext.h"\
+       ".\style\ProcessingMode.h"\
+       ".\style\SchemeParser.h"\
+       ".\style\SosofoObj.h"\
+       ".\style\Style.h"\
+       ".\style\style_pch.h"\
+       ".\style\StyleEngine.h"\
+       ".\style\stylelib.h"\
+       ".\style\VM.h"\
+       
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# ADD CPP /Yu"stylelib.h"
+
+"$(INTDIR)\common_inst.obj" : $(SOURCE) $(DEP_CPP_COMMO) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "spgrove" /I "grove" /I "include" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# ADD CPP /Yu"stylelib.h"
+
+BuildCmds= \
+       $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "spgrove" /I "grove" /I "include" /D\
+ "_DEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /FR"$(INTDIR)/" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE) \
+       
+
+"$(INTDIR)\common_inst.obj" : $(SOURCE) $(DEP_CPP_COMMO) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+"$(INTDIR)\common_inst.sbr" : $(SOURCE) $(DEP_CPP_COMMO) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\InterpreterMessages.msg
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# PROP Exclude_From_Build 1
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# PROP Exclude_From_Build 1
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\style_inst.m4
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\FlowObj_inst.m4
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\common_inst.m4
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\GroveManager.cxx
+DEP_CPP_GROVEM=\
+       ".\grove\Node.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spgrove\GroveApp.h"\
+       ".\spgrove\GroveBuilder.h"\
+       ".\style\Collector.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\DssslApp.h"\
+       ".\style\DssslSpecEventHandler.h"\
+       ".\style\ELObj.h"\
+       ".\style\ELObjMessageArg.h"\
+       ".\style\EvalContext.h"\
+       ".\style\Expression.h"\
+       ".\style\FOTBuilder.h"\
+       ".\style\GroveManager.h"\
+       ".\style\Insn.h"\
+       ".\style\Insn2.h"\
+       ".\style\Interpreter.h"\
+       ".\style\InterpreterMessages.h"\
+       ".\style\MacroFlowObj.h"\
+       ".\style\NumberCache.h"\
+       ".\style\Pattern.h"\
+       ".\style\ProcessContext.h"\
+       ".\style\ProcessingMode.h"\
+       ".\style\SchemeParser.h"\
+       ".\style\SosofoObj.h"\
+       ".\style\Style.h"\
+       ".\style\style_pch.h"\
+       ".\style\StyleEngine.h"\
+       ".\style\stylelib.h"\
+       ".\style\VM.h"\
+       
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# ADD CPP /Yu"stylelib.h"
+
+"$(INTDIR)\GroveManager.obj" : $(SOURCE) $(DEP_CPP_GROVEM) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "spgrove" /I "grove" /I "include" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# ADD CPP /Yu"stylelib.h"
+
+BuildCmds= \
+       $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "spgrove" /I "grove" /I "include" /D\
+ "_DEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /FR"$(INTDIR)/" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE) \
+       
+
+"$(INTDIR)\GroveManager.obj" : $(SOURCE) $(DEP_CPP_GROVEM) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+"$(INTDIR)\GroveManager.sbr" : $(SOURCE) $(DEP_CPP_GROVEM) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\DssslApp.cxx
+DEP_CPP_DSSSLA=\
+       ".\grove\LocNode.h"\
+       ".\grove\Node.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\sptchar.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spgrove\GroveApp.h"\
+       ".\spgrove\GroveBuilder.h"\
+       ".\spgrove\SdNode.h"\
+       ".\style\Collector.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\DssslApp.h"\
+       ".\style\DssslAppMessages.h"\
+       ".\style\DssslSpecEventHandler.h"\
+       ".\style\ELObj.h"\
+       ".\style\ELObjMessageArg.h"\
+       ".\style\EvalContext.h"\
+       ".\style\Expression.h"\
+       ".\style\FOTBuilder.h"\
+       ".\style\GroveManager.h"\
+       ".\style\Insn.h"\
+       ".\style\Insn2.h"\
+       ".\style\Interpreter.h"\
+       ".\style\InterpreterMessages.h"\
+       ".\style\jade_version.h"\
+       ".\style\MacroFlowObj.h"\
+       ".\style\NumberCache.h"\
+       ".\style\Pattern.h"\
+       ".\style\ProcessContext.h"\
+       ".\style\ProcessingMode.h"\
+       ".\style\SchemeParser.h"\
+       ".\style\SosofoObj.h"\
+       ".\style\Style.h"\
+       ".\style\style_pch.h"\
+       ".\style\StyleEngine.h"\
+       ".\style\stylelib.h"\
+       ".\style\VM.h"\
+       
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# ADD CPP /Yu"stylelib.h"
+
+"$(INTDIR)\DssslApp.obj" : $(SOURCE) $(DEP_CPP_DSSSLA) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "spgrove" /I "grove" /I "include" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# ADD CPP /Yu"stylelib.h"
+
+BuildCmds= \
+       $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "spgrove" /I "grove" /I "include" /D\
+ "_DEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /FR"$(INTDIR)/" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE) \
+       
+
+"$(INTDIR)\DssslApp.obj" : $(SOURCE) $(DEP_CPP_DSSSLA) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+"$(INTDIR)\DssslApp.sbr" : $(SOURCE) $(DEP_CPP_DSSSLA) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Project Dependency
+
+# Project_Dep_Name "spgrove"
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+"spgrove - Win32 Release" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\jade.mak" CFG="spgrove - Win32 Release" 
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+"spgrove - Win32 Debug" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\jade.mak" CFG="spgrove - Win32 Debug" 
+
+!ENDIF 
+
+# End Project Dependency
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\jade_version.h
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\Pattern.cxx
+DEP_CPP_PATTE=\
+       ".\grove\Node.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spgrove\GroveApp.h"\
+       ".\spgrove\GroveBuilder.h"\
+       ".\style\Collector.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\DssslApp.h"\
+       ".\style\DssslSpecEventHandler.h"\
+       ".\style\ELObj.h"\
+       ".\style\ELObjMessageArg.h"\
+       ".\style\EvalContext.h"\
+       ".\style\Expression.h"\
+       ".\style\FOTBuilder.h"\
+       ".\style\GroveManager.h"\
+       ".\style\Insn.h"\
+       ".\style\Insn2.h"\
+       ".\style\Interpreter.h"\
+       ".\style\InterpreterMessages.h"\
+       ".\style\MacroFlowObj.h"\
+       ".\style\NumberCache.h"\
+       ".\style\Pattern.h"\
+       ".\style\ProcessContext.h"\
+       ".\style\ProcessingMode.h"\
+       ".\style\SchemeParser.h"\
+       ".\style\SosofoObj.h"\
+       ".\style\Style.h"\
+       ".\style\style_pch.h"\
+       ".\style\StyleEngine.h"\
+       ".\style\stylelib.h"\
+       ".\style\VM.h"\
+       
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# ADD CPP /Yu"stylelib.h"
+
+"$(INTDIR)\Pattern.obj" : $(SOURCE) $(DEP_CPP_PATTE) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "spgrove" /I "grove" /I "include" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# ADD CPP /Yu"stylelib.h"
+
+BuildCmds= \
+       $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "spgrove" /I "grove" /I "include" /D\
+ "_DEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /FR"$(INTDIR)/" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE) \
+       
+
+"$(INTDIR)\Pattern.obj" : $(SOURCE) $(DEP_CPP_PATTE) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+"$(INTDIR)\Pattern.sbr" : $(SOURCE) $(DEP_CPP_PATTE) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\MacroFlowObj.cxx
+DEP_CPP_MACRO=\
+       ".\grove\Node.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spgrove\GroveApp.h"\
+       ".\spgrove\GroveBuilder.h"\
+       ".\style\Collector.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\DssslApp.h"\
+       ".\style\DssslSpecEventHandler.h"\
+       ".\style\ELObj.h"\
+       ".\style\ELObjMessageArg.h"\
+       ".\style\EvalContext.h"\
+       ".\style\Expression.h"\
+       ".\style\FOTBuilder.h"\
+       ".\style\GroveManager.h"\
+       ".\style\Insn.h"\
+       ".\style\Insn2.h"\
+       ".\style\Interpreter.h"\
+       ".\style\InterpreterMessages.h"\
+       ".\style\MacroFlowObj.h"\
+       ".\style\NumberCache.h"\
+       ".\style\Pattern.h"\
+       ".\style\ProcessContext.h"\
+       ".\style\ProcessingMode.h"\
+       ".\style\SchemeParser.h"\
+       ".\style\SosofoObj.h"\
+       ".\style\Style.h"\
+       ".\style\style_pch.h"\
+       ".\style\StyleEngine.h"\
+       ".\style\stylelib.h"\
+       ".\style\VM.h"\
+       
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# ADD CPP /Yu"stylelib.h"
+
+"$(INTDIR)\MacroFlowObj.obj" : $(SOURCE) $(DEP_CPP_MACRO) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "spgrove" /I "grove" /I "include" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# ADD CPP /Yu"stylelib.h"
+
+BuildCmds= \
+       $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "spgrove" /I "grove" /I "include" /D\
+ "_DEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /FR"$(INTDIR)/" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE) \
+       
+
+"$(INTDIR)\MacroFlowObj.obj" : $(SOURCE) $(DEP_CPP_MACRO) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+"$(INTDIR)\MacroFlowObj.sbr" : $(SOURCE) $(DEP_CPP_MACRO) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\style\SchemeParser.cxx
+DEP_CPP_SCHEM=\
+       ".\grove\Node.h"\
+       ".\include\Allocator.h"\
+       ".\include\ArcEngine.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spgrove\GroveApp.h"\
+       ".\spgrove\GroveBuilder.h"\
+       ".\style\Collector.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\DssslApp.h"\
+       ".\style\DssslSpecEventHandler.h"\
+       ".\style\ELObj.h"\
+       ".\style\ELObjMessageArg.h"\
+       ".\style\EvalContext.h"\
+       ".\style\Expression.h"\
+       ".\style\FOTBuilder.h"\
+       ".\style\GroveManager.h"\
+       ".\style\Insn.h"\
+       ".\style\Insn2.h"\
+       ".\style\Interpreter.h"\
+       ".\style\InterpreterMessages.h"\
+       ".\style\MacroFlowObj.h"\
+       ".\style\NumberCache.h"\
+       ".\style\Pattern.h"\
+       ".\style\ProcessContext.h"\
+       ".\style\ProcessingMode.h"\
+       ".\style\SchemeParser.h"\
+       ".\style\SosofoObj.h"\
+       ".\style\Style.h"\
+       ".\style\style_pch.h"\
+       ".\style\StyleEngine.h"\
+       ".\style\stylelib.h"\
+       ".\style\VM.h"\
+       
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# ADD CPP /Yu"stylelib.h"
+
+"$(INTDIR)\SchemeParser.obj" : $(SOURCE) $(DEP_CPP_SCHEM) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "spgrove" /I "grove" /I "include" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h" /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# ADD CPP /Yu"stylelib.h"
+
+BuildCmds= \
+       $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "spgrove" /I "grove" /I "include" /D\
+ "_DEBUG" /D "WIN32" /D "_WINDOWS" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D\
+ SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /FR"$(INTDIR)/" /Fp"$(INTDIR)/style.pch" /Yu"stylelib.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE) \
+       
+
+"$(INTDIR)\SchemeParser.obj" : $(SOURCE) $(DEP_CPP_SCHEM) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+"$(INTDIR)\SchemeParser.sbr" : $(SOURCE) $(DEP_CPP_SCHEM) "$(INTDIR)"\
+ "$(INTDIR)\style.pch"
+   $(BuildCmds)
+
+!ENDIF 
+
+# End Source File
+# End Target
+################################################################################
+# Begin Target
+
+# Name "jade - Win32 Release"
+# Name "jade - Win32 Debug"
+
+!IF  "$(CFG)" == "jade - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Debug"
+
+!ENDIF 
+
+################################################################################
+# Begin Source File
+
+SOURCE=.\jade\SgmlFOTBuilder.cxx
+DEP_CPP_SGMLF=\
+       ".\grove\Node.h"\
+       ".\include\Boolean.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\config.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\ExternalId.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\macros.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\xnew.h"\
+       ".\jade\SgmlFOTBuilder.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\FOTBuilder.h"\
+       
+
+"$(INTDIR)\SgmlFOTBuilder.obj" : $(SOURCE) $(DEP_CPP_SGMLF) "$(INTDIR)"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\jade\RtfFOTBuilder.cxx
+DEP_CPP_RTFFO=\
+       ".\grove\Node.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CharsetRegistry.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\macros.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\jade\RtfFOTBuilder.h"\
+       ".\jade\RtfFOTBuilder_inst.cxx"\
+       ".\jade\RtfMessages.h"\
+       ".\jade\RtfOle.h"\
+       ".\jade\TmpOutputByteStream.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\FOTBuilder.h"\
+       
+
+"$(INTDIR)\RtfFOTBuilder.obj" : $(SOURCE) $(DEP_CPP_RTFFO) "$(INTDIR)"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\jade\jade.cxx
+DEP_CPP_JADE_=\
+       ".\grove\Node.h"\
+       ".\include\Allocator.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityApp.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\macros.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserApp.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\sptchar.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\jade\HtmlFOTBuilder.h"\
+       ".\jade\JadeMessages.h"\
+       ".\jade\MifFOTBuilder.h"\
+       ".\jade\RtfFOTBuilder.h"\
+       ".\jade\SgmlFOTBuilder.h"\
+       ".\jade\TeXFOTBuilder.h"\
+       ".\jade\TransformFOTBuilder.h"\
+       ".\spgrove\GroveApp.h"\
+       ".\spgrove\GroveBuilder.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\DssslApp.h"\
+       ".\style\FOTBuilder.h"\
+       ".\style\GroveManager.h"\
+       
+
+!IF  "$(CFG)" == "jade - Win32 Release"
+
+# ADD CPP /D "JADE_MIF"
+
+"$(INTDIR)\jade.obj" : $(SOURCE) $(DEP_CPP_JADE_) "$(INTDIR)"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "include" /I "style" /I "grove" /I\
+ "spgrove" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D SP_NAMESPACE=James_Clark_SP\
+ /D DSSSL_NAMESPACE=James_Clark_DSSSL /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /D "JADE_MIF" /Fp"$(INTDIR)/jade.pch" /YX /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Debug"
+
+# ADD CPP /D "JADE_MIF"
+
+"$(INTDIR)\jade.obj" : $(SOURCE) $(DEP_CPP_JADE_) "$(INTDIR)"
+   $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "include" /I "style" /I "grove" /I\
+ "spgrove" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D SP_NAMESPACE=James_Clark_SP\
+ /D DSSSL_NAMESPACE=James_Clark_DSSSL /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /D "JADE_MIF" /Fp"$(INTDIR)/jade.pch" /YX /Fo"$(INTDIR)/"\
+ /Fd"$(INTDIR)/" /c $(SOURCE)
+
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\jade\HtmlFOTBuilder.cxx
+DEP_CPP_HTMLF=\
+       ".\grove\Node.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\IListIter.h"\
+       ".\include\IListIterBase.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\macros.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\xnew.h"\
+       ".\jade\HtmlFOTBuilder.h"\
+       ".\jade\HtmlFOTBuilder_inst.cxx"\
+       ".\jade\HtmlMessages.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\FOTBuilder.h"\
+       
+
+"$(INTDIR)\HtmlFOTBuilder.obj" : $(SOURCE) $(DEP_CPP_HTMLF) "$(INTDIR)"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\jade\HtmlFOTBuilder_inst.m4
+
+!IF  "$(CFG)" == "jade - Win32 Release"
+
+# PROP Exclude_From_Build 1
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Debug"
+
+# PROP Exclude_From_Build 1
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\jade\jade.rc
+DEP_RSC_JADE_R=\
+       ".\jade\HtmlMessages.rc"\
+       ".\jade\JadeMessages.rc"\
+       ".\jade\RtfMessages.rc"\
+       ".\jade\TeXMessages.rc"\
+       ".\style\DssslAppMessages.rc"\
+       ".\style\InterpreterMessages.rc"\
+       
+
+!IF  "$(CFG)" == "jade - Win32 Release"
+
+# ADD BASE RSC /l 0x809 /i "jade"
+# ADD RSC /l 0x809 /i "jade" /i "style" /d "JADE_MIF"
+
+"$(INTDIR)\jade.res" : $(SOURCE) $(DEP_RSC_JADE_R) "$(INTDIR)"
+   $(RSC) /l 0x809 /fo"$(INTDIR)/jade.res" /i "jade" /i "style" /d "NDEBUG" /d\
+ "JADE_MIF" $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Debug"
+
+# ADD BASE RSC /l 0x809 /i "jade"
+# ADD RSC /l 0x809 /i "jade" /i "style" /d "JADE_MIF"
+
+"$(INTDIR)\jade.res" : $(SOURCE) $(DEP_RSC_JADE_R) "$(INTDIR)"
+   $(RSC) /l 0x809 /fo"$(INTDIR)/jade.res" /i "jade" /i "style" /d "_DEBUG" /d\
+ "JADE_MIF" $(SOURCE)
+
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\jade\JadeMessages.msg
+
+!IF  "$(CFG)" == "jade - Win32 Release"
+
+# PROP Exclude_From_Build 1
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Debug"
+
+# PROP Exclude_From_Build 1
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\jade\HtmlMessages.msg
+
+!IF  "$(CFG)" == "jade - Win32 Release"
+
+# PROP Exclude_From_Build 1
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Debug"
+
+# PROP Exclude_From_Build 1
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\jade\RtfFOTBuilder_inst.m4
+
+!IF  "$(CFG)" == "jade - Win32 Release"
+
+# PROP Exclude_From_Build 1
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Debug"
+
+# PROP Exclude_From_Build 1
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\jade\TeXFOTBuilder.cxx
+DEP_CPP_TEXFO=\
+       ".\grove\Node.h"\
+       ".\include\Boolean.h"\
+       ".\include\config.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\ExternalId.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\xnew.h"\
+       ".\jade\TeXFOTBuilder.h"\
+       ".\jade\TeXFOTBuilder_inst.cxx"\
+       ".\jade\TeXMessages.h"\
+       ".\jade\TmpOutputByteStream.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\FOTBuilder.h"\
+       
+
+"$(INTDIR)\TeXFOTBuilder.obj" : $(SOURCE) $(DEP_CPP_TEXFO) "$(INTDIR)"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Project Dependency
+
+# Project_Dep_Name "grove"
+
+!IF  "$(CFG)" == "jade - Win32 Release"
+
+"grove - Win32 Release" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\jade.mak" CFG="grove - Win32 Release" 
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Debug"
+
+"grove - Win32 Debug" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\jade.mak" CFG="grove - Win32 Debug" 
+
+!ENDIF 
+
+# End Project Dependency
+################################################################################
+# Begin Project Dependency
+
+# Project_Dep_Name "spgrove"
+
+!IF  "$(CFG)" == "jade - Win32 Release"
+
+"spgrove - Win32 Release" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\jade.mak" CFG="spgrove - Win32 Release" 
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Debug"
+
+"spgrove - Win32 Debug" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\jade.mak" CFG="spgrove - Win32 Debug" 
+
+!ENDIF 
+
+# End Project Dependency
+################################################################################
+# Begin Source File
+
+SOURCE=.\jade\RtfMessages.msg
+
+!IF  "$(CFG)" == "jade - Win32 Release"
+
+# PROP Exclude_From_Build 1
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Debug"
+
+# PROP Exclude_From_Build 1
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\jade\TransformFOTBuilder.cxx
+DEP_CPP_TRANS=\
+       ".\grove\Node.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ExternalId.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\xnew.h"\
+       ".\jade\TransformFOTBuilder.h"\
+       ".\jade\TransformFOTBuilder_inst.cxx"\
+       ".\style\dsssl_ns.h"\
+       ".\style\FOTBuilder.h"\
+       
+
+"$(INTDIR)\TransformFOTBuilder.obj" : $(SOURCE) $(DEP_CPP_TRANS) "$(INTDIR)"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\dsssl\fot.dtd
+
+!IF  "$(CFG)" == "jade - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Debug"
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\jade\TransformFOTBuilder_inst.m4
+
+!IF  "$(CFG)" == "jade - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Debug"
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\jade\RtfOle.cxx
+DEP_CPP_RTFOL=\
+       ".\include\Boolean.h"\
+       ".\include\config.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\jade\RtfOle.h"\
+       ".\style\dsssl_ns.h"\
+       
+
+"$(INTDIR)\RtfOle.obj" : $(SOURCE) $(DEP_CPP_RTFOL) "$(INTDIR)"
+   $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Project Dependency
+
+# Project_Dep_Name "style"
+
+!IF  "$(CFG)" == "jade - Win32 Release"
+
+"style - Win32 Release" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\jade.mak" CFG="style - Win32 Release" 
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Debug"
+
+"style - Win32 Debug" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\jade.mak" CFG="style - Win32 Debug" 
+
+!ENDIF 
+
+# End Project Dependency
+################################################################################
+# Begin Source File
+
+SOURCE=.\jade\MifFOTBuilder.cxx
+DEP_CPP_MIFFO=\
+       ".\grove\Node.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CmdLineApp.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrnoMessageArg.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\IList.h"\
+       ".\include\IListBase.h"\
+       ".\include\InputSource.h"\
+       ".\include\IQueue.cxx"\
+       ".\include\IQueue.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageReporter.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\jade\MifFOTBuilder.h"\
+       ".\jade\MifFOTBuilder_inst.cxx"\
+       ".\jade\MifMessages.h"\
+       ".\jade\TmpOutputByteStream.h"\
+       ".\style\dsssl_ns.h"\
+       ".\style\FOTBuilder.h"\
+       
+
+!IF  "$(CFG)" == "jade - Win32 Release"
+
+# ADD CPP /D "JADE_MIF"
+
+"$(INTDIR)\MifFOTBuilder.obj" : $(SOURCE) $(DEP_CPP_MIFFO) "$(INTDIR)"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "include" /I "style" /I "grove" /I\
+ "spgrove" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D SP_NAMESPACE=James_Clark_SP\
+ /D DSSSL_NAMESPACE=James_Clark_DSSSL /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /D "JADE_MIF" /Fp"$(INTDIR)/jade.pch" /YX /Fo"$(INTDIR)/" /c\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Debug"
+
+# ADD CPP /D "JADE_MIF"
+
+"$(INTDIR)\MifFOTBuilder.obj" : $(SOURCE) $(DEP_CPP_MIFFO) "$(INTDIR)"
+   $(CPP) /nologo /MDd /W3 /GX /Zi /Od /I "include" /I "style" /I "grove" /I\
+ "spgrove" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D SP_NAMESPACE=James_Clark_SP\
+ /D DSSSL_NAMESPACE=James_Clark_DSSSL /D GROVE_NAMESPACE=James_Clark_GROVE /D\
+ "SP_MULTI_BYTE" /D "JADE_MIF" /Fp"$(INTDIR)/jade.pch" /YX /Fo"$(INTDIR)/"\
+ /Fd"$(INTDIR)/" /c $(SOURCE)
+
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\jade\MifFOTBuilder_inst.m4
+
+!IF  "$(CFG)" == "jade - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Debug"
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\jade\TeXFOTBuilder_inst.m4
+
+!IF  "$(CFG)" == "jade - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Debug"
+
+!ENDIF 
+
+# End Source File
+# End Target
+################################################################################
+# Begin Target
+
+# Name "jadedist - Win32 Release"
+
+!IF  "$(CFG)" == "jadedist - Win32 Release"
+
+".\jadedist\jade.zip" : 
+   CD jadedist
+   makedist
+
+!ENDIF 
+
+################################################################################
+# Begin Project Dependency
+
+# Project_Dep_Name "jade"
+
+!IF  "$(CFG)" == "jadedist - Win32 Release"
+
+"jade - Win32 Release" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\jade.mak" CFG="jade - Win32 Release" 
+
+!ENDIF 
+
+# End Project Dependency
+################################################################################
+# Begin Source File
+
+SOURCE=".\jadedist\bin-files.txt"
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\jadedist\files.txt
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\jadedist\makedist.bat
+# End Source File
+# End Target
+################################################################################
+# Begin Target
+
+# Name "groveoa - Win32 Release"
+# Name "groveoa - Win32 Debug"
+
+!IF  "$(CFG)" == "groveoa - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "groveoa - Win32 Debug"
+
+!ENDIF 
+
+################################################################################
+# Begin Source File
+
+SOURCE=.\groveoa\GroveNode.cxx
+DEP_CPP_GROVEN=\
+       ".\grove\LocNode.h"\
+       ".\grove\Node.h"\
+       ".\groveoa\GroveNode.h"\
+       ".\groveoa\groveoa.h"\
+       ".\groveoa\StdAfx.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ExtendEntityManager.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Location.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\StorageManager.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\xnew.h"\
+       
+
+!IF  "$(CFG)" == "groveoa - Win32 Release"
+
+# ADD CPP /Yu"stdafx.h"
+
+"$(INTDIR)\GroveNode.obj" : $(SOURCE) $(DEP_CPP_GROVEN) "$(INTDIR)"\
+ "$(INTDIR)\groveoa.pch" ".\groveoa\groveoa.h"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "include" /I "grove" /I "spgrove" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /D\
+ "_WINDLL" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE" /D\
+ GROVE_NAMESPACE=James_Clark_GROVE /Fp"$(INTDIR)/groveoa.pch" /Yu"stdafx.h"\
+ /Fo"$(INTDIR)/" /c $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "groveoa - Win32 Debug"
+
+# ADD CPP /Yu"stdafx.h"
+
+"$(INTDIR)\GroveNode.obj" : $(SOURCE) $(DEP_CPP_GROVEN) "$(INTDIR)"\
+ ".\groveoa\groveoa.h" "$(INTDIR)\groveoa.pch"
+   $(CPP) /nologo /MDd /W3 /Gm /GX /Zi /Od /I "include" /I "grove" /I "spgrove"\
+ /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /D\
+ "_WINDLL" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE" /D\
+ GROVE_NAMESPACE=James_Clark_GROVE /Fp"$(INTDIR)/groveoa.pch" /Yu"stdafx.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE)
+
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\groveoa\groveoa.cxx
+DEP_CPP_GROVEO=\
+       ".\groveoa\CGroveBuilder.h"\
+       ".\groveoa\groveoa.h"\
+       ".\groveoa\groveoa_i.c"\
+       ".\groveoa\StdAfx.h"\
+       ".\include\Allocator.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\WinApp.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       
+
+!IF  "$(CFG)" == "groveoa - Win32 Release"
+
+# ADD CPP /Yu"stdafx.h"
+
+"$(INTDIR)\groveoa.obj" : $(SOURCE) $(DEP_CPP_GROVEO) "$(INTDIR)"\
+ "$(INTDIR)\groveoa.pch" ".\groveoa\groveoa.h" ".\groveoa\groveoa_i.c"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "include" /I "grove" /I "spgrove" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /D\
+ "_WINDLL" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE" /D\
+ GROVE_NAMESPACE=James_Clark_GROVE /Fp"$(INTDIR)/groveoa.pch" /Yu"stdafx.h"\
+ /Fo"$(INTDIR)/" /c $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "groveoa - Win32 Debug"
+
+# ADD CPP /Yu"stdafx.h"
+
+"$(INTDIR)\groveoa.obj" : $(SOURCE) $(DEP_CPP_GROVEO) "$(INTDIR)"\
+ ".\groveoa\groveoa.h" ".\groveoa\groveoa_i.c" "$(INTDIR)\groveoa.pch"
+   $(CPP) /nologo /MDd /W3 /Gm /GX /Zi /Od /I "include" /I "grove" /I "spgrove"\
+ /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /D\
+ "_WINDLL" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE" /D\
+ GROVE_NAMESPACE=James_Clark_GROVE /Fp"$(INTDIR)/groveoa.pch" /Yu"stdafx.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE)
+
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\groveoa\groveoa.rc
+DEP_RSC_GROVEOA=\
+       ".\groveoa\GroveBuilder.rgs"\
+       ".\groveoa\groveoa.tlb"\
+       
+
+!IF  "$(CFG)" == "groveoa - Win32 Release"
+
+
+"$(INTDIR)\groveoa.res" : $(SOURCE) $(DEP_RSC_GROVEOA) "$(INTDIR)"\
+ ".\groveoa\groveoa.tlb"
+   $(RSC) /l 0x809 /fo"$(INTDIR)/groveoa.res" /i "groveoa" /d "NDEBUG"\
+ $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "groveoa - Win32 Debug"
+
+
+"$(INTDIR)\groveoa.res" : $(SOURCE) $(DEP_RSC_GROVEOA) "$(INTDIR)"\
+ ".\groveoa\groveoa.tlb"
+   $(RSC) /l 0x809 /fo"$(INTDIR)/groveoa.res" /i "groveoa" /d "_DEBUG"\
+ $(SOURCE)
+
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\groveoa\StdAfx.cxx
+DEP_CPP_STDAF=\
+       ".\groveoa\StdAfx.h"\
+       
+
+!IF  "$(CFG)" == "groveoa - Win32 Release"
+
+# ADD CPP /Yc"stdafx.h"
+
+BuildCmds= \
+       $(CPP) /nologo /MD /W3 /GX /O2 /I "include" /I "grove" /I "spgrove" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /D\
+ "_WINDLL" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE" /D\
+ GROVE_NAMESPACE=James_Clark_GROVE /Fp"$(INTDIR)/groveoa.pch" /Yc"stdafx.h"\
+ /Fo"$(INTDIR)/" /c $(SOURCE) \
+       
+
+"$(INTDIR)\StdAfx.obj" : $(SOURCE) $(DEP_CPP_STDAF) "$(INTDIR)"
+   $(BuildCmds)
+
+"$(INTDIR)\groveoa.pch" : $(SOURCE) $(DEP_CPP_STDAF) "$(INTDIR)"
+   $(BuildCmds)
+
+!ELSEIF  "$(CFG)" == "groveoa - Win32 Debug"
+
+# ADD CPP /Yc"stdafx.h"
+
+BuildCmds= \
+       $(CPP) /nologo /MDd /W3 /Gm /GX /Zi /Od /I "include" /I "grove" /I "spgrove"\
+ /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /D\
+ "_WINDLL" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE" /D\
+ GROVE_NAMESPACE=James_Clark_GROVE /Fp"$(INTDIR)/groveoa.pch" /Yc"stdafx.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE) \
+       
+
+"$(INTDIR)\StdAfx.obj" : $(SOURCE) $(DEP_CPP_STDAF) "$(INTDIR)"
+   $(BuildCmds)
+
+"$(INTDIR)\groveoa.pch" : $(SOURCE) $(DEP_CPP_STDAF) "$(INTDIR)"
+   $(BuildCmds)
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\groveoa\CGroveBuilder.cxx
+DEP_CPP_CGROV=\
+       ".\grove\Node.h"\
+       ".\groveoa\CGroveBuilder.h"\
+       ".\groveoa\GroveNode.h"\
+       ".\groveoa\groveoa.h"\
+       ".\groveoa\StdAfx.h"\
+       ".\include\Allocator.h"\
+       ".\include\Attribute.h"\
+       ".\include\Attributed.h"\
+       ".\include\Boolean.h"\
+       ".\include\CharMap.cxx"\
+       ".\include\CharMap.h"\
+       ".\include\CharsetDecl.h"\
+       ".\include\CharsetInfo.h"\
+       ".\include\CodingSystem.h"\
+       ".\include\CodingSystemKit.h"\
+       ".\include\config.h"\
+       ".\include\constant.h"\
+       ".\include\ContentToken.h"\
+       ".\include\CopyOwner.cxx"\
+       ".\include\CopyOwner.h"\
+       ".\include\Dtd.h"\
+       ".\include\ElementType.h"\
+       ".\include\Entity.h"\
+       ".\include\EntityCatalog.h"\
+       ".\include\EntityDecl.h"\
+       ".\include\EntityManager.h"\
+       ".\include\ErrorCountEventHandler.h"\
+       ".\include\Event.h"\
+       ".\include\EventsWanted.h"\
+       ".\include\ExternalId.h"\
+       ".\include\Hash.h"\
+       ".\include\HashTable.cxx"\
+       ".\include\HashTable.h"\
+       ".\include\HashTableItemBase.cxx"\
+       ".\include\HashTableItemBase.h"\
+       ".\include\ISet.cxx"\
+       ".\include\ISet.h"\
+       ".\include\Link.h"\
+       ".\include\Location.h"\
+       ".\include\Lpd.h"\
+       ".\include\Markup.h"\
+       ".\include\Message.h"\
+       ".\include\MessageArg.h"\
+       ".\include\MessageBuilder.h"\
+       ".\include\MessageFormatter.h"\
+       ".\include\MessageTable.h"\
+       ".\include\Mode.h"\
+       ".\include\Named.h"\
+       ".\include\NamedResource.h"\
+       ".\include\NamedResourceTable.h"\
+       ".\include\NamedTable.h"\
+       ".\include\NCVector.h"\
+       ".\include\Notation.h"\
+       ".\include\OutputByteStream.h"\
+       ".\include\OutputCharStream.h"\
+       ".\include\Owner.cxx"\
+       ".\include\Owner.h"\
+       ".\include\OwnerTable.cxx"\
+       ".\include\OwnerTable.h"\
+       ".\include\ParserOptions.h"\
+       ".\include\PointerTable.cxx"\
+       ".\include\PointerTable.h"\
+       ".\include\Ptr.cxx"\
+       ".\include\Ptr.h"\
+       ".\include\RangeMap.cxx"\
+       ".\include\RangeMap.h"\
+       ".\include\Resource.h"\
+       ".\include\rtti.h"\
+       ".\include\Sd.h"\
+       ".\include\SdText.h"\
+       ".\include\SgmlParser.h"\
+       ".\include\ShortReferenceMap.h"\
+       ".\include\sptchar.h"\
+       ".\include\StringC.h"\
+       ".\include\StringOf.cxx"\
+       ".\include\StringOf.h"\
+       ".\include\StringResource.h"\
+       ".\include\SubstTable.cxx"\
+       ".\include\SubstTable.h"\
+       ".\include\Syntax.h"\
+       ".\include\Text.h"\
+       ".\include\TypeId.h"\
+       ".\include\UnivCharsetDesc.h"\
+       ".\include\Vector.cxx"\
+       ".\include\Vector.h"\
+       ".\include\WinApp.h"\
+       ".\include\XcharMap.cxx"\
+       ".\include\XcharMap.h"\
+       ".\include\xnew.h"\
+       ".\spgrove\GroveBuilder.h"\
+       
+
+!IF  "$(CFG)" == "groveoa - Win32 Release"
+
+# ADD CPP /Yu"stdafx.h"
+
+"$(INTDIR)\CGroveBuilder.obj" : $(SOURCE) $(DEP_CPP_CGROV) "$(INTDIR)"\
+ "$(INTDIR)\groveoa.pch" ".\groveoa\groveoa.h"
+   $(CPP) /nologo /MD /W3 /GX /O2 /I "include" /I "grove" /I "spgrove" /D\
+ "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /D\
+ "_WINDLL" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE" /D\
+ GROVE_NAMESPACE=James_Clark_GROVE /Fp"$(INTDIR)/groveoa.pch" /Yu"stdafx.h"\
+ /Fo"$(INTDIR)/" /c $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "groveoa - Win32 Debug"
+
+# ADD CPP /Yu"stdafx.h"
+
+"$(INTDIR)\CGroveBuilder.obj" : $(SOURCE) $(DEP_CPP_CGROV) "$(INTDIR)"\
+ ".\groveoa\groveoa.h" "$(INTDIR)\groveoa.pch"
+   $(CPP) /nologo /MDd /W3 /Gm /GX /Zi /Od /I "include" /I "grove" /I "spgrove"\
+ /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /D\
+ "_WINDLL" /D SP_NAMESPACE=James_Clark_SP /D "SP_MULTI_BYTE" /D\
+ GROVE_NAMESPACE=James_Clark_GROVE /Fp"$(INTDIR)/groveoa.pch" /Yu"stdafx.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE)
+
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\groveoa\groveoa.def
+
+!IF  "$(CFG)" == "groveoa - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "groveoa - Win32 Debug"
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\groveoa\groveoa.idl
+
+!IF  "$(CFG)" == "groveoa - Win32 Release"
+
+# Begin Custom Build
+InputDir=".\groveoa"
+InputPath=.\groveoa\groveoa.idl
+
+BuildCmds= \
+       midl /Oicf /h $(InputDir)\groveoa.h /iid $(InputDir)\groveoa_i.c /proxy\
+                                    $(InputDir)\groveoa_p.c /tlb $(InputDir)\groveoa.tlb $(InputPath) \
+       
+
+"$(InputDir)\groveoa.tlb" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+   $(BuildCmds)
+
+"$(InputDir)\groveoa.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+   $(BuildCmds)
+
+"$(InputDir)\groveoa_i.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+   $(BuildCmds)
+# End Custom Build
+
+!ELSEIF  "$(CFG)" == "groveoa - Win32 Debug"
+
+# Begin Custom Build
+InputDir=".\groveoa"
+InputPath=.\groveoa\groveoa.idl
+
+BuildCmds= \
+       midl /Oicf /h $(InputDir)\groveoa.h /iid $(InputDir)\groveoa_i.c /proxy\
+                                    $(InputDir)\groveoa_p.c /tlb $(InputDir)\groveoa.tlb $(InputPath) \
+       
+
+"$(InputDir)\groveoa.tlb" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+   $(BuildCmds)
+
+"$(InputDir)\groveoa.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+   $(BuildCmds)
+
+"$(InputDir)\groveoa_i.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+   $(BuildCmds)
+# End Custom Build
+
+!ENDIF 
+
+# End Source File
+################################################################################
+# Begin Project Dependency
+
+# Project_Dep_Name "grove"
+
+!IF  "$(CFG)" == "groveoa - Win32 Release"
+
+"grove - Win32 Release" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\jade.mak" CFG="grove - Win32 Release" 
+
+!ELSEIF  "$(CFG)" == "groveoa - Win32 Debug"
+
+"grove - Win32 Debug" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\jade.mak" CFG="grove - Win32 Debug" 
+
+!ENDIF 
+
+# End Project Dependency
+################################################################################
+# Begin Project Dependency
+
+# Project_Dep_Name "spgrove"
+
+!IF  "$(CFG)" == "groveoa - Win32 Release"
+
+"spgrove - Win32 Release" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\jade.mak" CFG="spgrove - Win32 Release" 
+
+!ELSEIF  "$(CFG)" == "groveoa - Win32 Debug"
+
+"spgrove - Win32 Debug" : 
+   $(MAKE) /$(MAKEFLAGS) /F ".\jade.mak" CFG="spgrove - Win32 Debug" 
+
+!ENDIF 
+
+# End Project Dependency
+# End Target
+# End Project
+################################################################################
diff --git a/jade/HtmlFOTBuilder.cxx b/jade/HtmlFOTBuilder.cxx
new file mode 100644 (file)
index 0000000..2444dfc
--- /dev/null
@@ -0,0 +1,1200 @@
+// Copyright (c) 1996, 1997 James Clark
+// See the file copying.txt for copying permission.
+
+#include "config.h"
+
+#ifdef JADE_HTML
+
+#include "HtmlFOTBuilder.h"
+#include "FOTBuilder.h"
+#include "Link.h"
+#include "IList.h"
+#include "IListIter.h"
+#include "OutputCharStream.h"
+#include "Ptr.h"
+#include "Resource.h"
+#include "macros.h"
+#include "HtmlMessages.h"
+#include "MessageArg.h"
+#include "ErrnoMessageArg.h"
+#include "StringResource.h"
+#include "OwnerTable.h"
+#include "Hash.h"
+#include "OutputByteStream.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class DiscardOutputCharStream : public OutputCharStream {
+public:
+  DiscardOutputCharStream() { }
+  void flush() { }
+  void flushBuf(Char) { }
+};
+
+const char RE = '\r';
+
+class HtmlFOTBuilder : public SerialFOTBuilder {
+public:
+  class OutputState;
+  struct CharProps {
+    CharProps();
+    static unsigned long hash(const CharProps &) { return 17; }
+    bool operator==(const CharProps &cp) const {
+      return (fontWeight == cp.fontWeight
+             && fontStyle == cp.fontStyle
+             && fontSize == cp.fontSize
+             && fontFamily == cp.fontFamily
+             && color == cp.color);
+    }
+    bool operator!=(const CharProps &cp) const { return !(*this == cp); }
+    char fontWeight;
+    enum { styleNormal, styleItalic, styleOblique };
+    char fontStyle;
+    unsigned color;
+    Length fontSize;
+    StringC fontFamily;
+  };
+  struct InheritParaProps {
+    InheritParaProps();
+    enum {
+      alignLeft,
+      alignCenter,
+      alignRight,
+      alignJustify
+    };
+    Length leftMargin;
+    Length rightMargin;
+    Length lineHeight;
+    Length textIndent;
+    char align;
+  };
+  struct ParaProps : public InheritParaProps {
+    ParaProps(const InheritParaProps &props)
+      : InheritParaProps(props), topMargin(0) { }
+    static unsigned long hash(const ParaProps &) { return 17; }
+    bool operator==(const ParaProps &pp) const {
+      return (leftMargin == pp.leftMargin
+             && rightMargin == pp.rightMargin
+             && lineHeight == pp.lineHeight
+             && textIndent == pp.textIndent
+             && topMargin == pp.topMargin
+             && align == pp.align);
+    }
+    bool operator!=(const ParaProps &pp) const { return !(*this == pp); }
+    Length topMargin;
+  };
+
+  struct ClassPrefix {
+    ClassPrefix(const StringC &s) : prefix(s), nCharClasses(0), nParaClasses(0) { }
+    StringC prefix;
+    unsigned nCharClasses;
+    unsigned nParaClasses;
+    static const StringC &key(const ClassPrefix &cp) { return cp.prefix; }
+  };
+
+  struct StyleClass : public Link {
+    StyleClass(const StringC &, ClassPrefix *);
+    void outputName(OutputCharStream &) const;
+    StringC gi;
+    const ClassPrefix *prefix;
+    unsigned prefixIndex;
+   };
+
+  struct CharStyle;
+
+  struct CharStyleClass : public StyleClass {
+     CharStyleClass(const StringC &, ClassPrefix *, const CharStyle *);
+     const CharStyle *style;
+  };
+
+  struct CharStyle : public CharProps {
+    CharStyle(const CharProps &cp) : CharProps(cp) { }
+    void output(OutputCharStream &) const;
+    static const CharProps &key(const CharStyle &style) { return style; }
+    IList<CharStyleClass> classes;
+  };
+
+  struct ParaStyle;
+
+  struct ParaStyleClass : public StyleClass {
+     ParaStyleClass(const StringC &, ClassPrefix *, const ParaStyle *);
+     const ParaStyle *style;
+  };
+
+  struct ParaStyle : public ParaProps {
+    ParaStyle(const ParaProps &pp) : ParaProps(pp) { }
+    void output(OutputCharStream &) const;
+    static const ParaProps &key(const ParaStyle &style) { return style; }
+    IList<ParaStyleClass> classes;
+  };
+
+  struct FlowObjectInfo : public CharProps, public InheritParaProps {
+    FlowObjectInfo();
+    unsigned docIndex;
+    ConstPtr<StringResource<Char> > scrollTitle;
+    Length parentLeftMargin;
+    Length parentRightMargin;
+  };
+
+  // An address that has been referenced.
+  class AddressRef {
+  public:
+    virtual void outputRef(bool end, OutputCharStream &, OutputState &) const = 0;
+    virtual ~AddressRef();
+  };
+
+  class OutputState {
+  public:
+    OutputState(const String<CmdLineApp::AppChar> *outputFilename,
+               const StringC &styleSheetFilename,
+                CmdLineApp *app)
+     : outputFilename_(outputFilename),
+       styleSheetFilename_(styleSheetFilename),
+       app_(app),
+       curAref_(0),
+       specAref_(0),
+       curCharStyleClass_(0),
+       outputDocIndex_(unsigned(-1)) { }
+    unsigned setOutputDocIndex(unsigned i) {
+      unsigned tem = outputDocIndex_;
+      outputDocIndex_ = i;
+      return tem;
+    }
+    const AddressRef *setAddress(const AddressRef *aref) {
+      const AddressRef *tem = specAref_;
+      specAref_ = aref;
+      return tem;
+    }
+    void syncChar(const CharStyleClass *, OutputCharStream &);
+    unsigned outputDocIndex() const { return outputDocIndex_; }
+    String<CmdLineApp::AppChar> outputFilename(unsigned i) const;
+    const String<CmdLineApp::AppChar> &outputFilename() const {
+      return *outputFilename_;
+    }
+    CmdLineApp &app() { return *app_; }
+    const StringC &styleSheetFilename() const { return styleSheetFilename_; }
+    const OutputCodingSystem *codingSystem() const { return app_->outputCodingSystem(); }
+    Messenger &messenger() { return *app_; }
+  private:
+    const String<CmdLineApp::AppChar> *outputFilename_;
+
+    CmdLineApp *app_;
+    unsigned outputDocIndex_;
+    const AddressRef *curAref_;
+    const AddressRef *specAref_;
+    const CharStyleClass *curCharStyleClass_;
+    StringC styleSheetFilename_;
+  };
+  class Item : public Link {
+  public:
+    Item() { }
+    virtual ~Item();
+    virtual void output(OutputCharStream &, OutputState &) { }
+  private:
+    void operator=(const Item &);
+    Item(const Item &);
+  };
+  // Corresponds to <A NAME="..."></A>
+  class Addressable : public Item, public AddressRef {
+  public:
+    Addressable(size_t g, size_t e)
+      : groveIndex_(g), elementIndex_(e), referenced_(0), docIndex_(unsigned(-1)) { }
+    void outputRef(bool end, OutputCharStream &, OutputState &) const;
+    void output(OutputCharStream &, OutputState &);
+    bool defined() const { return docIndex_ != unsigned(-1); }
+    bool referenced() const { return referenced_; }
+    void setDefined(unsigned docIndex, bool wholeDocument = 0) {
+      docIndex_ = docIndex;
+      if (wholeDocument)
+       elementIndex_ = (unsigned)-1;
+    }
+    void setReferenced() { referenced_ = 1; }
+  private:
+    size_t groveIndex_;
+    // -1 if the whole document
+    size_t elementIndex_;
+    // unsigned(-1) if not defined
+    unsigned docIndex_;
+    bool referenced_;
+  };
+  class Markup : public Item {
+  public:
+    Markup(const StringC &str) : str_(str) { }
+    void output(OutputCharStream &, OutputState &);
+  private:
+    StringC str_;
+  };
+  class Pcdata : public Item {
+  public:
+    Pcdata(const CharStyleClass *styleClass) : styleClass_(styleClass) { }
+    void output(OutputCharStream &, OutputState &);
+  private:
+    const CharStyleClass *styleClass_;
+    virtual const Char *data(size_t &) const = 0;
+  };
+  class ImmediatePcdata : public Pcdata {
+  public:
+    ImmediatePcdata(const Char *s, size_t n, const CharStyleClass *styleClass)
+      : Pcdata(styleClass), str_(s, n) { }
+  private:
+    const Char *data(size_t &n) const { n = str_.size(); return str_.data(); }
+    StringC str_;
+  };
+  class NodePcdata : public Pcdata {
+  public:
+    NodePcdata(const NodePtr &node, const Char *s, size_t n, const CharStyleClass *styleClass)
+      : Pcdata(styleClass), node_(node), s_(s), n_(n) { }
+  private:
+    const Char *data(size_t &n) const { n = n_; return s_; }
+    NodePtr node_;
+    const Char *s_;
+    size_t n_;
+  };
+  class Container : public Item {
+  public:
+    Container() { }
+    IList<Item> *contentPtr() { return &content_; }
+    void output(OutputCharStream &, OutputState &);
+  protected:
+    void reverse();
+    // In reverse order while being built.
+    IList<Item> content_;
+  private:
+    Container(const Container &);
+    void operator=(const Container &);
+  };
+  class Ref : public Container {
+  public:
+    Ref(AddressRef *aref) : aref_(aref) { }
+    void output(OutputCharStream &, OutputState &);
+  private:
+    AddressRef *aref_;
+  };
+  class Block : public Container {
+  public:
+    Block(const ParaStyleClass *styleClass) : styleClass_(styleClass) { }
+    void output(OutputCharStream &, OutputState &);
+  private:
+    const ParaStyleClass *styleClass_;
+  };
+  class Document : public Container {
+  public:
+    Document(unsigned index, const ConstPtr<StringResource<Char> > &title)
+      : index_(index), title_(title) { }
+    ~Document();
+    void output(OutputCharStream &, OutputState &);
+  private:
+    ConstPtr<StringResource<Char> > title_;
+    unsigned index_;
+  };
+  HtmlFOTBuilder(const String<CmdLineApp::AppChar> &, CmdLineApp *);
+  ~HtmlFOTBuilder();
+  void setFontWeight(Symbol);
+  void setFontPosture(Symbol);
+  void setFontFamilyName(const StringC &);
+  void setFontSize(Length);
+  void setColor(const DeviceRGBColor &);
+  void setQuadding(Symbol);
+  void setLineSpacing(const LengthSpec &);
+  void setFirstLineStartIndent(const LengthSpec &);
+  void setStartIndent(const LengthSpec &);
+  void setEndIndent(const LengthSpec &);
+  void setScrollTitle(const StringC &);
+  void formattingInstruction(const StringC &);
+  void start();
+  void end();
+  void atomic();
+  void characters(const Char *s, size_t n);
+  void charactersFromNode(const NodePtr &, const Char *s, size_t n);
+  void startParagraph(const ParagraphNIC &nic);
+  void endParagraph();
+  void startLink(const Address &);
+  void endLink();
+  void startScroll();
+  void endScroll();
+  void startNode(const NodePtr &, const StringC &);
+  void endNode();
+  void flushPendingAddresses();
+  static void outputCdata(const Char *, size_t, OutputCharStream &);
+  static void outputCdata(const StringC &s, OutputCharStream &os) {
+    outputCdata(s.data(), s.size(), os);
+  }
+  static void outputLength(FOTBuilder::Length n, OutputCharStream &);
+private:
+  HtmlFOTBuilder(const HtmlFOTBuilder &);
+  void operator=(const HtmlFOTBuilder &);
+  
+  struct DestInfo : public Link {
+    DestInfo(IList<Item> *p) : list(p) { }
+    IList<Item> *list;
+  };
+
+  void insertAddr(size_t, size_t);
+  void outputStyleSheet(StringC &);
+  void startDisplay(const DisplayNIC &);
+  void endDisplay();
+  Addressable *elementAddress(size_t g, size_t e);
+
+  const CharStyleClass *makeCharStyleClass();
+  const ParaStyleClass *makeParaStyleClass();
+  ClassPrefix *makeClassPrefix(const StringC &);
+
+  OwnerTable<CharStyle, CharProps, CharProps, CharStyle> charStyleTable_;
+  OwnerTable<ParaStyle, ParaProps, ParaProps, ParaStyle> paraStyleTable_;
+  OwnerTable<ClassPrefix, StringC, Hash, ClassPrefix> prefixTable_;
+  Vector<FlowObjectInfo> flowObjectStack_;
+  FlowObjectInfo nextFlowObject_;
+  IList<DestInfo> destStack_;
+  IList<Item> *dest_;
+  Container root_;
+  // Number of HTML documents
+  unsigned nDocuments_;
+  Vector<Vector<Addressable *> > elements_;
+  Vector<Vector<size_t> > pendingAddr_;
+  String<CmdLineApp::AppChar> outputFilename_;
+  CmdLineApp *app_;
+  Vector<StringC> giStack_;
+  Length topMargin_;
+  Vector<Length> spaceAfterStack_;
+};
+
+FOTBuilder *makeHtmlFOTBuilder(const String<CmdLineApp::AppChar> &outputFilename,
+                              CmdLineApp *app,
+                              const FOTBuilder::Extension *&ext)
+{
+  static const FOTBuilder::Extension extensions[] = {
+    { "UNREGISTERED::James Clark//Characteristic::scroll-title", 0,
+      (void (FOTBuilder::*)(const StringC &))&HtmlFOTBuilder::setScrollTitle },
+    { 0, 0, 0}
+  };
+  ext = extensions;
+  return new HtmlFOTBuilder(outputFilename, app);
+}
+
+static
+void reverse(IList<HtmlFOTBuilder::Item> &list)
+{
+  IList<HtmlFOTBuilder::Item> tem;
+  while (!list.empty())
+    tem.insert(list.get());
+  tem.swap(list);
+}
+
+HtmlFOTBuilder::HtmlFOTBuilder(const String<CmdLineApp::AppChar> &outputFilename,
+                              CmdLineApp *app)
+: outputFilename_(outputFilename),
+  app_(app),
+  nDocuments_(0),
+  giStack_(1),
+  topMargin_(0)
+{
+  flowObjectStack_.push_back(nextFlowObject_);
+  dest_ = root_.contentPtr();
+  giStack_[0] += 'S';
+}
+
+HtmlFOTBuilder::~HtmlFOTBuilder()
+{
+  reverse(*dest_);
+  while (!destStack_.empty()) {
+    reverse(*destStack_.head()->list);
+    delete destStack_.get();
+  }
+  StringC styleSheetFilename;
+  outputStyleSheet(styleSheetFilename);
+  OutputState state(&outputFilename_, styleSheetFilename, app_);
+  DiscardOutputCharStream os;
+  root_.output(os, state);
+  for (size_t i = 0; i < elements_.size(); i++) {
+    for (size_t j = 0; j < elements_[i].size(); j++)
+      if (elements_[i][j] && !elements_[i][j]->defined())
+       delete elements_[i][j];
+  }
+}
+
+void HtmlFOTBuilder::outputStyleSheet(StringC &styleSheetFilename)
+{
+  String<CmdLineApp::AppChar> filename(outputFilename_);
+  for (size_t j = 0; j < 5; j++) {
+    if (filename.size() < j + 1)
+      break;
+    Char c = filename[filename.size() - j - 1];
+    if (c == '/' || c == '\\')
+      break;
+    if (c == '.') {
+      filename.resize(filename.size() - j - 1);
+      break;
+    }
+  }
+  filename += '.';
+  filename += 'c';
+  filename += 's';
+  filename += 's';
+  filename += 0;
+  FileOutputByteStream file;
+  if (!file.open(filename.data())) {
+    app_->message(HtmlMessages::cannotOpenOutputError,
+                 StringMessageArg(app_->convertInput(filename.data())),
+                 ErrnoMessageArg(errno));
+    return;
+  }
+  styleSheetFilename = app_->convertInput(filename.data());
+  RecordOutputCharStream os(new EncodeOutputCharStream(&file,
+                                                      app_->outputCodingSystem()));
+
+  {
+    OwnerTableIter<CharStyle, CharProps, CharProps, CharStyle> iter(charStyleTable_);
+    for (;;) {
+      const CharStyle *style = iter.next();
+      if (!style)
+       break;
+      style->output(os);
+    }
+  }
+  os << "DIV { margin-top: 0pt; margin-bottom: 0pt; margin-left: 0pt; margin-right: 0pt }"
+     << RE;
+  {
+    OwnerTableIter<ParaStyle, ParaProps, ParaProps, ParaStyle> iter(paraStyleTable_);
+    for (;;) {
+      const ParaStyle *style = iter.next();
+      if (!style)
+       break;
+      style->output(os);
+    }
+  }
+}
+
+void HtmlFOTBuilder::CharStyle::output(OutputCharStream &os) const
+{
+  bool first = 1;
+  for (IListIter<CharStyleClass> iter(classes); !iter.done(); iter.next()) {
+    if (first)
+      first = 0;
+    else
+      os << ", ";
+    os << "SPAN.";
+    iter.cur()->outputName(os);
+  }
+  if (!first) {
+    os << " {" << RE;
+    static const char indent[] = "  ";
+    // Netscape Communicator preview release 2 can't handle quoted font family names.
+    os << indent << "font-family: " << fontFamily << ';' << RE;
+    os << indent << "font-weight: " << int(fontWeight) << "00;" << RE;
+    static const char *styleNames[3] = {
+      "normal", "italic", "oblique"
+    };
+    os << indent << "font-style: " << styleNames[fontStyle] << ';' << RE;
+    os << indent << "font-size: ";
+    outputLength(fontSize, os);
+    os << ';' << RE;
+    os << indent << "color: #";
+    for (int i = 20; i >= 0; i -= 4)
+      os << "0123456789abcdef"[(color >> i) & 0xf];
+    os << ';' << RE;
+    os << '}' << RE;
+  }
+}
+
+void HtmlFOTBuilder::ParaStyle::output(OutputCharStream &os) const
+{
+  bool first = 1;
+  for (IListIter<ParaStyleClass> iter(classes); !iter.done(); iter.next()) {
+    if (first)
+      first = 0;
+    else
+      os << ", ";
+    os << "DIV.";
+    iter.cur()->outputName(os);
+  }
+  if (!first) {
+    os << " {" << RE;
+    static const char indent[] = "  ";
+    if (leftMargin) {
+      os << indent << "margin-left: ";
+      outputLength(leftMargin, os);
+      os << ';' << RE;
+    }
+    if (rightMargin) {
+      os << indent << "margin-right: ";
+      outputLength(rightMargin, os);
+      os << ';' << RE;
+    }
+    if (topMargin) {
+      os << indent << "margin-top: ";
+      outputLength(topMargin, os);
+      os << ';' << RE;
+    }
+    static const char *alignNames[4] = {
+      "left", "center", "right", "justify"
+    };
+    os << indent << "text-align: " << alignNames[align] << ';' << RE;
+    os << indent << "line-height: ";
+    outputLength(lineHeight, os);
+    os << ';' << RE;
+    os << indent << "text-indent: ";
+    outputLength(textIndent, os);
+    os << ';' << RE;
+    os << '}' << RE;
+  }
+}
+
+void HtmlFOTBuilder::outputLength(FOTBuilder::Length n, OutputCharStream &os)
+{
+  char buf[32];
+  sprintf(buf, "%04ld", long(n));
+  char *end = strchr(buf, '\0');
+  for (int i = 0; i < 4; i++)
+    end[1 - i] = end[-i];
+  end[-3] = '.';
+  while (*end == '0')
+    *end-- = '\0';
+  if (*end == '.')
+    *end = '\0';
+  strcat(buf, "pt");
+  os << buf;
+}
+
+void HtmlFOTBuilder::start()
+{
+  flowObjectStack_.push_back(nextFlowObject_);
+}
+
+void HtmlFOTBuilder::end()
+{
+  flowObjectStack_.resize(flowObjectStack_.size() - 1);
+  nextFlowObject_ = flowObjectStack_.back();
+}
+
+void HtmlFOTBuilder::atomic()
+{
+  nextFlowObject_ = flowObjectStack_.back();
+}
+
+void HtmlFOTBuilder::formattingInstruction(const StringC &s)
+{
+  dest_->insert(new Markup(s));
+  atomic();
+}
+
+const HtmlFOTBuilder::CharStyleClass *HtmlFOTBuilder::makeCharStyleClass()
+{
+  CharStyle *style = charStyleTable_.lookup(nextFlowObject_);
+  if (!style) {
+    style = new CharStyle(nextFlowObject_);
+    charStyleTable_.insert(style);
+  }
+  for (IListIter<CharStyleClass> iter(style->classes); !iter.done(); iter.next())
+    if (iter.cur()->gi == giStack_.back())
+      return iter.cur();
+  ClassPrefix *prefix = makeClassPrefix(giStack_.back());
+  CharStyleClass *sc = new CharStyleClass(giStack_.back(), prefix, style);
+  style->classes.insert(sc);
+  return sc;
+}
+
+const HtmlFOTBuilder::ParaStyleClass *HtmlFOTBuilder::makeParaStyleClass()
+{
+  ParaProps props(nextFlowObject_);
+  props.topMargin = topMargin_;
+  topMargin_ = 0;
+  ParaStyle *style = paraStyleTable_.lookup(props);
+  if (!style) {
+    style = new ParaStyle(props);
+    paraStyleTable_.insert(style);
+  }
+  for (IListIter<ParaStyleClass> iter(style->classes); !iter.done(); iter.next())
+    if (iter.cur()->gi == giStack_.back())
+      return iter.cur();
+  ClassPrefix *prefix = makeClassPrefix(giStack_.back());
+  ParaStyleClass *sc = new ParaStyleClass(giStack_.back(), prefix, style);
+  style->classes.insert(sc);
+  return sc;
+}
+
+HtmlFOTBuilder::StyleClass::StyleClass(const StringC &g, ClassPrefix *pfx)
+: gi(g), prefix(pfx), prefixIndex(pfx->nCharClasses + pfx->nParaClasses + 1)
+{
+
+  
+}
+
+HtmlFOTBuilder::CharStyleClass::CharStyleClass(const StringC &g, ClassPrefix *pfx,
+                                              const CharStyle *s)
+: StyleClass(g, pfx), style(s)
+{
+  pfx->nCharClasses += 1;
+}
+
+HtmlFOTBuilder::ParaStyleClass::ParaStyleClass(const StringC &g, ClassPrefix *pfx,
+                                              const ParaStyle *s)
+: StyleClass(g, pfx), style(s)
+{
+  pfx->nParaClasses += 1;
+}
+
+HtmlFOTBuilder::ClassPrefix *HtmlFOTBuilder::makeClassPrefix(const StringC &gi)
+{
+  // FIXME strip illegal characters
+  ClassPrefix *prefix = prefixTable_.lookup(gi);
+  if (!prefix) {
+    prefix = new ClassPrefix(gi);
+    prefixTable_.insert(prefix);
+  }
+  return prefix;
+}
+
+void HtmlFOTBuilder::charactersFromNode(const NodePtr &node, const Char *s, size_t n)
+{
+  flushPendingAddresses();
+  dest_->insert(new NodePcdata(node, s, n, makeCharStyleClass()));
+}
+
+void HtmlFOTBuilder::characters(const Char *s, size_t n)
+{
+  flushPendingAddresses();
+  dest_->insert(new ImmediatePcdata(s, n, makeCharStyleClass()));
+}
+
+void HtmlFOTBuilder::startParagraph(const ParagraphNIC &nic)
+{
+  startDisplay(nic);
+  Block *block = new Block(makeParaStyleClass());
+  nextFlowObject_.parentLeftMargin += nextFlowObject_.leftMargin;
+  nextFlowObject_.parentRightMargin += nextFlowObject_.rightMargin;
+  nextFlowObject_.leftMargin = 0;
+  nextFlowObject_.rightMargin = 0;
+  dest_->insert(block);
+  destStack_.insert(new DestInfo(dest_));
+  dest_ = block->contentPtr();
+  start();
+}
+
+void HtmlFOTBuilder::endParagraph()
+{
+  reverse(*dest_);
+  dest_ = destStack_.head()->list;
+  delete destStack_.get();
+  end();
+  endDisplay();
+}
+
+void HtmlFOTBuilder::startDisplay(const DisplayNIC &nic)
+{
+  Length spaceBefore = nic.spaceBefore.nominal.length;
+  if (spaceBefore > topMargin_)
+    topMargin_ = spaceBefore;
+  spaceAfterStack_.push_back(nic.spaceAfter.nominal.length);
+}
+
+void HtmlFOTBuilder::endDisplay()
+{
+  const Length &spaceAfter = spaceAfterStack_.back();
+  if (spaceAfter > topMargin_)
+    topMargin_ = spaceAfter;
+  spaceAfterStack_.resize(spaceAfterStack_.size() - 1);
+}
+
+void HtmlFOTBuilder::startScroll()
+{
+  nextFlowObject_.docIndex = nDocuments_++;
+  start();
+  Document *doc = new Document(nextFlowObject_.docIndex,
+                              nextFlowObject_.scrollTitle);
+  dest_->insert(doc);
+  destStack_.insert(new DestInfo(dest_));
+  dest_ = doc->contentPtr();
+  if (pendingAddr_.size()) {
+    Vector<size_t> &v = pendingAddr_.back();
+    for (size_t i = 0; i < v.size(); i += 2) {
+      Addressable *tem = elementAddress(v[i], v[i + 1]);
+      if (!tem->defined()) {
+        dest_->insert(tem);
+       tem->setDefined(nextFlowObject_.docIndex, 1);
+      }
+    }
+    v.resize(0);
+  }
+}
+
+void HtmlFOTBuilder::endScroll()
+{
+  reverse(*dest_);
+  dest_ = destStack_.head()->list;
+  delete destStack_.get();
+  end();
+}
+
+void HtmlFOTBuilder::startLink(const Address &addr)
+{
+  start();
+  AddressRef *aref = 0;
+  switch (addr.type) {
+  case Address::resolvedNode:
+    {
+      unsigned long n;
+      if (addr.node->elementIndex(n) == accessOK) {
+       Addressable *tem = elementAddress(addr.node->groveIndex(), n);
+       tem->setReferenced();
+       aref = tem;
+      }
+      break;
+    }
+  case Address::idref:
+    {
+      const StringC &id = addr.params[0];
+      size_t i;
+      for (i = 0; i < id.size(); i++)
+       if (id[i] == ' ')
+         break;
+      NodePtr node;
+      NamedNodeListPtr elements;
+      unsigned long n;
+      if (addr.node->getGroveRoot(node) == accessOK
+         && node->getElements(elements) == accessOK
+         && elements->namedNode(GroveString(id.data(), i), node) == accessOK
+         && node->elementIndex(n) == accessOK) {
+       Addressable *tem = elementAddress(addr.node->groveIndex(), n);
+       tem->setReferenced();
+       aref = tem;
+      }
+      break;
+    }
+  default:
+    break;
+  }
+  Ref *ref = new Ref(aref);
+  dest_->insert(ref);
+  destStack_.insert(new DestInfo(dest_));
+  dest_ = ref->contentPtr();
+}
+
+void HtmlFOTBuilder::endLink()
+{
+  reverse(*dest_);
+  dest_ = destStack_.head()->list;
+  delete destStack_.get();
+  end();
+}
+
+HtmlFOTBuilder::Addressable *HtmlFOTBuilder::elementAddress(size_t g, size_t e)
+{
+  if (g >= elements_.size())
+    elements_.resize(g + 1);
+  Vector<Addressable *> &v = elements_[g];
+  for (size_t i = v.size(); i <= e; i++)
+    v.push_back((Addressable *)0);
+  if (!v[e])
+    v[e] = new Addressable(g, e);
+  return v[e];
+}
+
+void HtmlFOTBuilder::startNode(const NodePtr &node, const StringC &mode)
+{
+  pendingAddr_.resize(pendingAddr_.size() + 1);
+  if (mode.size() == 0) {
+    if (pendingAddr_.size() > 1)
+      pendingAddr_.back() = pendingAddr_[pendingAddr_.size() - 2];
+    unsigned long n;
+    if (node->elementIndex(n) == accessOK) {
+      pendingAddr_.back().push_back(node->groveIndex());
+      pendingAddr_.back().push_back(size_t(n));
+    }
+  }
+  giStack_.resize(giStack_.size() + 1);
+  GroveString str;
+  if (node->getGi(str) == accessOK)
+    giStack_.back().assign(str.data(), str.size());
+  else if (giStack_.size() >= 2)
+    giStack_.back() = giStack_[giStack_.size() - 2];
+}
+
+void HtmlFOTBuilder::endNode()
+{
+  pendingAddr_.resize(pendingAddr_.size() - 1);
+  giStack_.resize(giStack_.size() - 1);
+}
+
+void HtmlFOTBuilder::insertAddr(size_t g, size_t e)
+{
+  Addressable *tem = elementAddress(g, e);
+  if (!tem->defined() && nextFlowObject_.docIndex != (unsigned)-1) {
+    dest_->insert(tem);
+    tem->setDefined(nextFlowObject_.docIndex);
+  }
+}
+
+void HtmlFOTBuilder::setLineSpacing(const LengthSpec &val)
+{
+  nextFlowObject_.lineHeight = val.length;
+}
+
+void HtmlFOTBuilder::setQuadding(Symbol sym)
+{
+  switch (sym) {
+  case symbolStart:
+    nextFlowObject_.align = ParaProps::alignLeft;
+    break;
+  case symbolEnd:
+    nextFlowObject_.align = ParaProps::alignRight;
+    break;
+  case symbolCenter:
+    nextFlowObject_.align = ParaProps::alignCenter;
+    break;
+  case symbolJustify:
+    nextFlowObject_.align = ParaProps::alignJustify;
+    break;
+  default:
+    break;
+  }
+}
+
+void HtmlFOTBuilder::setFirstLineStartIndent(const LengthSpec &ls)
+{
+  nextFlowObject_.textIndent = ls.length;
+}
+
+void HtmlFOTBuilder::setStartIndent(const LengthSpec &ls)
+{
+  nextFlowObject_.leftMargin = ls.length - nextFlowObject_.parentLeftMargin;
+}
+
+void HtmlFOTBuilder::setEndIndent(const LengthSpec &ls)
+{
+  nextFlowObject_.rightMargin = ls.length - nextFlowObject_.parentRightMargin;
+}
+
+void HtmlFOTBuilder::setFontFamilyName(const StringC &name)
+{
+  nextFlowObject_.fontFamily = name;
+}
+
+void HtmlFOTBuilder::setFontWeight(Symbol weight)
+{
+  switch (weight) {
+  case symbolUltraLight:
+    nextFlowObject_.fontWeight = 1;
+    break;
+  case symbolExtraLight:
+    nextFlowObject_.fontWeight = 2;
+    break;
+  case symbolLight:
+    nextFlowObject_.fontWeight = 3;
+    break;
+  case symbolSemiLight:
+    nextFlowObject_.fontWeight = 4;
+    break;
+  case symbolMedium:
+    nextFlowObject_.fontWeight = 5;
+    break;
+  case symbolSemiBold:
+    nextFlowObject_.fontWeight = 6;
+    break;
+  case symbolBold:
+    nextFlowObject_.fontWeight = 7;
+    break;
+  case symbolExtraBold:
+    nextFlowObject_.fontWeight = 8;
+    break;
+  case symbolUltraBold:
+    nextFlowObject_.fontWeight = 9;
+    break;
+  default:
+    break;
+  }
+}
+
+void HtmlFOTBuilder::setFontPosture(Symbol posture)
+{
+  switch (posture) {
+  case symbolOblique:
+    nextFlowObject_.fontStyle = CharProps::styleOblique;
+    break;
+  case symbolItalic:
+    nextFlowObject_.fontStyle = CharProps::styleItalic;
+    break;
+  default:
+    nextFlowObject_.fontStyle = CharProps::styleNormal;
+    break;
+  }
+}
+
+void HtmlFOTBuilder::setFontSize(Length n)
+{
+  nextFlowObject_.fontSize = n;
+}
+
+void HtmlFOTBuilder::setColor(const DeviceRGBColor &color)
+{
+  nextFlowObject_.color = (color.red << 16) | (color.green << 8) | color.blue;
+}
+
+void HtmlFOTBuilder::setScrollTitle(const StringC &s)
+{
+  nextFlowObject_.scrollTitle = new StringResource<Char>(s);
+}
+
+void HtmlFOTBuilder::flushPendingAddresses()
+{
+  if (pendingAddr_.size()) {
+    for (size_t i = 0; i < pendingAddr_.back().size(); i += 2)
+      insertAddr(pendingAddr_.back()[i], pendingAddr_.back()[i + 1]);
+    pendingAddr_.back().resize(0);
+  }
+}
+
+void HtmlFOTBuilder::outputCdata(const Char *s, size_t n, OutputCharStream &os)
+{
+  for (; n > 0; n--, s++) {
+    switch (*s) {
+    case '\n':
+      break;
+    case '&':
+      os << "&amp;";
+      break;
+    case '<':
+      os << "&lt;";
+      break;
+    case '>':
+      os << "&gt;";
+      break;
+    case '\r':
+      os << RE;
+      break;
+    default:
+      if (*s >= 255)
+       os << "&#" << (unsigned long)*s << ';';
+      else
+       os.put(*s);
+      break;
+    }
+  }
+}
+
+void HtmlFOTBuilder::Document::output(OutputCharStream &, OutputState &oldState)
+{
+  OutputState state(&oldState.outputFilename(),
+                    oldState.styleSheetFilename(),
+                   &oldState.app());
+  FileOutputByteStream file;
+  String<CmdLineApp::AppChar> filename(state.outputFilename(index_));
+  filename += 0;
+  if (!file.open(filename.data())) {
+    state.messenger()
+      .message(HtmlMessages::cannotOpenOutputError,
+               StringMessageArg(state.app().convertInput(filename.data())),
+              ErrnoMessageArg(errno));
+    return;
+  }
+  RecordOutputCharStream os(new EncodeOutputCharStream(&file,
+                                                   state.app().outputCodingSystem()));
+  // FIXME setEscaper
+  unsigned oldDocIndex = state.setOutputDocIndex(index_);
+  os << "<HTML>" << RE;
+  const StringC &styleSheetFilename = state.styleSheetFilename();
+  if (styleSheetFilename.size()) {
+    os << "<LINK REL=STYLESHEET TYPE=\"text/css\" HREF=\"";
+    size_t i = styleSheetFilename.size();
+    for (; i > 0; i--)
+      if (styleSheetFilename[i - 1] == '\\' || styleSheetFilename[i - 1] == '/')
+       break;
+    os.write(styleSheetFilename.data() + i, styleSheetFilename.size() - i);
+    os << "\">" << RE;
+  }
+  if (!title_.isNull()) {
+    os << "<TITLE>";
+    HtmlFOTBuilder::outputCdata(*title_, os);
+    os << "</TITLE>";
+  }
+  os << "<BODY>" << RE;
+  Container::output(os, state);
+  os << "</BODY>" << RE;
+  os << "</HTML>" << RE;
+  state.setOutputDocIndex(oldDocIndex);
+}
+
+void HtmlFOTBuilder::Container::output(OutputCharStream &os, OutputState &state)
+{
+  for (IListIter<Item> iter(content_); !iter.done(); iter.next())
+    iter.cur()->output(os, state);
+}
+
+void HtmlFOTBuilder::Block::output(OutputCharStream &os, OutputState &state)
+{
+  const AddressRef *addr = state.setAddress(0);
+  state.syncChar(0, os);
+  os << "<DIV CLASS=";
+  styleClass_->outputName(os);
+  os << RE <<'>';
+  state.setAddress(addr);
+  Container::output(os, state);
+  state.setAddress(0);
+  state.syncChar(0, os);
+  os << "</DIV>";
+  state.setAddress(addr);
+}
+
+void HtmlFOTBuilder::Ref::output(OutputCharStream &os, OutputState &state)
+{
+  const AddressRef *oldAref = state.setAddress(aref_);
+  Container::output(os, state);
+  state.setAddress(oldAref);
+}
+
+void HtmlFOTBuilder::Pcdata::output(OutputCharStream &os, OutputState &state)
+{
+  size_t n;
+  const Char *s = data(n);
+  state.syncChar(styleClass_, os);
+  HtmlFOTBuilder::outputCdata(s, n, os);
+}
+
+void HtmlFOTBuilder::Markup::output(OutputCharStream &os, OutputState &state)
+{
+  state.syncChar(0, os);
+  os << str_;
+}
+
+void HtmlFOTBuilder::Addressable::output(OutputCharStream &os, OutputState &)
+{
+  ASSERT(defined());
+  if (referenced_ && elementIndex_ != (unsigned)-1) {
+    os << "<A NAME=";
+    if (groveIndex_)
+      os << (unsigned long)groveIndex_ << '.';
+    os << (unsigned long)elementIndex_ << "></A>";
+  }
+}
+
+void HtmlFOTBuilder::Addressable::outputRef(bool end, OutputCharStream &os,
+                                           OutputState &state) const
+{
+  ASSERT(referenced_);
+  if (defined()) {
+    if (end)
+      os << "</A>";
+    else {
+      os << "<A HREF=\"";
+      if (state.outputDocIndex() != docIndex_ || elementIndex_ == (unsigned)-1) {
+       const String<CmdLineApp::AppChar> &outputFilename = state.outputFilename(docIndex_);
+       size_t i = outputFilename.size();
+       for (; i > 0; i--)
+         if (outputFilename[i - 1] == '\\' || outputFilename[i - 1] == '/')
+            break;
+       for (; i < outputFilename.size(); i++)
+         os.put(outputFilename[i]);
+      }
+      if (elementIndex_ != (unsigned)-1) {
+       os << "#";
+       if (groveIndex_)
+         os << (unsigned long)groveIndex_ << '.';
+       os << (unsigned long)elementIndex_;
+      }
+      os << "\">";
+    }
+  }
+}
+
+String<CmdLineApp::AppChar> HtmlFOTBuilder::OutputState::outputFilename(unsigned index) const
+{
+  if (index == 0)
+    return *outputFilename_;
+  String<CmdLineApp::AppChar> base(*outputFilename_);
+  String<CmdLineApp::AppChar> ext;
+  for (size_t j = 0; j < 5; j++) {
+    if (base.size() < j + 1)
+      break;
+    Char c = base[base.size() - j - 1];
+    if (c == '/' || c == '\\')
+      break;
+    if (c == '.') {
+      ext.assign(base.data() + (base.size() - j - 1), j + 1);
+      base.resize(base.size() - j - 1);
+      break;
+    }
+  }
+  char buf[32];
+  sprintf(buf, "%u", index);
+  for (const char *p = buf; *p; p++)
+    base += CmdLineApp::AppChar(*p);
+  base += ext;
+  return base;
+}
+
+void HtmlFOTBuilder::OutputState::syncChar(const CharStyleClass *styleClass,
+                                          OutputCharStream &os)
+{
+  // <A><SPAN>...</SPAN></A>
+  if (curAref_ != specAref_) {
+    if (curCharStyleClass_) {
+      os << "</SPAN>";
+      curCharStyleClass_ = 0;
+    }
+    if (curAref_)
+      curAref_->outputRef(1, os, *this);
+    if (specAref_)
+      specAref_->outputRef(0, os, *this);
+    curAref_ = specAref_;
+  }
+  if (curCharStyleClass_ != styleClass) {
+    if (curCharStyleClass_)
+      os << "</SPAN>";
+    if (styleClass) {
+      os << "<SPAN CLASS=";
+      styleClass->outputName(os);
+      os << '>';
+    }
+    curCharStyleClass_ = styleClass;
+  }
+}
+
+HtmlFOTBuilder::AddressRef::~AddressRef()
+{
+}
+
+HtmlFOTBuilder::Item::~Item()
+{
+}
+
+HtmlFOTBuilder::Document::~Document()
+{
+}
+
+HtmlFOTBuilder::CharProps::CharProps()
+: fontWeight(5), color(0), fontStyle(styleNormal), fontSize(10*1000)
+{
+  for (const char *p = "Times New Roman,serif"; *p; p++)
+    fontFamily += *p;
+}
+
+HtmlFOTBuilder::InheritParaProps::InheritParaProps()
+: leftMargin(0), rightMargin(0), align(alignLeft), lineHeight(12*1000),
+  textIndent(0)
+{
+}
+
+HtmlFOTBuilder::FlowObjectInfo::FlowObjectInfo()
+: docIndex(unsigned(-1)), parentLeftMargin(0), parentRightMargin(0)
+{
+}
+
+void HtmlFOTBuilder::StyleClass::outputName(OutputCharStream &os) const
+{
+  os << prefix->prefix;
+  if (prefix->nCharClasses > 1 || prefix->nParaClasses > 1)
+    os << (unsigned long)prefixIndex;
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#include "HtmlFOTBuilder_inst.cxx"
+
+#endif /* JADE_HTML */
diff --git a/jade/HtmlFOTBuilder.h b/jade/HtmlFOTBuilder.h
new file mode 100644 (file)
index 0000000..9ef26d1
--- /dev/null
@@ -0,0 +1,23 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef HtmlFOTBuilder_INCLUDED
+#define HtmlFOTBuilder_INCLUDED 1
+
+#include "FOTBuilder.h"
+#include "CmdLineApp.h"
+#include "Message.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+FOTBuilder *makeHtmlFOTBuilder(const String<CmdLineApp::AppChar> &basename,
+                              CmdLineApp *app,
+                              const FOTBuilder::Extension *&);
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not HtmlFOTBuilder_INCLUDED */
diff --git a/jade/HtmlFOTBuilder_inst.m4 b/jade/HtmlFOTBuilder_inst.m4
new file mode 100644 (file)
index 0000000..bf96c68
--- /dev/null
@@ -0,0 +1,50 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#include "config.h"
+
+#ifdef SP_MANUAL_INST
+
+#define SP_DEFINE_TEMPLATES
+#include "Ptr.h"
+#include "IList.h"
+#include "IListIter.h"
+#include "Vector.h"
+#include "OwnerTable.h"
+#include "PointerTable.h"
+#undef SP_DEFINE_TEMPLATES
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+__instantiate(IList<HtmlFOTBuilder::Item>)
+__instantiate(IListIter<HtmlFOTBuilder::Item>)
+__instantiate(IList<HtmlFOTBuilder::DestInfo>)
+__instantiate(Vector<HtmlFOTBuilder::FlowObjectInfo>)
+__instantiate(Vector<HtmlFOTBuilder::Addressable *>)
+__instantiate(Vector<Vector<HtmlFOTBuilder::Addressable *> >)
+__instantiate(Vector<Vector<size_t> >)
+__instantiate(`OwnerTable<HtmlFOTBuilder::CharStyle, HtmlFOTBuilder::CharProps, HtmlFOTBuilder::CharProps, HtmlFOTBuilder::CharStyle>')
+__instantiate(`OwnerTable<HtmlFOTBuilder::ParaStyle, HtmlFOTBuilder::ParaProps, HtmlFOTBuilder::ParaProps, HtmlFOTBuilder::ParaStyle>')
+__instantiate(`OwnerTable<HtmlFOTBuilder::ClassPrefix, StringC, Hash, HtmlFOTBuilder::ClassPrefix>')
+__instantiate(`PointerTable<HtmlFOTBuilder::CharStyle *, HtmlFOTBuilder::CharProps, HtmlFOTBuilder::CharProps, HtmlFOTBuilder::CharStyle>')
+__instantiate(`PointerTable<HtmlFOTBuilder::ParaStyle *, HtmlFOTBuilder::ParaProps, HtmlFOTBuilder::ParaProps, HtmlFOTBuilder::ParaStyle>')
+__instantiate(`PointerTable<HtmlFOTBuilder::ClassPrefix *, StringC, Hash, HtmlFOTBuilder::ClassPrefix>')
+__instantiate(`OwnerTableIter<HtmlFOTBuilder::CharStyle, HtmlFOTBuilder::CharProps, HtmlFOTBuilder::CharProps, HtmlFOTBuilder::CharStyle>')
+__instantiate(`OwnerTableIter<HtmlFOTBuilder::ParaStyle, HtmlFOTBuilder::ParaProps, HtmlFOTBuilder::ParaProps, HtmlFOTBuilder::ParaStyle>')
+__instantiate(`PointerTableIter<HtmlFOTBuilder::CharStyle *, HtmlFOTBuilder::CharProps, HtmlFOTBuilder::CharProps, HtmlFOTBuilder::CharStyle>')
+__instantiate(`PointerTableIter<HtmlFOTBuilder::ParaStyle *, HtmlFOTBuilder::ParaProps, HtmlFOTBuilder::ParaProps, HtmlFOTBuilder::ParaStyle>')
+__instantiate(Vector<HtmlFOTBuilder::CharStyle *>)
+__instantiate(Vector<HtmlFOTBuilder::ParaStyle *>)
+__instantiate(Vector<HtmlFOTBuilder::ClassPrefix *>)
+__instantiate(IList<HtmlFOTBuilder::CharStyleClass>)
+__instantiate(IList<HtmlFOTBuilder::ParaStyleClass>)
+__instantiate(IListIter<HtmlFOTBuilder::CharStyleClass>)
+__instantiate(IListIter<HtmlFOTBuilder::ParaStyleClass>)
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* SP_MANUAL_INST */
diff --git a/jade/HtmlMessages.msg b/jade/HtmlMessages.msg
new file mode 100644 (file)
index 0000000..3c94113
--- /dev/null
@@ -0,0 +1,6 @@
+# Copyright (c) 1996 James Clark
+# See the file COPYING for copying permission
+
+=3000
+
+E2+cannotOpenOutputError++cannot open output file %1 (%2)
diff --git a/jade/JadeMessages.msg b/jade/JadeMessages.msg
new file mode 100644 (file)
index 0000000..0e49f4a
--- /dev/null
@@ -0,0 +1,8 @@
+# Copyright (c) 1996 James Clark
+# See the file COPYING for copying permission
+
+=1000
+
+E1+unknownType++unknown output type %1
+E0+emptyOutputFilename++empty output filename
+E2+cannotOpenOutputError++cannot open output file %1 (%2)
diff --git a/jade/Makefile.sub b/jade/Makefile.sub
new file mode 100644 (file)
index 0000000..c1aed91
--- /dev/null
@@ -0,0 +1,17 @@
+PROG=openjade
+OBJS=jade.o SgmlFOTBuilder.o RtfFOTBuilder.o HtmlFOTBuilder.o \
+  TeXFOTBuilder.o TransformFOTBuilder.o MifFOTBuilder.o
+INCLUDE=-I$(srcdir)/../grove -I$(srcdir)/../spgrove -I$(srcdir)/../style
+# XLIBS=../style/libostyle.a ../spgrove/libospgrove.a ../grove/libogrove.a \
+#   ../lib/libosp.a
+XLIBS=../style/libostyle.a ../spgrove/libospgrove.a ../grove/libogrove.a $(splibdir)/libosp.a
+GENSRCS=JadeMessages.h HtmlMessages.h RtfMessages.h TeXMessages.h \
+ HtmlFOTBuilder_inst.cxx RtfFOTBuilder_inst.cxx  TeXFOTBuilder_inst.cxx \
+ TransformFOTBuilder_inst.cxx MifMessages.h MifFOTBuilder_inst.cxx
+
+HtmlFOTBuilder.o: HtmlFOTBuilder_inst.cxx HtmlMessages.h
+RtfFOTBuilder.o: RtfFOTBuilder_inst.cxx RtfMessages.h
+TeXFOTBuilder.o: TeXFOTBuilder_inst.cxx TeXMessages.h
+MifFOTBuilder.o: MifFOTBuilder_inst.cxx MifMessages.h
+TransformFOTBuilder.o: TransformFOTBuilder_inst.cxx
+jade.o: JadeMessages.h
diff --git a/jade/MifFOTBuilder.cxx b/jade/MifFOTBuilder.cxx
new file mode 100644 (file)
index 0000000..bc59cb1
--- /dev/null
@@ -0,0 +1,6007 @@
+/* Copyright (c) 1998 ISOGEN International Corp.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+``Software''), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL ISOGEN INTERNATIONAL CORP. BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
+THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of ISOGEN International
+Corp. shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from ISOGEN International Corp. */
+
+/* Created by Kathleen Marszalek and Paul Prescod. */
+
+#include "config.h"
+
+#ifdef JADE_MIF
+
+#include "MifFOTBuilder.h"
+#include "MifMessages.h"
+#include "TmpOutputByteStream.h"
+#include "CharMap.h"
+#include "CmdLineApp.h"
+#include "ErrnoMessageArg.h"
+#include "FOTBuilder.h"
+#include "Hash.h"
+#include "HashTable.h"
+#include "IList.h"
+#include "IQueue.h"
+#include "InputSource.h"
+#include "Message.h"
+#include "OutputByteStream.h"
+#include "Owner.h"
+#include "PointerTable.h"
+#include "StorageManager.h"
+#include "StringC.h"
+#include "Vector.h"
+
+#include <assert.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+//#define assert(exp) (void)( (exp) || (throw "assertion_failed", 0) )
+
+#define PROPERTY( propertyType, propertyName ) \
+    propertyType propertyName; \
+    void set ## propertyName ( propertyType p ) \
+     { propertyName = p; setProperties |= f ## propertyName ;} 
+
+#define PROPERTY_OUT( propertyName ) \
+    if( properties & f ## propertyName ) \
+        os << '\n' << MifOutputByteStream::INDENT \
+           << "<" #propertyName " " << propertyName << ">"; 
+
+#define VECTOR_OF_PROPERTIES( propertyType, propertyName ) \
+    Vector< propertyType > propertyName ## s; \
+    void propertyName ## sAreSet() \
+     { setProperties |= f ## propertyName ## s ;}
+
+#define STATIC_PROPERTY( propertyType, propertyName ) \
+    static propertyType propertyName; \
+    static void set ## propertyName ( propertyType p ) \
+     { propertyName = p; setProperties |= f ## propertyName ;}
+
+class StringHash {
+public:
+  static unsigned long hash( const String<char> & );
+};
+
+class MifOutputByteStream;
+class MifTmpOutputByteStream;
+class MifDoc {
+
+  public:
+
+    MifDoc( const String<CmdLineApp::AppChar> &fileLoc, CmdLineApp *app );
+    ~MifDoc();
+    static MifDoc &curInstance() { assert( CurInstance != NULL ); return *CurInstance; }
+    static MifDoc *CurInstance;
+
+    struct T_indent {
+
+        T_indent( unsigned i ) : data( i ) {}
+        long data;
+        operator unsigned() const { return data; }
+    };
+
+    struct T_dimension {
+
+        T_dimension( long u = 0 ) : data( u ) {}
+        long data;
+        operator long() const { return data; }
+        T_dimension &operator=( long s ) { data = s; return *this; }
+    };
+
+    struct T_string : public String<char> {
+
+        T_string() : String<char>() {};
+        T_string( const String<char> &s ) : String<char>( s ) {};
+        T_string( String<CmdLineApp::AppChar> &s ) : String<char>() 
+          { for( size_t i = 0; i < s.size(); i++ ) *this += char( s[i] ); }
+        T_string( const char *cS ) : String<char>( cS, strlen( cS ) ) {};
+        T_string &operator=( String<char> s ) { String<char>::operator=( s ); return *this; }
+        void escapeSpecialChars();
+    };
+
+    struct T_boolean {
+
+        T_boolean( bool b = false ) : data( b ) {}
+        bool data;
+        operator bool() const { return data; }
+        T_boolean &operator=( bool b ) { data = b; return *this; }
+    };
+
+    typedef T_string        T_tagstring;
+    typedef T_string        T_pathname;
+    typedef String<char>    T_keyword;
+
+    typedef long        T_integer;
+    typedef unsigned    T_ID;
+    typedef long        T_degrees;
+    typedef double      T_percentage;
+    typedef long        T_metric;
+
+    struct T_WH { T_dimension w, h; // width, height      
+                  T_WH( T_dimension w_, T_dimension h_ ) : w( w_ ), h( h_ ) {}  
+                  T_WH() : w( 0L ), h( 0L ) {} };
+    struct T_XY { T_dimension x, y;
+                  T_XY( T_dimension x_, T_dimension y_ ) : x( x_ ), y( y_ ) {}  
+                  T_XY() : x( 0L ), y( 0L ) {} };
+    struct T_LTRB { T_dimension l, t, r, b; // left, top, right, bottom
+                    T_LTRB( T_dimension l_, T_dimension t_, T_dimension r_, T_dimension b_ )
+                     : l( l_ ), t( t_ ), r( r_ ), b( b_ ) {}
+                    T_LTRB() : l( 0L ), t( 0L ), r( 0L ), b( 0L ) {} };
+    struct T_LTWH { T_dimension l, t, w, h; // left, top, width, height
+                    T_LTWH( T_dimension l_, T_dimension t_, T_dimension w_, T_dimension h_ )
+                     : l( l_ ), t( t_ ), w( w_ ), h( h_ ) {}
+                    T_LTWH() : l( 0L ), t( 0L ), w( 0L ), h( 0L ) {} };
+    struct T_XYWH { T_dimension x, y, w, h; };          
+
+    // special characters
+    static const String<char> sTab;
+    static const String<char> sHardSpace;
+    static const String<char> sSoftHyphen;
+    static const String<char> sHardHyphen;
+    static const String<char> sHardReturn;
+    static const String<char> sNumberSpace;
+    static const String<char> sThinSpace;
+    static const String<char> sEnSpace;
+    static const String<char> sEmSpace;
+    static const String<char> sCent;
+    static const String<char> sPound;
+    static const String<char> sYen;
+    static const String<char> sEnDash;
+    static const String<char> sEmDash;
+    static const String<char> sDagger;
+    static const String<char> sDoubleDagger;
+    static const String<char> sBullet;
+
+    // for tagged text flows
+    static const String<char> sA;
+
+    // FWeight
+    static const String<char> sRegular;
+    static const String<char> sBold;
+
+    // FAngle
+    // sRegular;
+    static const String<char> sItalic;
+
+    // FVar
+    // sRegular;
+
+    // FColor
+    static const String<char> sWhite;
+    static const String<char> sBlack;
+
+    // FUnderlining
+    static const String<char> sFNoUnderlining;
+    static const String<char> sFSingle;
+    static const String<char> sFDouble;
+    static const String<char> sFNumeric;
+
+    // FPosition
+    static const String<char> sFNormal;
+    static const String<char> sFSuperscript;
+    static const String<char> sFSubscript;
+
+    // FCase
+    static const String<char> sFAsTyped;
+    static const String<char> sFSmallCaps;
+    static const String<char> sFLowercase;
+    static const String<char> sFUppercase;
+
+    // FFamily
+    static const String<char> sTimesNewRoman;
+
+    struct FontFormat : public Link {
+
+        enum { fNone = 0, fFFamily = 0x1, fFAngle = 0x2, fFWeight = 0x4, fFVar = 0x8,
+               fFSize = 0x10, fFColor = 0x20, fFUnderlining = 0x40, fFOverline = 0x80,
+               fFStrike = 0x100, fFPosition = 0x200, fFPairKern = 0x400, fFCase = 0x800,
+               fFDX = 0x1000, fFDY = 0x2000, fFDW = 0x4000, fAll = 0x7FFF };
+        unsigned setProperties;
+
+        FontFormat() : setProperties( 0 ) {}
+
+        // font name
+        PROPERTY( T_string, FFamily );
+        PROPERTY( T_string, FAngle );
+        PROPERTY( T_string, FWeight );
+        PROPERTY( T_string, FVar );
+
+        // font size and color
+        PROPERTY( T_dimension, FSize );
+        PROPERTY( T_tagstring, FColor );
+                
+        // font style
+        PROPERTY( T_keyword, FUnderlining );
+        PROPERTY( T_boolean, FOverline );
+        PROPERTY( T_boolean, FStrike );
+        PROPERTY( T_keyword, FPosition );
+        PROPERTY( T_boolean, FPairKern );
+        PROPERTY( T_keyword, FCase );
+
+        // kerning information
+        PROPERTY( T_percentage, FDX );
+        PROPERTY( T_percentage, FDY );
+        PROPERTY( T_percentage, FDW );
+
+        void setDSSSLDefaults() {
+        
+            setFFamily( sTimesNewRoman );
+            setFAngle( sRegular );
+            setFWeight( sRegular );
+            setFVar( sRegular );
+            setFSize( 10000 );
+            setFColor( sBlack ),
+            setFUnderlining( sFNoUnderlining );
+            setFOverline( false );
+            setFStrike( false );
+            setFPosition( sFNormal );
+            setFPairKern( false );
+            setFCase( sFAsTyped );
+            setFDX( 0 );
+            setFDY( 0 );
+            setFDW( 0 );
+        }
+
+        enum FontStatement { stPgfFont, stFont };
+
+        unsigned compare( FontFormat &f );
+        void setFrom( FontFormat &f, unsigned properties );
+        void out( MifOutputByteStream &os, unsigned properties, FontStatement fontStatement );
+        void ffOut( MifOutputByteStream &os, unsigned properties, FontStatement fontStatement )
+              { out( os, properties, fontStatement ); }
+        void out( MifOutputByteStream &os, FontStatement fontStatement )
+            { out( os, setProperties, fontStatement ); }
+        void ffOut( MifOutputByteStream &os, FontStatement fontStatement )
+            { out( os, fontStatement ); }
+        void updateFrom( FontFormat & );
+        void ffUpdateFrom( FontFormat &f ) { updateFrom( f ); }
+        void clearSetProperties() { setProperties = 0; }
+    };
+
+    static const String<char> sNONE;
+
+    // paragraph formats
+    static const String<char> sDefaultPgfFormat;
+    static const String<char> sHeader;
+    static const String<char> sFooter;
+
+    // PgfAlignment
+    static const String<char> sLeftRight;
+    static const String<char> sLeft;
+    static const String<char> sRight;
+    static const String<char> sCenter;
+
+    // PgfLineSpacing
+    static const String<char> sFixed;
+    static const String<char> sProportional;
+
+    // PgfCellAlignment
+    static const String<char> sTop;
+    static const String<char> sMiddle;
+    static const String<char> sBottom;
+
+    // PgfPlacement
+    static const String<char> sAnywhere;
+    static const String<char> sColumnTop;
+    static const String<char> sPageTop;
+    static const String<char> sLPageTop;
+    static const String<char> sRPageTop;
+
+    // PgfPlacementStyle
+    static const String<char> sNormal;
+    static const String<char> sStraddle;
+
+    // PgfLanguage
+    static const String<char> sNoLanguage;
+    static const String<char> sUSEnglish;
+    static const String<char> sUKEnglish;
+    static const String<char> sGerman;
+    static const String<char> sSwissGerman;
+    static const String<char> sFrench;
+    static const String<char> sCanadianFrench;
+    static const String<char> sSpanish;
+    static const String<char> sCatalan;
+    static const String<char> sItalian;
+    static const String<char> sPortuguese;
+    static const String<char> sBrazilian;
+    static const String<char> sDanish;
+    static const String<char> sDutch;
+    static const String<char> sNorwegian;
+    static const String<char> sNynorsk;
+    static const String<char> sFinnish;
+    static const String<char> sSwedish;
+
+
+    // TStype
+    // sLeft;
+    // sRight;
+    // sCenter;
+    static const String<char> sDecimal;
+
+    // TSLeaderStr;
+    static const String<char> sSPACE;
+
+    struct TabStop {
+
+        enum { fNone = 0, fTSX = 0x1, fTSType = 0x2, fTSLeaderStr = 0x4,
+               fTSDecimalChar = 0x8, fAll = 0xF };
+        unsigned setProperties;
+
+        TabStop( T_keyword type = sLeft, T_dimension x = 0, T_string tSLeaderStr = sSPACE )
+         : TSX( x ), TSType( type ), setProperties( fTSType | fTSX )
+          { setTSLeaderStr( tSLeaderStr ); }
+
+        PROPERTY( T_dimension, TSX );
+        PROPERTY( T_keyword, TSType );
+        PROPERTY( T_string, TSLeaderStr );
+        PROPERTY( T_integer, TSDecimalChar );
+
+        void out( MifOutputByteStream &os );
+    };
+
+    struct ParagraphFormat : public FontFormat {
+    
+               enum { fNone = 0, fPgfFIndent = 0x1, fPgfLIndent = 0x2, fPgfRIndent = 0x4,
+               fPgfAlignment = 0x8, fPgfSpBefore = 0x10, fPgfSpAfter = 0x20,
+               fPgfLineSpacing = 0x40, fPgfLeading = 0x80, fPgfWithPrev = 0x100,
+               fPgfWithNext = 0x200, fPgfBlockSize = 0x400, fPgfAutoNum = 0x800,
+               fPgfNumFormat = 0x1000, fPgfNumberFont = 0x2000, fPgfHyphenate = 0x4000,
+               fHyphenMaxLines = 0x8000, fHyphenMinPrefix = 0x10000,
+               fHyphenMinSuffix = 0x20000, fHyphenMinWord = 0x40000,
+               fPgfLetterSpace = 0x80000, fPgfLanguage = 0x100000,
+               fPgfCellAlignment = 0x200000, fPgfCellMargins = 0x400000,
+               fPgfCellLMarginFixed = 0x800000, fPgfCellTMarginFixed = 0x1000000,
+               fPgfCellRMarginFixed = 0x2000000,  fPgfCellBMarginFixed = 0x4000000,
+               fPgfTag = 0x8000000, fTabStops = 0x10000000, fPgfPlacement = 0x20000000,
+               fPgfNumTabs = 0x40000000, fPgfPlacementStyle = 0x80000000,
+               fAll = 0xFFFFFFFF };
+        unsigned setProperties;
+
+        ParagraphFormat() : setProperties( 0 ) {}
+
+        // basic properties
+        PROPERTY( T_tagstring, PgfTag );
+        PROPERTY( T_dimension, PgfFIndent );
+        PROPERTY( T_dimension, PgfLIndent );
+        PROPERTY( T_dimension, PgfRIndent );
+        PROPERTY( T_keyword, PgfAlignment );
+        PROPERTY( T_dimension, PgfSpBefore );
+        PROPERTY( T_dimension, PgfSpAfter );
+        PROPERTY( T_keyword, PgfLineSpacing );
+        PROPERTY( T_dimension, PgfLeading );
+        PROPERTY( T_integer, PgfNumTabs );
+        Vector<TabStop> TabStops;
+
+        // default font properties
+
+        // pagination properties
+        PROPERTY( T_keyword, PgfPlacement );
+        PROPERTY( T_keyword, PgfPlacementStyle );
+        PROPERTY( T_boolean, PgfWithPrev );
+        PROPERTY( T_boolean, PgfWithNext );
+        PROPERTY( T_integer, PgfBlockSize );
+
+        // numbering properties
+        PROPERTY( T_boolean, PgfAutoNum );
+        PROPERTY( T_string, PgfNumFormat );
+        PROPERTY( T_tagstring, PgfNumberFont );
+
+        // advanced properties
+        PROPERTY( T_boolean, PgfHyphenate );
+        PROPERTY( T_integer, HyphenMaxLines );
+        PROPERTY( T_integer, HyphenMinPrefix );
+        PROPERTY( T_integer, HyphenMinSuffix );
+        PROPERTY( T_integer, HyphenMinWord );
+        PROPERTY( T_boolean, PgfLetterSpace );
+        PROPERTY( T_keyword, PgfLanguage );
+            
+        // table cell properties
+        PROPERTY( T_keyword, PgfCellAlignment );
+        PROPERTY( T_LTRB, PgfCellMargins );
+        PROPERTY( T_boolean, PgfCellLMarginFixed );
+        PROPERTY( T_boolean, PgfCellTMarginFixed );
+        PROPERTY( T_boolean, PgfCellRMarginFixed );
+        PROPERTY( T_boolean, PgfCellBMarginFixed );
+
+        // miscellaneous properties
+        // none
+
+        void setDSSSLDefaults() {
+        
+            FontFormat::setDSSSLDefaults();
+            setPgfFIndent( 0 );
+            setPgfLIndent( 0 );
+            setPgfRIndent( 0 );
+            setPgfAlignment( sLeft );
+            setPgfSpBefore( 0 );
+            setPgfSpAfter( 0 );
+            setPgfLineSpacing( sFixed );
+            setPgfLeading( 0 );
+            setPgfNumTabs( 0 );
+            setPgfWithPrev( false );
+            setPgfWithNext( false );
+            setPgfBlockSize( 2 );
+            setPgfAutoNum( false );
+            // setPgfNumFormat( sNONE );
+            // setPgfNumberFont( sNONE );
+            setPgfHyphenate( false );
+            setHyphenMaxLines( 999 );
+            setHyphenMinPrefix( 2 );
+            setHyphenMinSuffix( 2 );
+            setHyphenMinWord( 2 );
+            setPgfLetterSpace( false );
+            setPgfLanguage( sNoLanguage );
+            setPgfCellAlignment( sTop );
+            setPgfCellMargins( T_LTRB( 0, 0, 0, 0 ) );
+            setPgfCellLMarginFixed( true );
+            setPgfCellTMarginFixed( true );
+            setPgfCellRMarginFixed( true );
+            setPgfCellBMarginFixed( true );
+            // setPgfTag( sNONE );
+            setPgfPlacement( sAnywhere );
+            setPgfPlacementStyle( sNormal );
+        }
+
+        void forceSetProperties( unsigned properties, unsigned fontProperties )
+            { setProperties = properties; FontFormat::setProperties = fontProperties; }
+        unsigned &ffSetProperties() { return FontFormat::setProperties; }
+        unsigned compare( ParagraphFormat & );
+        void setFrom( ParagraphFormat &, unsigned, unsigned );
+        void out( MifOutputByteStream &os, unsigned, unsigned,
+                  bool excludeCellProperties = true );
+        void out( MifOutputByteStream &os, bool excludeCellProperties = true )
+            { out( os, setProperties, (unsigned)FontFormat::setProperties,
+                   excludeCellProperties ); }
+        void updateFrom( ParagraphFormat & );
+        void clearSetProperties() { setProperties = 0; FontFormat::clearSetProperties(); }
+    };
+
+    // DPageNumStyle
+    static const String<char> sArabic;
+    static const String<char> sUCRoman;
+    static const String<char> sLCRoman;
+    static const String<char> sUCAlpha;
+    static const String<char> sLCAlpha;
+
+    // DParity
+    static const String<char> sFirstLeft;
+    static const String<char> sFirstRight;
+
+    struct Document {
+
+        enum { fNone = 0, fDPageSize = 0x1, fDStartPage = 0x2, fDPageNumStyle = 0x4,
+               fDTwoSides = 0x8, fDParity = 0x10, fDMargins = 0x20, fDColumns = 0x40,
+               fDColumnGap = 0x80, fAll = 0xFF };
+        unsigned setProperties;
+
+        Document() : setProperties( fNone ) {}
+
+        // column properties
+        PROPERTY( T_LTRB, DMargins );
+        PROPERTY( T_integer, DColumns );
+        PROPERTY( T_dimension, DColumnGap );
+        PROPERTY( T_WH, DPageSize );
+
+        // pagination
+        PROPERTY( T_integer, DStartPage );
+        PROPERTY( T_keyword, DPageNumStyle );
+        PROPERTY( T_boolean, DTwoSides );
+        PROPERTY( T_keyword, DParity );
+
+        void out( MifOutputByteStream &os );
+    };
+
+    struct Object {
+
+        enum { fNone = 0, fID = 0x1, fPen = 0x2, fFill = 0x4, fPenWidth = 0x8,
+               fObjectNext = 0x10, fObColor = 0x20 };
+        unsigned setProperties;
+
+        Object( T_integer pen = 15, T_integer fill = 15, T_dimension penWidth = 0,
+                const T_tagstring &obColor = sBlack )
+         : setProperties( 0 )
+         { setID( ++IDCnt );
+           setPen( pen ); setFill( fill ); setPenWidth( penWidth ); setObColor( obColor ); }
+
+        static T_ID IDCnt;
+        PROPERTY( T_integer, ID );
+        PROPERTY( T_integer, Pen );
+        PROPERTY( T_integer, Fill );
+        PROPERTY( T_dimension, PenWidth );
+        PROPERTY( T_tagstring, ObColor );
+
+        void outObjectProperties( MifOutputByteStream &os );
+        virtual void out( MifOutputByteStream &os ) = 0;
+    };
+
+    // HeadCap/TailCap
+    static const String<char> sButt;
+    static const String<char> sRound;
+    static const String<char> sSquare;
+    
+    struct PolyLine : public Object {
+
+        enum { fHeadCap = fObjectNext << 1, fTailCap = fHeadCap << 1 };
+
+        PolyLine( T_keyword cap, T_integer pen = 15, T_integer fill = 15,
+                  T_dimension penWidth = 0,
+                  const T_tagstring &obColor = sBlack )
+         : Object( pen, fill, penWidth, obColor ) { setHeadCap( cap ); setTailCap( cap ); }
+
+        PROPERTY( T_keyword, HeadCap );
+        PROPERTY( T_keyword, TailCap );
+        Vector<T_XY> Points;
+
+        void out( MifOutputByteStream &os );
+    };
+    
+    struct ImportObject : public Object {
+
+        enum { fImportObFileDI = fObjectNext << 1, fBitMapDpi = fImportObFileDI << 1,
+               fShapeRect = fBitMapDpi << 1, fImportObFixedSize = fShapeRect << 1,
+               fNativeOrigin = fImportObFixedSize << 1 };
+
+        ImportObject( T_pathname importObFileDI, T_LTWH shapeRect,
+                      T_boolean importObFixedSize = true, T_integer bitMapDpi = 72 ) : Object()
+         { setImportObFileDI( importObFileDI ); setShapeRect( shapeRect );
+           setImportObFixedSize( importObFixedSize ); setBitMapDpi( bitMapDpi ); }
+
+        PROPERTY( T_pathname, ImportObFileDI );
+        PROPERTY( T_integer, BitMapDpi );
+        PROPERTY( T_LTWH, ShapeRect );
+        PROPERTY( T_boolean, ImportObFixedSize );
+        PROPERTY( T_XY, NativeOrigin );
+
+        void out( MifOutputByteStream &os );
+    };
+
+    // FrameType
+    static const String<char> sInline;
+    static const String<char> sRunIntoParagraph;
+    static const String<char> sBelow;
+
+    // AnchorAlign
+    // Left
+    // Center
+    // Right
+    // Inside
+    // Outside
+
+    struct Frame : public Object {
+
+        enum { fShapeRect = fObjectNext << 1, fFrameType = fShapeRect << 1, 
+               fNSOffset = fFrameType << 1, fBLOffset = fNSOffset << 1, 
+               fAnchorAlign = fBLOffset << 1 };
+
+        Frame() : Object() {}
+
+        PROPERTY( T_LTWH, ShapeRect );
+        PROPERTY( T_keyword, FrameType );
+        PROPERTY( T_dimension, NSOffset );
+        PROPERTY( T_dimension, BLOffset );
+        PROPERTY( T_keyword, AnchorAlign );
+        Vector<Object*> Objects;
+
+        void out( MifOutputByteStream &os );
+    };
+
+    struct TextRect : public Object {
+
+        enum { fID = fObjectNext << 1, fShapeRect = fID << 1, fTRNumColumns = fShapeRect << 1,
+               fTRColumnGap = fTRNumColumns << 1, fTRColumnBalance = fTRColumnGap << 1  };
+
+        TextRect() : Object()  {}
+        TextRect( T_LTWH shapeRect, T_integer tRNumColumns = 1, T_dimension tRColumnGap = 0,
+                  bool tRColumnBalance = false )
+         : Object() { setShapeRect( shapeRect ); setTRNumColumns( tRNumColumns );
+                      setTRColumnGap( tRColumnGap ); setTRColumnBalance( tRColumnBalance ); }
+
+        PROPERTY( T_LTWH, ShapeRect );
+        PROPERTY( T_integer, TRNumColumns );
+        PROPERTY( T_dimension, TRColumnGap );
+        PROPERTY( T_boolean, TRColumnBalance );
+
+        void out( MifOutputByteStream &os );
+    };
+
+    // PageType
+    static const String<char> sLeftMasterPage;
+    static const String<char> sRightMasterPage;
+    static const String<char> sOtherMasterPage;
+    static const String<char> sBodyPage;
+
+    // PageTag
+    static const String<char> sFirst;
+    // sLeft
+    // sRight
+
+    struct Page {
+
+        enum { fNone = 0, fPageType = 0x1, fPageTag = 0x2, fPageBackground = 0x4 };
+        unsigned setProperties;
+
+        Page( T_keyword pageType, T_tagstring pageTag = sNONE,
+              T_tagstring pageBackground = sNONE )
+         : PageType( pageType ), PageTag( pageTag ), PageBackground( pageBackground ),
+           setProperties( fPageType | fPageTag )
+         { if( PageTag != sNONE ) setProperties |= fPageTag;
+           if( PageBackground != sNONE ) setProperties |= fPageBackground; }
+        Page() : PageType( MifDoc::sRightMasterPage ), setProperties( fPageType ) {}
+
+        PROPERTY( T_keyword, PageType );
+        PROPERTY( T_tagstring, PageTag );
+        PROPERTY( T_tagstring, PageBackground ); // keyword in MIF
+        Vector<TextRect> TextRects;
+
+        void out( MifOutputByteStream &os );
+    };
+
+    struct TagStream {
+
+        enum TagStreamClass2 { tsTagStream, tsTextFlow, tsCell, tsPara } TagStreamClass;
+
+        TagStream( T_indent osIndent = 2 );
+        ~TagStream();
+
+        T_tagstring InitialPgfTag;
+        bool PgfTagUsed;
+
+        ParagraphFormat &format() { return Format; }
+        MifTmpOutputByteStream &content() { assert( Content != NULL ); return *Content; }
+        void setParagraphFormat( ParagraphFormat &pf ) { Format = pf; }
+
+      protected:
+        MifTmpOutputByteStream *Content;               
+        ParagraphFormat Format;
+    };
+
+    struct TextFlow : public TagStream {
+
+        enum { fNone = 0, fTFTag = 0x1, fTFAutoConnect = 0x02 };
+        unsigned setProperties;
+
+        TextFlow() : setProperties( fNone ), TextRectIDUsed( false )
+         { TagStreamClass = tsTextFlow; }
+        TextFlow( const TextRect &textRect, bool body,
+                  ParagraphFormat *format = NULL, T_tagstring pgfTag = sNONE );
+
+        T_ID TextRectID; // for ParaLine (not in MIF)
+        bool TextRectIDUsed;
+        PROPERTY( T_tagstring, TFTag );
+        PROPERTY( T_boolean, TFAutoConnect );
+
+        const TextRect *textRect() { assert( TextRect_ != NULL ); return TextRect_; }
+        void out( MifOutputByteStream &os, bool resolveCrossReferences = false );
+
+      protected:
+        const TextRect *TextRect_;
+    };
+
+    struct Para : public TagStream {
+
+        enum { fNone = 0, fPgfTag = 0x1, fParagraphFormat = 0x2 };
+        unsigned setProperties;
+
+        Para( T_indent osIndent = 2 )
+         : TagStream( osIndent ), setProperties( fParagraphFormat ), leaderTabsSet( false )
+          { TagStreamClass = tsPara; }
+
+        static bool currentlyOpened;
+        bool leaderTabsSet;
+        PROPERTY( T_tagstring, PgfTag );
+
+        ParagraphFormat &curFormat() { return CurFormat; }
+
+        void out( MifOutputByteStream &os );
+        void outProlog( MifOutputByteStream &os );
+
+        static void outSimpleProlog( MifOutputByteStream &os );
+        static void outEpilog( MifOutputByteStream &os );
+
+      protected:
+        ParagraphFormat CurFormat;
+
+    };
+
+    struct ParaLine {
+
+        enum { fNone = 0, fTextRectID = 0x1, fATbl = 0x2 };
+        static unsigned setProperties;
+
+        STATIC_PROPERTY( T_ID, TextRectID );
+        STATIC_PROPERTY( T_ID, ATbl );
+
+        static void outProlog( MifOutputByteStream &os );
+        static void outEpilog( MifOutputByteStream &os );
+    };
+
+    struct PgfCatalog {
+
+        Vector<ParagraphFormat> ParaFormats;
+        void out( MifOutputByteStream &os );
+    };
+
+    struct Color {
+
+        enum { fColorTag = 0x1, fColorCyan = 0x2, fColorMagenta = 0x4, fColorYellow = 0x8,
+               fColorBlack = 0x10 };
+        unsigned setProperties;
+
+        Color() : setProperties( 0 ) {}
+        Color( unsigned char red, unsigned char green, unsigned char blue );
+  
+        PROPERTY( T_tagstring, ColorTag );
+        PROPERTY( T_percentage, ColorCyan );
+        PROPERTY( T_percentage, ColorMagenta );
+        PROPERTY( T_percentage, ColorYellow );
+        PROPERTY( T_percentage, ColorBlack );
+
+        static const String<char> &key( Color &color );
+        void out( MifOutputByteStream &os ) const;
+    };
+
+    struct ColorCatalog {
+
+        PointerTable<Color*,String<char>,StringHash,Color> Colors;
+        void out( MifOutputByteStream &os );
+    };
+
+    // TblAlignment
+    // Left
+    // Center
+    // Right
+    static const String<char> sInside;
+    static const String<char> sOutside;
+
+    struct Ruling {
+
+        enum { fNone = 0, fRulingTag = 0x1, fRulingPenWidth = 0x2, fRulingGap = 0x4,
+               fRulingPen = 0x8, fRulingLines = 0x10, fRulingColor = 0x20 };
+        unsigned setProperties;
+
+        Ruling() : setProperties( 0 ), RulingPenWidth( 1000 ), RulingGap( 1000 ),
+                   RulingPen( 0 ), RulingLines( 1 ) {};
+        Ruling( T_tagstring RulingTag_ ) 
+         : setProperties( 0 ), RulingPenWidth( 1000 ), RulingGap( 1000 ),
+           RulingPen( 0 ), RulingLines( 1 )
+        { setRulingTag( RulingTag_ ); }
+
+        PROPERTY( T_tagstring, RulingTag );
+        PROPERTY( T_dimension, RulingPenWidth );
+        PROPERTY( T_dimension, RulingGap );
+        PROPERTY( T_tagstring, RulingColor );
+        PROPERTY( T_integer, RulingPen );
+        PROPERTY( T_integer, RulingLines );
+
+        static const String<char> &key( Ruling & );
+        void out( MifOutputByteStream &os ) const;
+        String<char> Key;        
+      
+    };
+
+    struct RulingCatalog {
+
+        PointerTable<Ruling*,String<char>,StringHash,Ruling> Rulings;
+        void out( MifOutputByteStream &os );
+    };
+
+    struct Cell : public TagStream {
+
+        enum { fNone = 0, fCellLRuling = 0x1, fCellBRuling = 0x2, fCellRRuling = 0x4,
+               fCellTRuling = 0x8, fCellColumns = 0x10, fCellRows = 0x20,
+               fCellFill = 0x40, fCellColor = 0x80 };
+        unsigned setProperties;
+
+        Cell( T_indent osIndent = 12 )
+         : TagStream( osIndent ), setProperties( 0 ) { TagStreamClass = tsCell; }
+
+        PROPERTY( T_integer, CellFill );
+        PROPERTY( T_tagstring, CellColor );
+        PROPERTY( T_tagstring, CellLRuling );
+        PROPERTY( T_tagstring, CellBRuling );
+        PROPERTY( T_tagstring, CellRRuling );
+        PROPERTY( T_tagstring, CellTRuling );
+        PROPERTY( T_integer, CellColumns );
+        PROPERTY( T_integer, CellRows );
+
+        void out( MifOutputByteStream &os, bool resolveCrossReferences = false );
+    };
+
+    struct Row {
+
+        Vector<Cell> Cells;
+
+        void out( MifOutputByteStream &os, bool resolveCrossReferences = false );
+    };
+
+    struct TblColumn {
+
+        enum { fNone = 0, fTblColumnNum = 0x1, fTblColumnWidth = 0x2 };
+        unsigned setProperties;
+
+        TblColumn() : setProperties( 0 ), TblColumnNum( 0 ), TblColumnWidth( 0 ) {};
+        TblColumn( T_integer TblColumnNum_, T_dimension TblColumnWidth_ )
+         : setProperties( 0 )
+         { setTblColumnNum( TblColumnNum_ ); setTblColumnWidth( TblColumnWidth_ ); }
+
+        PROPERTY( T_integer, TblColumnNum );
+        PROPERTY( T_dimension, TblColumnWidth );
+
+        void out( MifOutputByteStream &os );
+    };
+
+    // TblTitlePlacement
+    static const String<char> sNone;
+
+    struct TblFormat {
+
+        enum { fNone = 0, fTblTag = 0x1, fTblLIndent = 0x2, fTblRIndent = 0x4,
+               fTblSpBefore = 0x8, fTblSpAfter = 0x10, fTblAlignment = 0x20,
+               fTblCellMargins = 0x40, fTblWidth = 0x80, fTblTitlePlacement = 0x100,
+               fAll = 0x1ff };
+        unsigned setProperties;
+
+        TblFormat() : setProperties( 0 ) {}
+        TblFormat( T_tagstring TblTag_ ) : setProperties( 0 ) { setTblTag( TblTag_ ); }
+
+        void setDSSSLDefaults() {
+        
+            setTblLIndent( 0 );
+            setTblRIndent( 0 );
+            setTblSpBefore( 0 );
+            setTblSpAfter( 0 );
+            setTblAlignment( sLeft );
+            setTblCellMargins( T_LTRB( 0, 0, 0, 0 ) );
+            setTblTitlePlacement( sNone );
+        }
+
+        // basic properties
+        PROPERTY( T_tagstring, TblTag );
+        PROPERTY( T_dimension, TblLIndent );
+        PROPERTY( T_dimension, TblRIndent );
+        PROPERTY( T_dimension, TblSpBefore );
+        PROPERTY( T_dimension, TblSpAfter );
+        PROPERTY( T_keyword, TblAlignment );
+        PROPERTY( T_LTRB, TblCellMargins );
+        PROPERTY( T_keyword, TblTitlePlacement );
+
+        // column properties
+        PROPERTY( T_dimension, TblWidth );
+        Vector<TblColumn> TblColumns;
+
+        void out( MifOutputByteStream &os );
+    };
+
+    struct TblCatalog {
+
+        Vector<TblFormat> TblFormats;
+        void out( MifOutputByteStream &os );
+    };
+
+    // TblTag
+    static const String<char> sDefaultTblFormat;
+
+    struct Tbl {
+
+        enum { fNone = 0, fTblID = 0x1, fTblTag = 0x2, fTblNumColumns = 0x4,
+               fTblColumnWidths = 0x8, fTblFormat = 0x10 };
+        unsigned setProperties;
+
+        Tbl() : setProperties( 0 ), TblIDUsed( false )
+          { setTblID( MifDoc::CurInstance->nextID() ); setTblTag( MifDoc::sDefaultTblFormat ); }
+
+        PROPERTY( T_ID, TblID );
+        PROPERTY( T_tagstring, TblTag );
+        bool TblIDUsed;
+        TblFormat tblFormat;
+
+        // table columns
+        PROPERTY( T_integer, TblNumColumns );
+        VECTOR_OF_PROPERTIES( T_dimension, TblColumnWidth );
+
+        // table rows
+        Vector<Row> TblH;
+        Vector<Row> TblBody;
+        Vector<Row> TblF;
+
+        void out( MifOutputByteStream &os, bool resolveCrossReferences = false );
+    };
+
+    // paragraph formats
+    static const String<char> sPageNumXRefFormatName;
+
+    struct XRefFormat {
+
+        enum { fXRefName = 0x1, fXRefDef = 0x2 };
+        unsigned setProperties;
+
+        XRefFormat() {}
+        XRefFormat( T_string XRefName_, T_string XRefDef_ )
+         { setXRefName( XRefName_ ); setXRefDef( XRefDef_ ); }
+
+        PROPERTY( T_string, XRefName );
+        PROPERTY( T_string, XRefDef );
+
+        void out( MifOutputByteStream &os );
+    };
+
+    static char escapeChar() { return '\x0'; }
+
+    struct CrossRefInfo {
+
+        enum InfoType { PotentialMarker, XRef, HypertextLink } Type;
+        CrossRefInfo() {}
+        CrossRefInfo
+         ( unsigned long groveIndex_, unsigned long elementIndex_, int tagIndent_,
+           InfoType type_, const Char *id, size_t idLen )
+          : groveIndex( groveIndex_ ), elementIndex( elementIndex_ ), tagIndent( tagIndent_ ),
+            Type( type_ ) { if( id != NULL && idLen > 0 ) sgmlId.assign( id, idLen ); }
+        InfoType type() { return Type; }
+        void out( MifOutputByteStream &os );
+        T_string crossRefText() const;
+        
+        unsigned long groveIndex;
+        unsigned long elementIndex;
+        int tagIndent;
+        StringC sgmlId;
+    };
+
+    struct XRef {
+
+        enum { fXRefName = 0x1, fXRefSrcFile = 0x2, fXRefText = 0x4, fXRefSrcText };
+        unsigned setProperties;
+
+        XRef() {}
+        XRef( CrossRefInfo &crossRefInfo );
+        XRef( T_tagstring XRefName_, T_string XRefSrcText_, T_string XRefText_,
+              T_pathname XRefSrcFile_ )
+         { setXRefName( XRefName_ ); setXRefSrcText( XRefSrcText_ ); setXRefText( XRefText_ );
+           setXRefSrcFile( XRefSrcFile_ ); }
+
+        PROPERTY( T_tagstring, XRefName );
+        PROPERTY( T_string, XRefSrcText );
+        PROPERTY( T_pathname, XRefSrcFile );
+        PROPERTY( T_string, XRefText );
+
+        void out( MifOutputByteStream &os );
+    };
+
+    struct Marker {
+
+        enum Type { XRef = 9, Index = 2, Hypertext = 8, HypertextLink = 100,
+                    HypertextDestination = 101 };
+        enum { fMType = 0x1, fMText = 0x2 };
+        unsigned setProperties;
+
+        Marker() {}
+        Marker( CrossRefInfo &crossRefInfo, bool linkDestinationMode = false );
+        Marker( T_string MText_, Type MType_ = XRef )
+         { setMText( MText_ ); setMType( T_integer( MType_ ) ); }
+
+        PROPERTY( T_integer, MType );
+        PROPERTY( T_string, MText );
+
+        void out( MifOutputByteStream &os );
+    };
+
+    struct BookComponent {
+    
+        BookComponent() : epilogOs( NULL ), pageNumXRefFormatGenerated( false ) {}
+        BookComponent( MifTmpOutputByteStream *epilogOs );
+        void commit( const String<CmdLineApp::AppChar> &dirName,
+                     bool resolveCrossReferences = true );
+        
+        String<CmdLineApp::AppChar> FileName;
+        Vector<XRefFormat> XRefFormats;
+        Document document;
+        ColorCatalog colorCatalog;
+        PgfCatalog pgfCatalog;
+        TblCatalog tblCatalog;
+        Vector<Frame> AFrames;
+        Vector<Tbl> Tbls;
+        Vector<Page> Pages;
+        Vector<TextFlow> TextFlows;
+        RulingCatalog rulingCatalog;
+
+        bool pageNumXRefFormatGenerated;
+
+        MifTmpOutputByteStream *epilogOs;             
+    };
+
+    struct ElementSet {
+
+        enum ReferenceType
+         { AnyReference = 0xC000, LinkReference = 0x8000, PageReference = 0x4000 };
+        static unsigned short LINK_TYPE_MASK( ReferenceType refType )
+         { return (unsigned short)( refType ); }
+        static const unsigned short BOOK_COMPONENT_INDEX_M() { return 0x3FFF; }
+        ElementSet();
+
+        struct SgmlIdInfo {
+            SgmlIdInfo( const StringC &sgmlId_, unsigned long groveIndex_ )
+             : sgmlId( sgmlId_ ), groveIndex( groveIndex_ ), flags( 0 ) {}
+            StringC sgmlId;
+            unsigned short flags;
+            unsigned long groveIndex;
+            static const StringC &key( SgmlIdInfo &sgmlIdInfo)
+             { return sgmlIdInfo.sgmlId; }
+        };
+
+        SgmlIdInfo &enforceSgmlId( const StringC &sgmlId, unsigned long groveIndex );
+        void setReferencedFlag( ReferenceType, unsigned long groveIndex, unsigned long n );
+        void setReferencedFlag( ReferenceType, unsigned long groveIndex, const StringC &sgmlId );
+        void setBookComponentIndex( unsigned long groveIndex, unsigned long n, int i );
+        void setBookComponentIndex( unsigned long groveIndex, const StringC &sgmlId, int i );
+        bool hasBeenReferenced( ReferenceType, unsigned long groveIndex, unsigned long n ) const;
+        bool hasBeenReferenced( ReferenceType, unsigned long groveIndex, const StringC &sgmlId );
+        int bookComponentIndex( unsigned long groveIndex, unsigned long n ) const;
+        int bookComponentIndex( unsigned long groveIndex, const StringC &sgmlId );
+
+      private:
+        PointerTable<SgmlIdInfo*,StringC,Hash,SgmlIdInfo> SgmlIdInfos;
+        void add( unsigned long groveIndex, unsigned long n, unsigned short flags );
+        bool getFlags( unsigned long groveIndex, unsigned long n, unsigned short &result ) const;
+        Vector<Vector<unsigned short> > Flags;
+    };
+
+    void commit();
+
+    void outTagEnd();
+
+    void outHexChar( unsigned code, MifOutputByteStream *o = NULL );
+    void outHexChar( unsigned code, String<char> &targetString );
+    void outSpecialChar( const String<char> &charName, MifOutputByteStream *o = NULL ); 
+    void beginParaLine();
+    void endParaLine();
+    void outPageNumber();
+    void outBreakingPara( T_keyword pgfPlacement );
+    void outAFrame( T_ID ID, MifOutputByteStream &os );
+
+    Vector<BookComponent> &bookComponents() { return BookComponents; };
+    BookComponent &bookComponent()
+     { assert( bookComponents().size() > 0 ); return bookComponents().back(); }
+
+    void setCurOs( MifOutputByteStream &os ) { curOs = &os; } 
+    MifOutputByteStream &os() { assert( curOs != NULL ); return *curOs; }
+
+    void setCurTextFlow( TextFlow *tf ) { CurTextFlow = tf; } 
+    TextFlow *curTextFlow() { return CurTextFlow; }
+
+    void setCurCell( Cell *c ) { CurCell = c; } 
+    Cell *curCell() { return CurCell; }
+
+    void setCurTblNum( size_t n ) { CurTblNum = n; } 
+    Tbl *curTbl( bool assertNotNull = true )
+     { if( assertNotNull ) assert( CurTblNum > 0 );
+       return CurTblNum > 0 ? &bookComponent().Tbls[CurTblNum-1] : (Tbl *)NULL; }
+
+    void setCurPara( Para *p ) {  CurPara = p; } 
+    Para *curPara( bool assertNotNull = true )
+     { if( assertNotNull ) assert( CurPara != NULL ); return CurPara; }
+
+    void setCurParagraphFormat( ParagraphFormat &pf ) { CurFormat = pf; } 
+    ParagraphFormat &curFormat() { return CurFormat; }
+
+    TagStream &curTagStream()
+      { assert( TagStreamStack.size() > 0 ); return *TagStreamStack.back(); }
+
+    void enterTextFlow( TextFlow &textFlow  ) { enterTagStream( textFlow ); }
+    void exitTextFlow() { setCurTextFlow( NULL ); exitTagStream(); }
+
+    void enterTableCell( Cell &cell ) { enterTagStream( cell ); }
+    void exitTableCell() { setCurCell( NULL ); exitTagStream(); }
+
+    void enterPara( Para &p ) { enterTagStream( p ); }
+    void exitPara() { setCurPara( NULL ); exitTagStream(); }
+
+    void enterBookComponent();
+    void exitBookComponent();
+    void enterTagStream( TagStream &tagStream );
+    void exitTagStream();
+    T_ID nextID() { return ++NextID; }
+
+    Document &document() { return bookComponent().document; }
+    PgfCatalog &pgfCatalog() { return bookComponent().pgfCatalog; }
+    TblCatalog &tblCatalog() { return bookComponent().tblCatalog; }
+    RulingCatalog &rulingCatalog() { return bookComponent().rulingCatalog; }
+    ColorCatalog &colorCatalog() { return bookComponent().colorCatalog; }
+    Vector<Tbl> &tbls() { return bookComponent().Tbls; }
+    Vector<Page> &pages() { return bookComponent().Pages; }
+    Vector<TextFlow> &textFlows() { return bookComponent().TextFlows; }
+    Vector<Frame> &aFrames() { return bookComponent().AFrames; }
+    ElementSet &elements() { return Elements; }
+    Vector<CrossRefInfo> &crossRefInfos() { return CrossRefInfos; }
+
+    const String<CmdLineApp::AppChar> &rootOutputFileLoc() { return RootOutputFileLoc; }
+
+    CmdLineApp *App;
+
+  protected:
+
+    Vector<CrossRefInfo> CrossRefInfos;
+    ElementSet Elements;
+    void switchToTagStream( TagStream &tagStream, bool startWithDefaultPgfFormat = true );
+
+    String<CmdLineApp::AppChar> RootOutputFileLoc;
+    T_ID NextID;
+
+    MifOutputByteStream *curOs;    
+
+    Vector<BookComponent> BookComponents;
+
+    size_t CurTblNum;
+    ParagraphFormat CurFormat;
+    TextFlow *CurTextFlow;
+    Cell *CurCell;
+    Para *CurPara;
+
+    Vector<TagStream*> TagStreamStack;
+};
+
+class MifOutputByteStream {
+
+    OutputByteStream *os;
+
+  public:
+    
+    int CurTagIndent;
+    static MifDoc::T_indent INDENT;
+
+    void indent() { CurTagIndent += 2; }
+    void undent() { CurTagIndent -= 2; assert( CurTagIndent >= 0 ); }
+    MifOutputByteStream( MifDoc::T_indent i = 0 )
+     : os( NULL ), CurTagIndent( i ) {};
+    MifOutputByteStream( OutputByteStream &os, MifDoc::T_indent i = 0 )
+     : os( &os ), CurTagIndent( i ) {};
+    void setStream( OutputByteStream &s ) { os = &s; }
+    OutputByteStream &stream() { assert( os != NULL ); return *os; }
+    MifOutputByteStream &operator<<( unsigned n ) { stream() << n; return *this; }
+    MifOutputByteStream &operator<<( long n ) { stream() << n; return *this; }
+    MifOutputByteStream &operator<<( char c ) { stream() << c; return *this; }
+    MifOutputByteStream &operator<<( const char *s ) { stream() << s; return *this; }
+#ifdef SP_WIDE_SYSTEM
+    MifOutputByteStream &operator<<( const String<CmdLineApp::AppChar> &s )
+     { for( size_t i = 0; i < s.size(); i++ ) stream() << char( s[i] ); return *this; }
+#endif
+    MifOutputByteStream &operator<<( const String<char> &s ) { stream() << s; return *this; }
+    MifOutputByteStream &operator<<( const MifDoc::T_string &s )
+     { stream() << '`'; stream() << s; stream() << '\''; return *this; }
+    MifOutputByteStream &operator<<( const MifDoc::T_percentage &p ) {
+        char buf[32];
+        sprintf( buf, "%.6f", p );
+        stream() << buf;
+        return *this;
+    }
+    MifOutputByteStream &operator<<( const MifDoc::T_dimension &d ) {
+        char buf[32];
+        int i;
+        sprintf( buf, "%li.%.3i%n", long(d)/1000, abs(long(d)%1000), &i );
+        while( buf[--i] == '0' ) {}; if( buf[i] == '.' ) i--;
+        buf[i+1] = '\0';
+        stream() << buf << "pt";
+        return *this;
+    }
+    MifOutputByteStream &operator<<( const MifDoc::CrossRefInfo &cri ) {
+        Vector<MifDoc::CrossRefInfo> &crossRefInfos = MifDoc::CurInstance->crossRefInfos();
+        unsigned idx = crossRefInfos.size();
+        crossRefInfos.resize( crossRefInfos.size() + 1 );
+        crossRefInfos.back() = cri;
+        stream() << MifDoc::escapeChar();
+        stream().sputn( (char*)&idx, sizeof( idx ) );
+        return *this;
+    }
+    MifOutputByteStream &operator<<( const MifDoc::T_LTRB &b )
+     { *this << b.l << " " << b.t << " " << b.r << " " << b.b; return *this; }
+    MifOutputByteStream &operator<<( const MifDoc::T_LTWH &b )
+     { *this << b.l << " " << b.t << " " << b.w << " " << b.h; return *this; }
+    MifOutputByteStream &operator<<( const MifDoc::T_WH &s )
+     { *this << s.w << " " << s.h; return *this; }
+    MifOutputByteStream &operator<<( const MifDoc::T_XY &s )
+     { *this << s.x << " " << s.y; return *this; }
+    MifOutputByteStream &operator<<( const MifDoc::T_boolean &b )
+     { if( bool(b) ) *this << "Yes"; else *this << "No"; return *this; }
+    MifOutputByteStream &operator<<( const MifDoc::T_indent &i )
+     { unsigned cnt = (i==INDENT) ? CurTagIndent : unsigned( i );
+       for( ; cnt; cnt-- ) stream() << ' '; return *this; }
+};
+
+class MifTmpOutputByteStream : public TmpOutputByteStream {
+
+    MifOutputByteStream os;    
+
+  public:
+    MifTmpOutputByteStream( MifDoc::T_indent osIndent = 0 )
+     : TmpOutputByteStream(), os( osIndent ) { os.setStream( *this ); }
+    void commit( OutputByteStream &os, bool resolveCrossReferences = false );
+    void commit( String<char> &str );
+    MifOutputByteStream  &stream() { return os; }
+};
+
+class MifFOTBuilder : public SerialFOTBuilder {
+
+  public:
+    MifFOTBuilder( const String<CmdLineApp::AppChar> &fileLoc,
+                   const Ptr<ExtendEntityManager> &, const CharsetInfo &, CmdLineApp *app );
+    ~MifFOTBuilder() {}
+    static MifFOTBuilder &curInstance() { assert( CurInstance != NULL ); return *CurInstance; }
+    static MifFOTBuilder *CurInstance;
+
+    struct IndexEntryNIC {
+        IndexEntryNIC()
+         : pageNumber( true ), startsPageRange( false ), endsPageRange( false ) {}
+        StringC sortString;
+        Vector<StringC> components;
+        bool pageNumber;
+        bool startsPageRange;
+        bool endsPageRange;
+    };
+
+    class MifExtensionFlowObj : public FOTBuilder::ExtensionFlowObj {
+      public:
+        virtual void atomic( MifFOTBuilder &, const NodePtr & ) const = 0;
+    };
+
+    class IndexEntryFlowObj : public MifExtensionFlowObj {
+      public:
+        void atomic( MifFOTBuilder &fb, const NodePtr & ) const
+         { fb.indexEntry( nic ); }
+        bool hasNIC( const StringC &name ) const;
+        void setNIC( const StringC &name, const Value &value );
+        ExtensionFlowObj *copy() const { return new IndexEntryFlowObj(*this); }
+      private:
+        IndexEntryNIC nic;
+    };
+
+    void extension( const ExtensionFlowObj &fo, const NodePtr & );
+    void start();
+    void end();
+
+    void startSimplePageSequenceSerial();
+    void endSimplePageSequenceSerial();
+    void startSimplePageSequenceHeaderFooter( unsigned );
+    void endSimplePageSequenceHeaderFooter( unsigned );
+    void endAllSimplePageSequenceHeaderFooter();
+
+    void indexEntry( const IndexEntryNIC & );
+
+    void setPageNColumns( long );
+    void setPageColumnSep( Length );
+    void setPageBalanceColumns( bool );
+
+    void startNode( const NodePtr &, const StringC & );
+    void endNode();
+    void currentNodePageNumber( const NodePtr & );
+
+    void startLink( const Address & );
+    void endLink();
+    void startLineField( const LineFieldNIC & );
+    void endLineField();
+    void doStartParagraph( const ParagraphNIC &, bool servesAsWrapper = false,
+                           MifDoc::T_dimension = 0, bool allowNegativeLeading = false );
+    void startParagraph( const ParagraphNIC &nic ) { doStartParagraph( nic ); }
+    void doEndParagraph( bool sustainFormatStack = false, bool sustainDisplayStack = false,
+                         bool paragraphBreakTest = true, bool discardThisPara = false );
+    void endParagraph() { doEndParagraph(); }
+    void startDisplayGroup( const DisplayGroupNIC & );
+    void endDisplayGroup();
+    void characters( const Char *, size_t );
+    void paragraphBreak( const ParagraphNIC & );
+    void externalGraphic( const ExternalGraphicNIC & );
+    void rule( const RuleNIC & );
+    void pageNumber();
+    void startScore( Symbol );
+    void endScore();
+    void startLeader( const LeaderNIC & );
+    void endLeader();
+
+    void startTable(const TableNIC &);
+    void endTable();
+    void startTablePartSerial(const TablePartNIC &);
+    void endTablePartSerial();
+    void startTablePartHeader();
+    void endTablePartHeader();
+    void startTablePartFooter();
+    void endTablePartFooter();
+    void tableColumn(const TableColumnNIC &);
+    void startTableRow();
+    void endTableRow();
+    void startTableCell(const TableCellNIC &);
+    void endTableCell();
+
+    void tableBeforeRowBorder();
+    void tableAfterRowBorder();
+    void tableBeforeColumnBorder();
+    void tableAfterColumnBorder();
+    void tableCellBeforeRowBorder();
+    void tableCellAfterRowBorder();
+    void tableCellBeforeColumnBorder();
+    void tableCellAfterColumnBorder();
+//  void setCellBeforeRowMargin(Length);
+//  void setCellAfterRowMargin(Length);
+//  void setCellBeforeColumnMargin(Length);
+//  void setCellAfterColumnMargin(Length);
+    void setCellBackground( bool );
+    void setCellRowAlignment( Symbol );
+    void setFontSize(Length);
+    void setFontFamilyName( const StringC & );
+    void setFontWeight( Symbol );
+    void setFontPosture( Symbol );
+    void setStartIndent( const LengthSpec & );
+    void setEndIndent( const LengthSpec & );
+    void setFirstLineStartIndent( const LengthSpec & );
+//  void setLastLineEndIndent(const LengthSpec &);
+    void setLineSpacing( const LengthSpec & );
+    void setFieldWidth( const LengthSpec & );
+    void setLines( Symbol );
+    void setQuadding( Symbol );
+    void setDisplayAlignment( Symbol );
+    void setFieldAlign( Symbol );
+    void setColor( const DeviceRGBColor & );
+    void setBackgroundColor( const DeviceRGBColor & );
+    void setBackgroundColor();
+    void setPageWidth( Length );
+    void setPageHeight( Length );
+    void setLeftMargin( Length );
+    void setRightMargin( Length );
+    void setTopMargin( Length );
+    void setBottomMargin( Length );
+    void setHeaderMargin( Length );
+    void setFooterMargin( Length );
+    void setBorderPresent(bool);
+    void setLineThickness(Length);
+    void setCellBeforeRowMargin( Length );
+    void setCellAfterRowMargin( Length );
+    void setCellBeforeColumnMargin( Length );
+    void setCellAfterColumnMargin( Length );
+    void setLineSep(Length);
+//  void setBoxSizeBefore(Length);
+//  void setBoxSizeAfter(Length);
+    void setPositionPointShift( const LengthSpec & );
+//  void setStartMargin(const LengthSpec &);
+//  void setEndMargin(const LengthSpec &);
+//  void setSidelineSep(const LengthSpec &);
+//  void setAsisWrapIndent(const LengthSpec &);
+//  void setLineNumberSep(const LengthSpec &);
+//  void setLastLineJustifyLimit(const LengthSpec &);
+//  void setJustifyGlyphSpaceMaxAdd(const LengthSpec &);
+//  void setJustifyGlyphSpaceMaxRemove(const LengthSpec &);
+//  void setTableCornerRadius(const LengthSpec &);
+//  void setBoxCornerRadius(const LengthSpec &);
+//  void setMarginaliaSep(const LengthSpec &);
+//  void setMinPreLineSpacing(const OptLengthSpec &);
+//  void setMinPostLineSpacing(const OptLengthSpec &);
+    void setMinLeading( const OptLengthSpec & );
+//  void setInhibitLineBreaks(bool);
+    void setHyphenate( bool );
+    void setKern( bool );
+//  void setLigature(bool);
+//  void setScoreSpaces(bool);
+//  void setFloatOutMarginalia(bool);
+//  void setFloatOutSidelines(bool);
+//  void setFloatOutLineNumbers(bool);
+//  void setCellBackground(bool);
+//  void setSpanWeak(bool);
+//  void setIgnoreRecordEnd(bool);
+//  void setNumberedLines(bool);
+//  void setHangingPunct(bool);
+//  void setBoxOpenEnd(bool);
+//  void setTruncateLeader(bool);
+//  void setAlignLeader(bool);
+//  void setTablePartOmitMiddleHeader(bool);
+//  void setTablePartOmitMiddleFooter(bool);
+    void setBorderOmitAtBreak(bool);
+//  void setPrincipalModeSimultaneous(bool);
+//  void setMarginaliaKeepWithPrevious(bool);
+//  void setGridEquidistantRows(bool);
+//  void setGridEquidistantColumns(bool);
+//  void setLineJoin(Symbol);
+    void setLineCap( Symbol );
+//  void setLineNumberSide(Symbol);
+//  void setKernMode(Symbol);
+    void setInputWhitespaceTreatment( Symbol );
+//  void setFillingDirection(Symbol);
+//  void setWritingMode(Symbol);
+//  void setLastLineQuadding(Symbol);
+//  void setMathDisplayMode(Symbol);
+//  void setScriptPreAlign(Symbol);
+//  void setScriptPostAlign(Symbol);
+//  void setScriptMidSupAlign(Symbol);
+//  void setScriptMidSubAlign(Symbol);
+//  void setNumeratorAlign(Symbol);
+//  void setDenominatorAlign(Symbol);
+//  void setGridPositionCellType(Symbol);
+//  void setGridColumnAlignment(Symbol);
+//  void setGridRowAlignment(Symbol);
+//  void setBoxType(Symbol);
+//  void setGlyphAlignmentMode(Symbol);
+//  void setBoxBorderAlignment(Symbol);
+//  void setCellRowAlignment(Symbol);
+//  void setBorderAlignment(Symbol);
+//  void setSidelineSide(Symbol);
+//  void setHyphenationKeep(Symbol);
+//  void setPositionPreference(Symbol);
+//  void setFontStructure(Symbol);
+//  void setFontProportionateWidth(Symbol);
+//  void setCellCrossed(Symbol);
+//  void setMarginaliaSide(Symbol);
+//  void setLayer(long);
+//  void setBackgroundLayer(long);
+    void setBorderPriority( long );
+    void setLineRepeat( long );
+    void setSpan( long );
+//  void setMinLeaderRepeat(long);
+    void setHyphenationRemainCharCount( long );
+    void setHyphenationPushCharCount( long );
+    void setWidowCount( long );
+    void setOrphanCount( long );
+//  void setExpandTabs(long);
+    void setHyphenationLadderCount( long );
+//  void setBackgroundTile(PublicId);
+//  void setLineBreakingMethod(PublicId);
+//  void setLineCompositionMethod(PublicId);
+//  void setImplicitBidiMethod(PublicId);
+//  void setGlyphSubstMethod(PublicId);
+//  void setGlyphReorderMethod(PublicId);
+//  void setHyphenationMethod(PublicId);
+//  void setTableAutoWidthMethod(PublicId);
+//  void setFontName(PublicId);
+    void setLanguage (Letter2 );
+    void setCountry( Letter2 );
+//  void setEscapementSpaceBefore(const InlineSpace &);
+//  void setEscapementSpaceAfter(const InlineSpace &);
+//  void setGlyphSubstTable(const Vector<ConstPtr<GlyphSubstTable> > &);
+
+    struct DisplayInfo : public Link {
+
+        DisplayInfo( const DisplayNIC &nic, DisplayInfo *parentDs )
+         : spaceBefore( nic.spaceBefore), spaceAfter( nic.spaceAfter ), keep( nic.keep ),
+           breakAfter( nic.breakAfter ), breakBefore( nic.breakBefore ),
+           keepWithPrevious( nic.keepWithPrevious ), keepWithNext( nic.keepWithNext ),
+           mayViolateKeepBefore( nic.mayViolateKeepBefore ), isParagraph( false ),
+           mayViolateKeepAfter( nic.mayViolateKeepAfter ), firstParaOutputed( false ),
+           paragraphClosedInMif( false )
+            { keepWithinPageInEffect = (nic.keep==symbolPage)
+                                        ? true
+                                        : (parentDs
+                                            ? parentDs->keepWithinPageInEffect
+                                            : false ); }
+       
+        DisplaySpace spaceBefore;
+        DisplaySpace spaceAfter;
+        Symbol keep;
+        Symbol breakBefore;
+        Symbol breakAfter;
+        bool keepWithPrevious;
+        bool keepWithNext;
+        bool mayViolateKeepBefore;
+        bool mayViolateKeepAfter;
+        bool firstParaOutputed;
+        bool isParagraph;
+        bool paragraphClosedInMif;
+
+        bool keepWithinPageInEffect;
+    };
+
+    struct DisplaySpaceInfo : public Link {
+
+        DisplaySpaceInfo( DisplaySpace space_, Symbol breakType_, bool breakIsAfter_ )
+         : space( space_ ), breakType( breakType_ ), breakIsAfter( breakIsAfter_ ) {}
+
+        DisplaySpace space;
+        Symbol breakType;
+        bool breakIsAfter;
+    };
+
+    struct EffectiveDisplaySpace {
+
+        long nominal;
+        long min;
+        long max;
+        long priority;
+        bool conditional;
+        bool force;
+
+        EffectiveDisplaySpace() { set(); }
+        EffectiveDisplaySpace( long) { set(); }
+
+        void set( long nominal_ = 0, long min_ = 0, long max_ = 0, long priority_ = 0,
+                  bool conditional_ = true, bool force_ = false )
+              { nominal = nominal_; min = min_; max = max_; priority = priority_;
+                conditional = conditional_; force = force_; }
+        void combine( const EffectiveDisplaySpace );
+        void clear() { set(); }
+    };
+
+    struct TFotSimplePageSequence {
+
+         TFotSimplePageSequence() : BodyTextFlow( NULL ), FirstHeaderTextFlow( NULL ),
+                                    FirstFooterTextFlow( NULL ), LeftHeaderTextFlow( NULL ),
+                                    LeftFooterTextFlow( NULL ), RightHeaderTextFlow( NULL ),
+                                    RightFooterTextFlow( NULL ) {}
+        MifDoc::TextFlow *BodyTextFlow;
+        MifDoc::TextFlow *FirstHeaderTextFlow;
+        MifDoc::TextFlow *FirstFooterTextFlow;
+        MifDoc::TextFlow *LeftHeaderTextFlow;
+        MifDoc::TextFlow *LeftFooterTextFlow;
+        MifDoc::TextFlow *RightHeaderTextFlow;
+        MifDoc::TextFlow *RightFooterTextFlow;
+
+        MifDoc::ParagraphFormat paragraphFormat;
+
+    };
+
+    struct Border {
+
+        Border( bool cellBorder_ = true )
+         : cellBorder( cellBorder_ ), borderPresent( false ) {}
+        long   borderPriority;
+        Length lineThickness;
+        bool   borderPresent;
+        long   lineRepeat;
+        Length lineSep;
+        bool cellBorder;
+        MifDoc::T_tagstring color;
+
+        MifDoc::T_tagstring makeMifRuling( MifDoc &mifDoc );
+        void resolve( Border &adjacentBorder );
+        void setFromFot();
+    };
+
+    struct Column {
+
+        Column() : hasWidth( 0 ) {}
+        bool hasWidth;
+        TableLengthSpec width;
+    };
+
+    struct Cell {
+
+        Cell() : missing( false ), MifCell( new MifDoc::Cell ), OverlappingCell( NULL ),
+                 nRowsSpanned( 1 ), nColumnsSpanned( 1 ), displaySize( 0 ) {}
+        bool missing;
+
+        unsigned nColumnsSpanned;
+        unsigned nRowsSpanned;
+        Border beforeRowBorder;
+        Border afterRowBorder;
+        Border beforeColumnBorder;
+        Border afterColumnBorder;
+        long displaySize;
+
+        Cell *OverlappingCell;
+        MifDoc::Cell &mifCell()
+         { assert( MifCell != NULL ); return *MifCell; }
+        void translate( MifDoc::Cell &mifCell, MifDoc &mifDoc );
+
+      protected:
+        MifDoc::Cell *MifCell;    
+    };
+
+    struct Row {
+
+        Row() {}
+        Vector<Cell> Cells;
+
+        void translate( Vector<MifDoc::Row> &mifRows, MifDoc &mifDoc );
+    };
+
+    struct Table;
+    struct TablePart {
+
+        TablePart()
+         : MifTableNum( 0 ), ParentTable( NULL ), columnsProcessed( false ),
+           needsColumnReprocessing( false ) {}
+
+        Vector<Column> Columns;
+        Vector<Row> Header;
+        Vector<Row> Body;
+        Vector<Row> Footer;                
+
+        void translate( MifDoc &mifDoc );
+        void processColumns();
+        void normalizeRows();
+        void begin( Table &parentTable, MifDoc &mifDoc );
+
+        MifDoc::Tbl &mifTable( MifDoc &mifDoc )
+         { assert( MifTableNum > 0 ); return mifDoc.tbls()[MifTableNum-1]; }
+        Table &parentTable() { assert( ParentTable != NULL ); return *ParentTable; }
+
+        size_t MifTableNum;
+        Table *ParentTable;
+        bool columnsProcessed;
+        bool needsColumnReprocessing;
+    };
+
+    struct Table {
+
+        Table() : beforeRowBorder( false ), afterRowBorder( false ), beforeColumnBorder( false ),
+                  afterColumnBorder( false ), CurCell( NULL ), CurTablePart( NULL ),
+                  DefaultTblFormatGenerated( false ), NoTablePartsSeen( true ) {}
+
+        Vector<TablePart> TableParts;
+
+        Border beforeRowBorder;
+        Border afterRowBorder;
+        Border beforeColumnBorder;
+        Border afterColumnBorder;
+//        TableNIC nic;
+        Length tableWidth;
+        Symbol displayAlignment;
+        Length startIndent;
+
+        void resolveBorders( Vector<Row> &rows, bool hasFirstTableRow, bool hasLastTableRow );
+        void begin( MifDoc &mifDoc );
+
+        Vector<Row> &curRows() { assert( CurRows != NULL ); return *CurRows; }
+        TablePart &curTablePart() { assert( CurTablePart != NULL ); return *CurTablePart; }
+        Cell &curCell() { assert( CurCell != NULL ); return *CurCell; }
+
+        TablePart *CurTablePart;
+        Cell *CurCell;
+        Vector<Row> *CurRows;
+        
+        bool DefaultTblFormatGenerated;
+        bool NoTablePartsSeen;
+
+    };
+
+    struct Format : public MifDoc::ParagraphFormat {
+
+        Format() : MifDoc::ParagraphFormat(), FotLineSpacingSpec( 12000 ),
+                   FotFirstLineStartIndentSpec( 0 ), FotStartIndentSpec( 0 ),
+                   FotEndIndentSpec( 0 ), FotLanguage( 0 ), FotCurDisplaySize( 0 ),
+                   FotLineThickness( 1000 ), FotBorderPresent( true ), FotLineRepeat( 1 ),
+                   FotLineSep( 1000 ), FotBorderPriority( 0 ),
+                   FotDisplayAlignment( symbolStart ), FotLeftMargin( 1 ), FotRightMargin( 1 ),
+                   FotTopMargin( 0 ), FotBottomMargin( 0 ), FotHeaderMargin( 0 ),
+                   FotFooterMargin( 0 ), FotPageWidth( 72000*8 ),
+                   FotPageHeight( (72000*23)/2 ), FotLineCap( symbolButt ),
+                   FotPositionPointShiftSpec( 0 ), FotMinLeading(),
+                   FotFieldAlign( symbolStart ), FotFieldWidth( 0 ), FotLines( symbolWrap ),
+                   FotInputWhitespaceTreatment( symbolPreserve ), FotPageNColumns( 1 ),
+                   FotPageColumnSep( 72000/2 ), FotSpan( 1 ), FotPageBalanceColumns( false ),
+                   FotCellBackground( false ) {}
+
+        LengthSpec    FotFirstLineStartIndentSpec;
+        LengthSpec    FotStartIndentSpec;
+        LengthSpec    FotEndIndentSpec;
+        LengthSpec    FotLineSpacingSpec;
+        LengthSpec    FotPositionPointShiftSpec;
+        LengthSpec    FotFieldWidth;
+        OptLengthSpec FotMinLeading;
+        long          FotCurDisplaySize;
+        Length        FotLineThickness;
+        Symbol        FotLineCap;
+        long          FotBorderPriority;
+        bool          FotBorderPresent;
+        long          FotLineRepeat;
+        Length        FotLineSep;
+        Symbol        FotDisplayAlignment;
+        Length        FotLeftMargin;
+        Length        FotRightMargin;
+        Length        FotTopMargin;
+        Length        FotBottomMargin;
+        Length        FotHeaderMargin;
+        Length        FotFooterMargin;
+        Length        FotPageWidth;
+        Length        FotPageHeight;
+        Symbol        FotFieldAlign;
+        Symbol        FotInputWhitespaceTreatment;
+        Symbol        FotLines;
+        long          FotPageNColumns;
+        Length        FotPageColumnSep;
+        long          FotSpan;
+        bool          FotPageBalanceColumns;
+        bool          FotCellBackground;
+
+        MifDoc::T_tagstring MifBackgroundColor;
+
+        Letter2 FotLanguage;
+        Letter2 FotCountry;
+        void computePgfLanguage();
+
+        static const Length INITIAL_PAGE_SIZE() { return 72000*8; }
+    };
+
+    struct NodeInfo {
+
+        NodeInfo() {}
+        NodeInfo( NodePtr node_, unsigned nodeLevel_ )
+        : node( node_ ), nodeLevel( nodeLevel_ ) {}
+        NodePtr node;
+        unsigned nodeLevel;
+        static unsigned nonEmptyElementsOpened;
+        static unsigned curNodeLevel;
+    };
+
+    struct LinkInfo {
+
+        LinkInfo( MifDoc::CrossRefInfo *crossRefInfo_ = NULL ) 
+         : crossRefInfo( crossRefInfo_ ), openedInMif( false ) {}
+        ~LinkInfo() { if( crossRefInfo != NULL ) delete crossRefInfo; }
+
+        bool forcesNoLink() const { return crossRefInfo != NULL ? false : true; }
+
+        MifDoc::CrossRefInfo *crossRefInfo;
+        bool openedInMif;
+        static unsigned pendingMifClosings;
+    };
+
+    struct SymbolFont {
+        const char *name;
+        Char mapping[256];
+    };
+
+    enum { nSymbolFonts = 3 };
+
+    void synchronizeFontFormat();
+    long computeLengthSpec( const LengthSpec &spec ) const;
+    Format &format() const
+        { Format *result = formatStack.head(); assert( result != NULL ); return *result; }
+    Table &curTable() { return CurTable; }
+    void setCurLeaderStream( MifTmpOutputByteStream *s, bool doDelete = true )
+     { if( doDelete && CurLeaderStream ) delete CurLeaderStream; CurLeaderStream = s; }
+    MifTmpOutputByteStream &curLeaderStream()
+     { assert( CurLeaderStream != NULL ); return *CurLeaderStream; }
+
+    CmdLineApp *App;
+    const CharsetInfo *SystemCharset;
+    Ptr<ExtendEntityManager> EntityManager;
+    bool paragraphBreakInEffect;
+    bool inLeader;
+    bool lastFlowObjectWasWhitespace;
+    bool firstHeaderFooter;
+    bool inSimplePageSequence;
+    bool bookComponentOpened;
+    bool bookComponentAvailable;
+
+  protected:
+
+    TFotSimplePageSequence FotSimplePageSequence;
+    Table CurTable;
+
+    MifDoc::T_pathname systemIdToMifPathname( const StringC &systemId );
+    bool systemIdToMifPathname( const StringC &systemId, MifDoc::T_pathname & );
+    int  systemIdFilename( const StringC &systemId, StringC &filename );
+    void initMifBookComponent();
+    void setupSimplePageSequence();
+    void beginHeaderFooter( bool header );
+    void beginHeader() { beginHeaderFooter( true ); }
+    void beginFooter() { beginHeaderFooter( false ); };
+    void endHeaderFooter( unsigned hfPart );
+    void makeEmptyTextFlow( MifDoc::TextRect & );
+    void checkForParagraphReopening();
+    void outPendingInlineStatements();
+    void outString( const Char *s, size_t n, MifTmpOutputByteStream *o = NULL,
+                    bool inParagraph = true, String<char> *targetString = NULL );
+
+    MifDoc::Frame &makeAnchoredFrame
+     ( MifDoc::T_keyword frameType, long width, long height,
+       MifDoc::T_keyword anchorAlign = MifDoc::sLeft );
+    void setupHeaderFooterParagraphFormat( MifDoc::ParagraphFormat &,
+                                           MifDoc::ParagraphFormat &,
+                                           MifDoc::T_dimension );
+    OutputByteStream &os() { return *outputStream; }
+
+    MifDoc mifDoc;
+    OutputByteStream *outputStream;
+    MifTmpOutputByteStream *CurLeaderStream;
+    EffectiveDisplaySpace createEffectiveDisplaySpace( const DisplaySpace &ds ) const;
+    IList<DisplayInfo> displayStack;
+    IList<Format> formatStack;
+    IQueue<DisplaySpaceInfo> displaySpaceQueue;
+    Vector<NodeInfo> nodeStack;
+    Vector<LinkInfo> linkStack;
+    Vector<MifDoc::Marker> indexEntryStack;
+
+    Format nextFormat;
+
+    Symbol pendingBreak;
+    EffectiveDisplaySpace pendingEffectiveDisplaySpace;
+    void processDisplaySpaceStack();
+
+    void startDisplay( const DisplayNIC & );
+    void endDisplay();
+
+    // sytem font code from James Clark
+    enum { CHAR_TABLE_CHAR_BITS = 16 };
+    enum { CHAR_TABLE_SYMBOL_FLAG = 1U << 31 };
+    CharMap<Unsigned32> CharTable;
+
+    static const SymbolFont SymbolFonts[nSymbolFonts];
+    static const Char FrameCharsetMap[128];
+};
+
+MifFOTBuilder *MifFOTBuilder::CurInstance = NULL;
+unsigned MifFOTBuilder::NodeInfo::nonEmptyElementsOpened = 0;
+unsigned MifFOTBuilder::NodeInfo::curNodeLevel = 0;
+unsigned MifFOTBuilder::LinkInfo::pendingMifClosings = 0;
+
+int operator ==(struct FOTBuilder::DisplayNIC, struct FOTBuilder::DisplayNIC) { return 0; }
+
+void MifFOTBuilder::start() {
+
+    NodeInfo::nonEmptyElementsOpened = nodeStack.size();
+
+    Format *effectiveFormat = new Format( nextFormat );
+    if( nextFormat.FSize > 0 )
+        effectiveFormat->setFDY
+         ( double( computeLengthSpec( nextFormat.FotPositionPointShiftSpec ) * -100 )
+            / nextFormat.FSize );
+
+    formatStack.insert( effectiveFormat );
+}
+
+void MifFOTBuilder::end() {
+
+    assert( formatStack.head() != NULL );
+    delete formatStack.get();
+
+    assert( formatStack.head() != NULL );
+    nextFormat = *formatStack.head();
+}
+
+void MifFOTBuilder::Format::computePgfLanguage() {
+
+    switch( FotLanguage ) {
+      case SP_LETTER2( 'E', 'N' ):
+        switch( FotCountry ) {
+          case SP_LETTER2( 'G', 'B' ):
+            PgfLanguage = MifDoc::sUKEnglish;
+            break;
+          default:
+            PgfLanguage = MifDoc::sUSEnglish;
+        }
+        break;
+      case SP_LETTER2( 'D', 'E' ):
+        switch( FotCountry ) {
+          case SP_LETTER2( 'C', 'H' ):
+            PgfLanguage = MifDoc::sSwissGerman;
+            break;
+          default:
+            PgfLanguage = MifDoc::sGerman;
+        }
+      case SP_LETTER2( 'F', 'R' ):
+        switch( FotCountry ) {
+          case SP_LETTER2( 'C', 'A' ):
+            PgfLanguage = MifDoc::sCanadianFrench;
+            break;
+          default:
+            PgfLanguage = MifDoc::sFrench;
+        }
+        break;
+      case SP_LETTER2( 'E', 'S' ):
+        PgfLanguage = MifDoc::sSpanish;
+        break;
+      case SP_LETTER2( 'C', 'A' ):
+        PgfLanguage = MifDoc::sCatalan;
+        break;
+      case SP_LETTER2( 'I', 'T' ):
+        PgfLanguage = MifDoc::sItalian;
+        break;
+      case SP_LETTER2( 'P', 'T' ):
+        PgfLanguage = MifDoc::sPortuguese;
+        break;
+//      case SP_LETTER2( '', '' ):
+//        PgfLanguage = sBrazilian;
+//        break;
+//      case SP_LETTER2( '', '' ):
+//        PgfLanguage = sDanish;
+//        break;
+      case SP_LETTER2( 'N', 'L' ):
+        PgfLanguage = MifDoc::sDutch;
+        break;
+      case SP_LETTER2( 'N', 'O' ):
+        PgfLanguage = MifDoc::sNorwegian;
+        break;
+ //     case SP_LETTER2( '', '' ):
+ //       PgfLanguage = sNynorsk;
+ //       break;
+      case SP_LETTER2( 'F', 'I' ):
+        PgfLanguage = MifDoc::sFinnish;
+        break;
+      case SP_LETTER2( 'S', 'V' ):
+        PgfLanguage = MifDoc::sSwedish;
+        break;
+      default:
+        PgfLanguage = MifDoc::sNoLanguage;
+    }
+}
+
+MifFOTBuilder::MifFOTBuilder( const String<CmdLineApp::AppChar> &fileLoc,
+                              const Ptr<ExtendEntityManager> &entityManager,
+                                     const CharsetInfo &systemCharset,
+                              CmdLineApp *app )
+ : App( app ), EntityManager( entityManager ), SystemCharset( &systemCharset ),
+   mifDoc( fileLoc, app ), paragraphBreakInEffect( false ), inLeader( false ),
+   CurLeaderStream( NULL ), CharTable( 0 ), lastFlowObjectWasWhitespace( false ),
+   pendingBreak( symbolFalse ), firstHeaderFooter( true ),  inSimplePageSequence( false ),
+   bookComponentOpened( false ), bookComponentAvailable( false ) {
+
+    CurInstance = this;
+
+    nextFormat.setDSSSLDefaults();
+    nextFormat.FotCurDisplaySize = Format::INITIAL_PAGE_SIZE() - 2;
+     // 2 is for margins (MIF doesn't accept zero-sized ones)
+    formatStack.insert( new Format( nextFormat ) );
+
+    initMifBookComponent();
+    bookComponentOpened = true;
+    bookComponentAvailable = true;
+
+    for( int i = 0; i < 128; i++ ) {
+        Char c = FrameCharsetMap[i];
+        if( c ) {
+            if( !CharTable[i+0x80] )
+               CharTable.setChar( i+0x80, c );
+           else if ((CharTable[i+0x80] & ((1 << CHAR_TABLE_CHAR_BITS) - 1)) == c)
+               CharTable.setChar(i+0x80, CharTable[i+0x80] | (1 << (i + CHAR_TABLE_CHAR_BITS)));
+        }
+    }
+
+    // symbol character code from James Clark
+    for( int i = 0; i < nSymbolFonts; i++ ) {
+        for( int j = 0; j < 256; j++ ) {
+            Char c = SymbolFonts[i].mapping[j];
+            if( c && !CharTable[c] )
+               CharTable.setChar( c, j | (i << CHAR_TABLE_CHAR_BITS) | CHAR_TABLE_SYMBOL_FLAG );
+        }
+    }
+}
+
+void MifFOTBuilder::initMifBookComponent() {
+
+   MifDoc::ParagraphFormat defaultParaFormat;
+   defaultParaFormat.setDSSSLDefaults();
+   defaultParaFormat.setPgfTag( MifDoc::sDefaultPgfFormat );
+   mifDoc.pgfCatalog().ParaFormats.push_back( defaultParaFormat );
+   mifDoc.document().setDPageSize
+    ( MifDoc::T_WH( MifDoc::T_dimension( format().FotPageWidth ),
+                    MifDoc::T_dimension( format().FotPageHeight ) ) );
+   mifDoc.document().setDMargins( MifDoc::T_LTRB( 1, 1, 1, 1 ) );
+    // MIF doesn't accept zeros
+   mifDoc.document().setDColumns( 1 );
+}
+
+long MifFOTBuilder::computeLengthSpec( const LengthSpec &spec ) const {
+
+    if( spec.displaySizeFactor == 0.0 ) {
+        return spec.length;
+    } else {
+        double tem = format().FotCurDisplaySize * spec.displaySizeFactor;
+        return spec.length + long( tem >= 0.0 ? tem +.5 : tem - .5 );
+    }
+}
+
+MifFOTBuilder::EffectiveDisplaySpace
+MifFOTBuilder::createEffectiveDisplaySpace( const DisplaySpace &ds ) const {
+
+    EffectiveDisplaySpace result;
+    result.set( computeLengthSpec( ds.nominal ), computeLengthSpec( ds.min ),
+                computeLengthSpec( ds.max ), ds.priority, ds.conditional, ds.force );
+    return result;
+}
+
+void MifFOTBuilder::EffectiveDisplaySpace::combine( const EffectiveDisplaySpace eds ) {
+
+    if( eds.force ) {
+        if( force ) {
+            nominal += eds.nominal;
+            min += eds.min;
+            max += eds.max;
+        } else
+            *this = eds;
+    } else {
+        if( eds.priority > priority )
+            *this = eds;
+        else {
+            if( eds.priority == priority ) {
+                if( eds.nominal > nominal )
+                    *this = eds;
+                else
+                    if( eds.nominal == nominal ) {
+                        if( eds.min < min ) {
+                            min = eds.min;
+                        }
+                        if( eds.max > max ) {
+                            max = eds.max;
+                        }
+                    }
+            }
+        }
+    }
+}
+
+void MifFOTBuilder::synchronizeFontFormat() {
+
+    if( mifDoc.curPara( false ) != NULL ) {
+//        mifDoc.curPara()->curFormat().ffUpdateFrom( format() );
+        mifDoc.curPara()->curFormat().ffUpdateFrom( nextFormat );
+        mifDoc.curPara()->curFormat().ffOut( mifDoc.os(), MifDoc::FontFormat::stFont );
+    } else {
+//        mifDoc.curFormat().ffUpdateFrom( format() );
+        mifDoc.curFormat().ffUpdateFrom( nextFormat );
+        mifDoc.curFormat().ffOut( mifDoc.os(), MifDoc::FontFormat::stFont );
+    }
+    outPendingInlineStatements();
+}
+
+void MifFOTBuilder::outString
+ ( const Char *s, size_t n, MifTmpOutputByteStream *o, bool inParagraph,
+   String<char> *targetString ) {
+
+    MifOutputByteStream *outS
+     = ( o != NULL ) ? &o->stream()
+                     : ( ( targetString != NULL ) ? (MifOutputByteStream *)NULL : &mifDoc.os() );
+
+    enum { nStr, nCode, nChar, nNothing, nHardReturn, nSpecialChar } nextOut;
+    union { const char *str; unsigned long code; char chr;  } out;
+    String<char> out_specialChar;
+
+    MifDoc::ParagraphFormat *curPFormat
+     = inParagraph 
+        ? ( mifDoc.curPara( false ) != NULL ? &mifDoc.curPara()->curFormat() : &mifDoc.curFormat() ) 
+        : (MifDoc::ParagraphFormat*)NULL;
+    MifDoc::T_string paraFFamily;
+    if( curPFormat != NULL )
+        paraFFamily = curPFormat->FFamily;
+    bool stringOpened = false;
+    int prevSymbolFontNum = 0;
+    int curSymbolFontNum = 0;
+    bool thisFlowObjectIsWhitespace;
+    for( ; n > 0; s++, n-- ) {
+        thisFlowObjectIsWhitespace = false;
+        nextOut = nNothing;
+        switch( *s ) {
+          case Char( '\n' ): break;
+          case Char( '\r' ):
+            if( !inParagraph ) {
+                out.chr = ' '; nextOut = nChar;
+            } else {
+                switch( format().FotLines ) {
+                  case symbolNone:
+                  case symbolWrap:
+                    switch( format().FotInputWhitespaceTreatment ) {
+                      case symbolIgnore: break;
+                      case symbolCollapse:
+                        if( lastFlowObjectWasWhitespace )
+                            break;
+                      case symbolPreserve: default:            
+                        out.chr = ' '; nextOut = nChar;
+                    }  
+                    break;
+                  default:
+                    nextOut = nHardReturn;
+                }
+                thisFlowObjectIsWhitespace = true;
+            }
+            break;
+          case Char( '\t' ):
+            if( !inParagraph ) {
+                out.str = "\\t"; nextOut = nStr;
+            } else {
+                switch( format().FotInputWhitespaceTreatment ) {
+                  case symbolIgnore: break;
+                  case symbolCollapse:
+                    if( lastFlowObjectWasWhitespace )
+                        break;
+                  case symbolPreserve: default:            
+                    out.str = "\\t"; nextOut = nStr;
+                }  
+                thisFlowObjectIsWhitespace = true;
+            }
+            break;
+          case Char( '>' ):  out.str = "\\>"; nextOut = nStr; break;
+          case Char( '\'' ): out.str = "\\q"; nextOut = nStr; break;
+          case Char( '`' ):  out.str = "\\Q"; nextOut = nStr; break;
+          case Char( '\\' ): out.str = "\\\\"; nextOut = nStr; break;
+          case Char( ' ' ):
+            if( !inParagraph ) {
+                out.chr = ' '; nextOut = nChar;
+            } else {
+                switch( format().FotInputWhitespaceTreatment ) {
+                  case symbolIgnore: break;
+                  case symbolCollapse:
+                    if( lastFlowObjectWasWhitespace )
+                        break;
+                  case symbolPreserve: default:            
+                    out.chr = ' '; nextOut = nChar;
+                }  
+                thisFlowObjectIsWhitespace = true;
+            }
+            break;
+          case 0x00A0:
+            out_specialChar = MifDoc::sHardSpace; nextOut = nSpecialChar;
+            break;
+          case 0x00A2:
+            out_specialChar = MifDoc::sCent; nextOut = nSpecialChar;
+            break;
+          case 0x00A3:
+          case 0x20A4:
+            out_specialChar = MifDoc::sPound; nextOut = nSpecialChar;
+            break;
+          case 0x00A5:
+            out_specialChar = MifDoc::sYen; nextOut = nSpecialChar;
+            break;
+          case 0x2002:
+            out_specialChar = MifDoc::sEnSpace; nextOut = nSpecialChar;
+            break;
+          case 0x2003:
+            out_specialChar = MifDoc::sEmSpace; nextOut = nSpecialChar;
+            break;
+          case 0x2009:
+            out_specialChar = MifDoc::sThinSpace; nextOut = nSpecialChar;
+            break;
+          case 0x2010:
+            out_specialChar = MifDoc::sSoftHyphen; nextOut = nSpecialChar;
+            break;
+          case 0x2011:
+            out_specialChar = MifDoc::sHardHyphen; nextOut = nSpecialChar;
+            break;
+          case 0x2013:
+            out_specialChar = MifDoc::sEnDash; nextOut = nSpecialChar;
+            break;
+          case 0x2014:
+            out_specialChar = MifDoc::sEmDash; nextOut = nSpecialChar;
+            break;
+          case 0x2020:
+            out_specialChar = MifDoc::sDagger; nextOut = nSpecialChar;
+            break;
+          case 0x2021:
+            out_specialChar = MifDoc::sDoubleDagger; nextOut = nSpecialChar;
+            break;
+          case 0x2022:
+            out_specialChar = MifDoc::sBullet; nextOut = nSpecialChar;
+            break;
+          default:
+            if( *s >= 0x80 ) {
+                unsigned long code = CharTable[*s];
+                if( code & CHAR_TABLE_SYMBOL_FLAG ) {
+                    if( curPFormat != NULL ) {
+                        curSymbolFontNum = ( ( code & ~CHAR_TABLE_SYMBOL_FLAG )
+                                              >> CHAR_TABLE_CHAR_BITS ) + 1;
+                        assert( curSymbolFontNum < nSymbolFonts );
+                        out.code = code & 0xff; nextOut = nCode;
+                    }
+                } else
+                    if( code ) {
+                        out.code = code & 0xff; nextOut = nCode;
+                    }
+            } else {
+                out.chr = char( *s ); nextOut = nChar;
+            }
+        }
+
+        if( nextOut != nNothing ) {
+            if( curSymbolFontNum != prevSymbolFontNum ) {
+                if( stringOpened ) {
+                    *outS << "'>";
+                    stringOpened = false;
+                }
+                MifDoc::T_string fontFamily( curSymbolFontNum == 0 
+                                      ? paraFFamily
+                                      : MifDoc::T_string( 
+                                         SymbolFonts[ curSymbolFontNum - 1 ].name ) );
+                curPFormat->setFFamily( fontFamily );
+                curPFormat->ffOut( *outS, MifDoc::FontFormat::stFont );
+            }
+            if( curPFormat != NULL && !stringOpened ) {
+                *outS << '\n' << MifOutputByteStream::INDENT << "<String `";
+                stringOpened = true;
+            }
+            switch( nextOut ) {
+              case nChar:
+                  if( targetString != NULL )
+                    *targetString += out.chr;
+                  else
+                    *outS << out.chr;
+                  break;
+
+              case nHardReturn:
+                if( inParagraph ) {
+                    if( stringOpened ) {
+                        *outS << "'>";
+                        stringOpened = false;
+                    }
+                    mifDoc.outSpecialChar( MifDoc::sHardReturn, outS );
+                    MifDoc::ParaLine::outEpilog( *outS );
+                    MifDoc::ParaLine::outProlog( *outS );
+                }
+                break;
+
+              case nSpecialChar:
+                if( inParagraph ) {
+                    if( stringOpened ) {
+                        *outS << "'>";
+                        stringOpened = false;
+                    }
+                    mifDoc.outSpecialChar( out_specialChar, outS );
+                }
+                break;
+
+              case nCode:
+                if( targetString != NULL )
+                   mifDoc.outHexChar( out.code, *targetString );
+                else
+                   mifDoc.outHexChar( out.code, outS ); break;
+                break;          
+
+              case nStr:
+                if( targetString != NULL )
+                    targetString->append( out.str, strlen( out.str ) );
+                else
+                    *outS << out.str;
+                break;
+              case nNothing: break;
+            }
+        }
+
+        prevSymbolFontNum = curSymbolFontNum;    
+        lastFlowObjectWasWhitespace = thisFlowObjectIsWhitespace;
+    }
+
+    if( stringOpened )
+        *outS << "'>";
+
+    if( curSymbolFontNum != 0 ) {
+        curPFormat->setFFamily( paraFFamily );
+        curPFormat->ffOut( *outS, MifDoc::FontFormat::stFont );
+        curPFormat->ffSetProperties() &= ~MifDoc::FontFormat::fFFamily;
+    }
+}
+
+void MifFOTBuilder::characters( const Char *s, size_t n ) {
+
+    checkForParagraphReopening();
+    if( MifDoc::Para::currentlyOpened ) {
+        if( inLeader ) {
+            outString( s, n, &curLeaderStream(), false );
+        } else {
+            synchronizeFontFormat();
+            outString( s, n, NULL, true );
+        }
+    }
+}
+
+void MifFOTBuilder::checkForParagraphReopening() {
+
+   DisplayInfo *curDs = displayStack.head();
+//   assert( curDs != NULL );
+   if( curDs != NULL && curDs->paragraphClosedInMif ) {
+
+        Format f = format();
+
+        f.setPgfWithPrev( curDs->firstParaOutputed ? curDs->keepWithinPageInEffect : false );
+        f.setPgfWithNext( false ); // TMAI
+        curDs->firstParaOutputed = true;
+
+        processDisplaySpaceStack();
+        switch( pendingBreak ) {
+            case symbolPage:
+                f.setPgfPlacement( MifDoc::sPageTop );
+                break;
+            case symbolColumn:
+                f.setPgfPlacement( MifDoc::sColumnTop );
+                break;
+            default:
+                f.setPgfPlacement( MifDoc::sAnywhere );
+        }
+        pendingBreak = symbolFalse;
+
+        f.setPgfSpBefore( pendingEffectiveDisplaySpace.nominal );
+         pendingEffectiveDisplaySpace.clear();
+        f.setPgfFIndent( nextFormat.PgfLIndent );
+
+        MifDoc::Para *p
+         = new MifDoc::Para( mifDoc.curTagStream().content().stream().CurTagIndent + 4 );
+        p->setParagraphFormat( mifDoc.curFormat() );
+        p->format().updateFrom( f );
+        p->format().FSize = mifDoc.curFormat().FSize;
+        p->format().ffSetProperties() &= ~MifDoc::FontFormat::fFSize;
+        Length lineSpacing = computeLengthSpec( f.FotLineSpacingSpec.length );
+        if( p->format().FSize != lineSpacing )
+            p->format().setFSize( lineSpacing );
+        p->curFormat() = p->format();
+        // assert( mifDoc.curPara( false ) == NULL );
+        mifDoc.setCurPara( p );
+        mifDoc.enterPara( *mifDoc.curPara() );
+
+        curDs->paragraphClosedInMif = false;
+   }
+}
+
+void MifFOTBuilder::processDisplaySpaceStack() {
+
+    pendingBreak = symbolFalse;
+    EffectiveDisplaySpace effectiveDisplaySpace;
+    DisplaySpaceInfo *curDSI;
+    while( !displaySpaceQueue.empty() ) {
+        curDSI = displaySpaceQueue.get();
+        if( curDSI->breakType == symbolPage || curDSI->breakType == symbolColumn ) {
+            effectiveDisplaySpace.clear();
+            if( pendingBreak != symbolFalse )
+                mifDoc.outBreakingPara( curDSI->breakType == symbolPage
+                                         ? MifDoc::sPageTop : MifDoc::sColumnTop );
+            pendingBreak = curDSI->breakType;
+            if( !curDSI->breakIsAfter )
+                effectiveDisplaySpace.combine( createEffectiveDisplaySpace( curDSI->space ) );
+        } else
+            effectiveDisplaySpace.combine( createEffectiveDisplaySpace( curDSI->space ) );
+        delete curDSI;
+    }
+
+    pendingEffectiveDisplaySpace = effectiveDisplaySpace;
+}
+
+
+void MifFOTBuilder::doStartParagraph
+      ( const ParagraphNIC &nic, bool servesAsWrapper, MifDoc::T_dimension height,
+        bool allowNegativeLeading ) {
+
+    startDisplay( nic );
+
+    DisplayInfo *curDs = displayStack.head();
+    assert( curDs != NULL );
+    curDs->isParagraph = true;
+
+    nextFormat.setPgfWithPrev( curDs->mayViolateKeepBefore
+                                ? curDs->keepWithPrevious
+                                : ( curDs->firstParaOutputed
+                                     ? curDs->keepWithinPageInEffect
+                                     : false ) );
+    nextFormat.setPgfWithNext( curDs->keepWithNext ); 
+    curDs->firstParaOutputed = true;
+
+    processDisplaySpaceStack();
+    switch( pendingBreak ) {
+        case symbolPage:
+            nextFormat.setPgfPlacement( MifDoc::sPageTop );
+            break;
+        case symbolColumn:
+            nextFormat.setPgfPlacement( MifDoc::sColumnTop );
+            break;
+        default:
+            nextFormat.setPgfPlacement( MifDoc::sAnywhere );
+    }
+    pendingBreak = symbolFalse;
+
+    Length lineSpacing;
+    Length extraSpaceBefore = 0; 
+    if( servesAsWrapper ) {
+        if( height < 2000 ) {   // FrameMaker minimum is 2pt    
+            if( allowNegativeLeading )
+                nextFormat.setPgfLeading( height - 2000 );
+            else
+                pendingEffectiveDisplaySpace.nominal
+                  -= ( pendingEffectiveDisplaySpace.nominal > 2000 )
+                        ? 2000 : pendingEffectiveDisplaySpace.nominal;
+                 // try to steal as much as possible from space before
+            height = 2000;
+        }
+        //if( effectiveDisplaySpace.nominal <= 0 )
+         //    extraSpaceBefore = 1; // FrameMaker bug workaround    
+        //nextFormat.setFSize( height );
+        lineSpacing = height;
+        nextFormat.setFColor( MifDoc::sWhite );
+        nextFormat.setPgfLineSpacing( MifDoc::sFixed );
+    } else {
+        //nextFormat.setFSize( computeLengthSpec( nextFormat.FotLineSpacingSpec.length ) );
+        lineSpacing = computeLengthSpec( nextFormat.FotLineSpacingSpec.length );
+        if( nextFormat.FotMinLeading.hasLength ) // but ignore the actual min-leading value
+            nextFormat.PgfLineSpacing = MifDoc::sProportional;
+        else
+            nextFormat.PgfLineSpacing = MifDoc::sFixed;
+    }
+    
+    nextFormat.setPgfSpBefore( pendingEffectiveDisplaySpace.nominal + extraSpaceBefore );
+    pendingEffectiveDisplaySpace.clear();
+
+    nextFormat.setPgfLIndent( computeLengthSpec( nextFormat.FotStartIndentSpec ) );
+    nextFormat.setPgfFIndent( computeLengthSpec( nextFormat.FotFirstLineStartIndentSpec )
+                               + nextFormat.PgfLIndent );
+    nextFormat.setPgfRIndent( computeLengthSpec( nextFormat.FotEndIndentSpec ) );
+
+    nextFormat.setPgfPlacementStyle
+     ( nextFormat.FotSpan > 1 ? MifDoc::sStraddle : MifDoc::sNormal );
+    start();
+
+    MifDoc::Para *p
+     = new MifDoc::Para( mifDoc.curTagStream().content().stream().CurTagIndent + 4 );
+    p->setParagraphFormat( mifDoc.curFormat() );
+    p->format().updateFrom( format() );
+    p->format().FSize = mifDoc.curFormat().FSize;
+    p->format().ffSetProperties() &= ~MifDoc::FontFormat::fFSize;
+    if( p->format().FSize != lineSpacing )
+        p->format().setFSize( lineSpacing );
+    p->curFormat() = p->format();
+    // assert( mifDoc.curPara( false ) == NULL );
+    mifDoc.setCurPara( p );
+    mifDoc.enterPara( *mifDoc.curPara() );
+    lastFlowObjectWasWhitespace = false;
+    outPendingInlineStatements();
+
+    // mifDoc.curFormat().out( mifDoc.os() );
+    // mifDoc.beginParaLine();
+}
+
+void MifFOTBuilder::doEndParagraph
+ ( bool sustainFormatStack, bool sustainDisplayStack, bool paragraphBreakTest,
+   bool discardThisPara ) {
+
+//    mifDoc.endParaLine();
+//    MifDoc::Para::outEpilog( mifDoc.os() );
+
+    DisplayInfo *curDs = displayStack.head();
+    assert( curDs != NULL );
+
+    if( !sustainFormatStack )
+        end();
+    if( !sustainDisplayStack )
+        endDisplay();
+
+    if( paragraphBreakTest && paragraphBreakInEffect ) {
+        paragraphBreakInEffect = false;
+        end();
+    }
+
+// Desc: Content of document missing in the debug version
+// Author: Seshadri
+// Date: 24th feb 2000
+
+    if( !curDs->paragraphClosedInMif ) {
+        MifDoc::Para *p = mifDoc.curPara();
+        mifDoc.exitPara();
+        if( !discardThisPara ) {
+            p->out( mifDoc.os() );
+            mifDoc.curFormat().updateFrom( p->format() );
+        }
+        delete p;
+    }
+}
+
+void MifFOTBuilder::startDisplayGroup( const DisplayGroupNIC &nic ) {
+
+    startDisplay( nic );
+    start();
+}
+
+void MifFOTBuilder::endDisplayGroup() {
+
+    end();
+    endDisplay();
+}
+
+void MifFOTBuilder::startDisplay( const DisplayNIC &nic ) {
+
+    if( !inSimplePageSequence ) {
+        if( !bookComponentOpened ) {
+            mifDoc.enterBookComponent();
+            initMifBookComponent();
+            bookComponentOpened = true;
+        }
+        bookComponentAvailable = false;
+    }
+
+    displaySpaceQueue.append
+     ( new DisplaySpaceInfo( nic.spaceBefore, nic.breakBefore, false ) );
+
+    DisplayInfo *di = displayStack.head();
+    if( di != NULL && di->isParagraph && !di->paragraphClosedInMif ) {
+        if( mifDoc.curPara()->content().isEmpty() ) {
+            doEndParagraph( true, true, true, true );
+        } else
+            doEndParagraph( true, true );
+        di->paragraphClosedInMif = true;
+    }
+
+    if( curTable().CurCell != NULL )
+        nextFormat.FotCurDisplaySize = curTable().CurCell->displaySize;
+    else if( nextFormat.FotSpan > 1 )
+        nextFormat.FotCurDisplaySize
+         = nextFormat.FotPageWidth - nextFormat.FotLeftMargin - nextFormat.FotRightMargin;
+    else
+        nextFormat.FotCurDisplaySize
+         = ( nextFormat.FotPageWidth - nextFormat.FotLeftMargin - nextFormat.FotRightMargin
+              - nextFormat.FotPageColumnSep * ( nextFormat.FotPageNColumns - 1 ) )  
+            / nextFormat.FotPageNColumns;
+
+    displayStack.insert( new DisplayInfo( nic, displayStack.head() ) );
+}
+
+void MifFOTBuilder::endDisplay() {
+
+    DisplayInfo *di = displayStack.get();
+    
+    displaySpaceQueue.append
+     ( new DisplaySpaceInfo( di->spaceAfter, di->breakAfter, true ) );
+
+    delete di;
+}
+
+void MifFOTBuilder::startSimplePageSequenceSerial() {
+
+    inSimplePageSequence = true;
+    firstHeaderFooter = true;
+
+    bool openBookComponent = true;
+    if( bookComponentOpened ) {
+        if( bookComponentAvailable ) {
+            openBookComponent = false;
+            bookComponentAvailable = false;
+        } else
+            mifDoc.exitBookComponent();
+    }
+
+    if( openBookComponent ) {
+        mifDoc.enterBookComponent();
+        initMifBookComponent();
+        bookComponentOpened = true;
+        bookComponentAvailable = false;
+    }
+
+//      Desc: Pagesize was being initialized but not set after
+//      the attribute was read .
+
+        mifDoc.document().setDPageSize
+    ( MifDoc::T_WH( MifDoc::T_dimension( nextFormat.FotPageWidth ),
+                    MifDoc::T_dimension( nextFormat.FotPageHeight ) ) );
+
+    nextFormat.FotCurDisplaySize
+     = ( nextFormat.FotPageWidth - nextFormat.FotLeftMargin - nextFormat.FotRightMargin
+          - nextFormat.FotPageColumnSep * ( nextFormat.FotPageNColumns - 1 ) )  
+        / nextFormat.FotPageNColumns;
+
+    mifDoc.document().setDColumns( nextFormat.FotPageNColumns );
+    if( nextFormat.FotPageNColumns > 1 )
+        mifDoc.document().setDColumnGap( nextFormat.FotPageColumnSep );
+
+    mifDoc.document().setProperties &= ~MifDoc::Document::fDMargins;
+
+    start();
+
+    FotSimplePageSequence.paragraphFormat = format();
+}
+
+void MifFOTBuilder::endSimplePageSequenceSerial() {
+
+    end();
+    mifDoc.exitTextFlow();
+    mifDoc.exitBookComponent();
+    inSimplePageSequence = false;
+    bookComponentOpened = false;
+    bookComponentAvailable = false;
+}
+
+void MifFOTBuilder::makeEmptyTextFlow( MifDoc::TextRect &textRect ) {
+
+    MifDoc::TextFlow &textFlow = *(new MifDoc::TextFlow( textRect, true ));
+    mifDoc.textFlows().push_back( textFlow );
+
+    mifDoc.enterTextFlow( textFlow );
+    MifDoc::Para::outSimpleProlog( mifDoc.os() );
+    MifDoc::ParaLine::outProlog( mifDoc.os() );
+    MifDoc::ParaLine::outEpilog( mifDoc.os() );
+    MifDoc::Para::outEpilog( mifDoc.os() );
+    mifDoc.exitTextFlow();
+}
+
+void MifFOTBuilder::beginHeaderFooter( bool header ) {
+
+    start();
+
+    MifDoc::Para p;
+    p.setPgfTag( header ? MifDoc::sHeader : MifDoc::sFooter );
+    p.setProperties &= ~MifDoc::Para::fParagraphFormat;
+    p.outProlog( mifDoc.os() );
+
+    MifDoc::FontFormat ff;
+    ff.setFSize( format().FSize );
+    ff.out( mifDoc.os(), MifDoc::FontFormat::fFSize, MifDoc::FontFormat::stFont );
+
+    mifDoc.beginParaLine();
+}
+
+void MifFOTBuilder::endHeaderFooter( unsigned hfPart ) {
+
+    mifDoc.endParaLine();
+    MifDoc::Para::outEpilog( mifDoc.os() );
+
+//  Right header missing beacuse the prev stmt has set
+//  currentlyopened flag to false for a right footer. So reset it.
+        if ( hfPart & rightHF ) {
+                MifDoc::Para::currentlyOpened= true ;
+        }
+
+    end();
+}
+
+void MifFOTBuilder::setupSimplePageSequence() {
+
+    MifDoc::Page &firstMasterPage
+     = *(new MifDoc::Page( MifDoc::sOtherMasterPage, MifDoc::sFirst ));
+    MifDoc::Page &rightMasterPage
+     = *(new MifDoc::Page( MifDoc::sRightMasterPage, MifDoc::sRight ));
+    MifDoc::Page &leftMasterPage
+     = *(new MifDoc::Page( MifDoc::sLeftMasterPage, MifDoc::sLeft ));
+    MifDoc::Page &bodyPage
+     = *(new MifDoc::Page( MifDoc::sBodyPage, MifDoc::sNONE, MifDoc::sFirst ));
+
+    MifDoc::T_LTWH bodyRect;
+    MifDoc::T_LTWH headerRect;
+    MifDoc::T_LTWH footerRect;
+
+    bodyRect.l = format().FotLeftMargin;
+    bodyRect.t = format().FotTopMargin;
+    bodyRect.w = format().FotPageWidth - format().FotLeftMargin - format().FotRightMargin;
+    bodyRect.h = format().FotPageHeight - format().FotTopMargin - format().FotBottomMargin;
+
+    headerRect.l = format().FotLeftMargin;
+    headerRect.t = 0;
+    headerRect.w = bodyRect.w;
+    headerRect.h = format().FotTopMargin;
+
+    footerRect.l = format().FotLeftMargin;
+    footerRect.t = format().FotPageHeight - format().FotBottomMargin;
+
+    footerRect.w = bodyRect.w;
+    footerRect.h = format().FotBottomMargin;
+   {
+    MifDoc::TextRect &firstBodyTextRect
+     = *(new MifDoc::TextRect( bodyRect, format().FotPageNColumns, format().FotPageColumnSep,
+                               format().FotPageBalanceColumns ));
+    MifDoc::TextRect &rightBodyTextRect
+     = *(new MifDoc::TextRect( bodyRect, format().FotPageNColumns, format().FotPageColumnSep,
+                               format().FotPageBalanceColumns));
+    MifDoc::TextRect &leftBodyTextRect
+     = *(new MifDoc::TextRect( bodyRect, format().FotPageNColumns, format().FotPageColumnSep,
+                               format().FotPageBalanceColumns ));
+    MifDoc::TextRect &bodyTextRect
+     = *(new MifDoc::TextRect( bodyRect, format().FotPageNColumns, format().FotPageColumnSep,
+                               format().FotPageBalanceColumns ));
+    MifDoc::TextRect &firstHeaderTextRect = *(new MifDoc::TextRect( headerRect ));
+    MifDoc::TextRect &rightHeaderTextRect = *(new MifDoc::TextRect( headerRect ));
+    MifDoc::TextRect &leftHeaderTextRect = *(new MifDoc::TextRect( headerRect ));
+    MifDoc::TextRect &firstFooterTextRect = *(new MifDoc::TextRect( footerRect ));
+    MifDoc::TextRect &rightFooterTextRect = *(new MifDoc::TextRect( footerRect ));
+    MifDoc::TextRect &leftFooterTextRect = *(new MifDoc::TextRect( footerRect ));
+
+    firstMasterPage.TextRects.push_back( firstHeaderTextRect );
+    firstMasterPage.TextRects.push_back( firstBodyTextRect );
+    firstMasterPage.TextRects.push_back( firstFooterTextRect );
+
+    rightMasterPage.TextRects.push_back( rightHeaderTextRect );
+    rightMasterPage.TextRects.push_back( rightBodyTextRect );
+    rightMasterPage.TextRects.push_back( rightFooterTextRect );
+
+    leftMasterPage.TextRects.push_back( leftHeaderTextRect );
+    leftMasterPage.TextRects.push_back( leftBodyTextRect );
+    leftMasterPage.TextRects.push_back( leftFooterTextRect );
+
+    bodyPage.TextRects.push_back( bodyTextRect );
+    mifDoc.pages().push_back( bodyPage );
+    mifDoc.pages().push_back( firstMasterPage );
+    mifDoc.pages().push_back( rightMasterPage );
+    mifDoc.pages().push_back( leftMasterPage );
+
+    MifDoc::ParagraphFormat headerPF;
+    headerPF.setDSSSLDefaults();
+    MifDoc::ParagraphFormat footerPF;
+    footerPF.setDSSSLDefaults();
+    setupHeaderFooterParagraphFormat( headerPF, footerPF, bodyRect.w );
+
+    FotSimplePageSequence.BodyTextFlow
+     = new MifDoc::TextFlow( bodyTextRect, true, &FotSimplePageSequence.paragraphFormat,
+                             MifDoc::sDefaultPgfFormat );
+    FotSimplePageSequence.FirstHeaderTextFlow
+     = new MifDoc::TextFlow( firstHeaderTextRect, false, &headerPF, MifDoc::sHeader );
+    FotSimplePageSequence.FirstFooterTextFlow
+     = new MifDoc::TextFlow( firstFooterTextRect, false, &footerPF, MifDoc::sFooter );
+    FotSimplePageSequence.LeftHeaderTextFlow
+     = new MifDoc::TextFlow( leftHeaderTextRect, false, &headerPF, MifDoc::sHeader );
+    FotSimplePageSequence.LeftFooterTextFlow
+     = new MifDoc::TextFlow( leftFooterTextRect, false, &footerPF, MifDoc::sFooter );
+    FotSimplePageSequence.RightHeaderTextFlow
+     = new MifDoc::TextFlow( rightHeaderTextRect, false, &headerPF, MifDoc::sHeader );
+    FotSimplePageSequence.RightFooterTextFlow
+     = new MifDoc::TextFlow( rightFooterTextRect, false, &footerPF, MifDoc::sFooter );
+
+    makeEmptyTextFlow( firstBodyTextRect );
+    makeEmptyTextFlow( leftBodyTextRect );
+    makeEmptyTextFlow( rightBodyTextRect );
+
+    mifDoc.textFlows().push_back( *FotSimplePageSequence.BodyTextFlow );
+    mifDoc.textFlows().push_back( *FotSimplePageSequence.FirstHeaderTextFlow );
+    mifDoc.textFlows().push_back( *FotSimplePageSequence.FirstFooterTextFlow );
+    mifDoc.textFlows().push_back( *FotSimplePageSequence.LeftHeaderTextFlow );
+    mifDoc.textFlows().push_back( *FotSimplePageSequence.LeftFooterTextFlow );
+    mifDoc.textFlows().push_back( *FotSimplePageSequence.RightHeaderTextFlow );
+    mifDoc.textFlows().push_back( *FotSimplePageSequence.RightFooterTextFlow );
+
+    mifDoc.document().setDTwoSides( true );
+    mifDoc.document().setDParity( MifDoc::sFirstRight );
+  }
+
+  mifDoc.enterTextFlow( *FotSimplePageSequence.BodyTextFlow );
+}
+
+void MifFOTBuilder::startSimplePageSequenceHeaderFooter( unsigned hfPart ) {
+
+    if( firstHeaderFooter ) { setupSimplePageSequence(); firstHeaderFooter = false; }
+
+    MifDoc::TextFlow *curTextFlow;
+
+    if( hfPart & firstHF )
+        if( hfPart & frontHF )
+            if( hfPart & headerHF )
+                curTextFlow = FotSimplePageSequence.FirstHeaderTextFlow;
+            else
+                curTextFlow = FotSimplePageSequence.FirstFooterTextFlow;
+        else
+            return;
+    else
+        if( hfPart & frontHF )
+            if( hfPart & headerHF )
+                curTextFlow = FotSimplePageSequence.RightHeaderTextFlow;
+            else
+                curTextFlow = FotSimplePageSequence.RightFooterTextFlow;
+        else
+            if( hfPart & headerHF )
+                curTextFlow = FotSimplePageSequence.LeftHeaderTextFlow;
+            else
+                curTextFlow = FotSimplePageSequence.LeftFooterTextFlow;
+
+    mifDoc.enterTextFlow( *curTextFlow );
+
+    if( hfPart & (centerHF | rightHF) )
+        mifDoc.outSpecialChar( MifDoc::sTab );
+    else // leftHF
+        (hfPart & headerHF) ? beginHeader() : beginFooter();
+}
+
+void MifFOTBuilder::endSimplePageSequenceHeaderFooter( unsigned hfPart ) {
+
+    if( hfPart & rightHF && (hfPart & frontHF || !(hfPart & firstHF)) ) {
+        endHeaderFooter(hfPart);
+    }
+
+    if( !(hfPart & firstHF) || hfPart & frontHF )
+        mifDoc.exitTextFlow();
+}
+
+void MifFOTBuilder::setupHeaderFooterParagraphFormat
+ ( MifDoc::ParagraphFormat &hpf, MifDoc::ParagraphFormat &fpf,
+   MifDoc::T_dimension textRectWidth ) {
+
+    MifDoc::TabStop centerTS( MifDoc::sCenter, textRectWidth / 2 );
+    MifDoc::TabStop rightTS( MifDoc::sRight, textRectWidth );
+
+    hpf.setFrom( FotSimplePageSequence.paragraphFormat, 0, MifDoc::FontFormat::fAll );
+    hpf.TabStops.push_back( centerTS );
+    hpf.TabStops.push_back( rightTS );
+    hpf.setProperties |= MifDoc::ParagraphFormat::fTabStops;
+    fpf = hpf;
+    hpf.setFSize( ( ( format().FotBottomMargin - format().FotFooterMargin ) * 3 ) / 2 );
+    fpf.setFSize( ( format().FotHeaderMargin * 3 ) / 2 );
+    hpf.setPgfTag( MifDoc::sHeader );
+    fpf.setPgfTag( MifDoc::sFooter );
+
+    mifDoc.pgfCatalog().ParaFormats.push_back( hpf );
+    mifDoc.pgfCatalog().ParaFormats.push_back( fpf );
+
+    hpf.clearSetProperties();
+    fpf.clearSetProperties();
+}
+
+void MifFOTBuilder::endAllSimplePageSequenceHeaderFooter() {
+
+//    mifDoc.enterTextFlow( *FotSimplePageSequence.BodyTextFlow );
+}
+
+inline void MifFOTBuilder::pageNumber() {
+
+    mifDoc.outPageNumber();
+}
+
+// --------- MifFOTBuilder::Table ---------------------------------------------
+
+void MifFOTBuilder::Table::resolveBorders
+      ( Vector<Row> &rows, bool hasFirstTableRow, bool hasLastTableRow ) {
+
+    bool isFirstRow;
+    bool isLastRow;
+    bool isFirstColumn;
+    bool isLastColumn;
+    Cell *cell = NULL;
+    size_t r, c, rr, cc;
+    bool leftEdge, topEdge;
+
+    for( r = 0; r < rows.size(); r++ ) {
+      for( c = 0; c < rows[r].Cells.size()-1; c++ ) {
+        cell = &rows[r].Cells[c];
+        if( cell->OverlappingCell == NULL ) {
+          for( rr = r; rr < r + cell->nRowsSpanned; rr++ ) {
+            for( cc = c, leftEdge = true; cc < c + cell->nColumnsSpanned; cc++ ) {
+              rows[rr].Cells[cc].OverlappingCell = cell;
+            }
+          }
+        }
+      }
+    }
+
+    for( r = 0; r < rows.size(); r++ ) {
+        for( c = 0; c < rows[r].Cells.size() - 1; c++ ) {
+            cell = &rows[r].Cells[c];
+            if( cell->OverlappingCell == cell ) {
+                for( rr = r, topEdge = true; rr < r + cell->nRowsSpanned; rr++ ) {
+                    isFirstRow = ( rr == 0 ) ? true : false;
+                    isLastRow = ( rr == rows.size() - 1 ) ? true : false;
+                    for( cc = c, leftEdge = true; cc < c + cell->nColumnsSpanned; cc++ ) {
+                        isFirstColumn = ( cc == 0 ) ? true : false;
+                        isLastColumn = ( cc == rows[rr].Cells.size() - 2 ) ? true : false;
+
+                        if( leftEdge )
+                            if( isFirstColumn ) {
+                                cell->beforeColumnBorder.resolve( beforeColumnBorder );
+                            } else
+                                cell->beforeColumnBorder.resolve
+                                 ( rows[rr].Cells[cc-1].OverlappingCell->afterColumnBorder );
+
+                        if( topEdge )
+                            if( isFirstRow && hasFirstTableRow )
+                                cell->beforeRowBorder.resolve( beforeRowBorder );
+                            else
+                                if( !isFirstRow )
+                                    cell->beforeRowBorder.resolve
+                                     ( rows[rr-1].Cells[cc].OverlappingCell->afterRowBorder );
+
+                        if( isLastColumn )
+                            cell->afterColumnBorder.resolve( afterColumnBorder );
+
+                        if( isLastRow && hasLastTableRow )
+                            cell->afterRowBorder.resolve( afterRowBorder );
+                        
+                        leftEdge = false;
+                    }
+                    topEdge = false;
+                }
+            }                
+        }
+    }
+}
+
+void MifFOTBuilder::Table::begin( MifDoc &mifDoc ) {
+
+    CurCell = NULL;
+    NoTablePartsSeen = true;
+
+    TableParts.resize( 0 );
+    TableParts.resize( 1 );
+    TableParts.back().begin( *this, mifDoc );
+}
+
+// --------- MifFOTBuilder::TablePart -----------------------------------------
+
+void MifFOTBuilder::TablePart::begin( Table &parent, MifDoc &mifDoc ) {
+
+    Columns.resize( 0 );
+    Header.resize( 0 );
+    Body.resize( 0 );
+    Footer.resize( 0 );
+    
+    columnsProcessed = false;
+    needsColumnReprocessing = false;
+
+    ParentTable = &parent;
+    parentTable().CurRows = &Body;    
+    parentTable().CurTablePart = this;
+    
+    if( MifTableNum == 0 ) {
+        mifDoc.tbls().resize( mifDoc.tbls().size() + 1 );
+        MifTableNum = mifDoc.tbls().size();
+        MifDoc::CurInstance->setCurTblNum( MifTableNum );
+    }
+}
+
+void MifFOTBuilder::TablePart::translate( MifDoc &mifDoc ) {
+
+    if( needsColumnReprocessing )
+        processColumns();
+
+    MifDoc::Tbl &mifTbl = mifTable( mifDoc );
+    if( parentTable().startIndent != 0 ) { // DSSSL default
+        mifTbl.tblFormat.setTblLIndent( parentTable().startIndent );
+        mifTbl.setProperties |= MifDoc::Tbl::fTblFormat;
+    }
+
+    if( parentTable().displayAlignment != symbolStart ) {
+        mifTbl.setProperties |= MifDoc::Tbl::fTblFormat;
+        MifDoc::T_keyword mifAlignment = MifDoc::sLeft;
+        switch( parentTable().displayAlignment ) {
+            case symbolStart:   mifAlignment = MifDoc::sLeft; break;
+            case symbolEnd:     mifAlignment = MifDoc::sRight; break;
+            case symbolCenter:  mifAlignment = MifDoc::sCenter; break;
+            case symbolInside:  mifAlignment = MifDoc::sInside; break;
+            case symbolOutside: mifAlignment = MifDoc::sOutside; break;
+            default: assert( false );
+        }
+        mifTbl.tblFormat.setTblAlignment( mifAlignment );
+    }
+
+    bool putHeaderInBody = Body.size() == 0 && Header.size() > 0;
+    bool putFooterInBody = !putHeaderInBody && Body.size() == 0 && Footer.size() > 0;
+    for( size_t i = 0; i < Header.size(); i++ )
+        Header[i].translate( putHeaderInBody ? mifTbl.TblBody : mifTbl.TblH, mifDoc );
+    for( size_t i = 0; i < Body.size(); i++)
+        Body[i].translate( mifTbl.TblBody, mifDoc );
+    for( size_t i = 0; i < Footer.size(); i++ )
+        Footer[i].translate( putFooterInBody ? mifTbl.TblBody : mifTbl.TblF, mifDoc );
+}
+
+void MifFOTBuilder::TablePart::processColumns() {
+
+    MifDoc::Tbl &mifTbl = mifTable( *MifDoc::CurInstance );
+    mifTbl.setTblNumColumns( 0 );
+    mifTbl.setTblNumColumns( Columns.size() );
+    mifTbl.TblColumnWidths.resize( 0 );
+    mifTbl.TblColumnWidths.resize( Columns.size() );
+    mifTbl.TblColumnWidthsAreSet();
+
+    long totalNonproportionalWidth = 0L;
+    double totalProportionalUnits = 0.0;
+    for( size_t i = 0; i < Columns.size(); i++ ) {
+        if( Columns[i].hasWidth ) {
+            if( Columns[i].width.tableUnitFactor ) {
+                totalProportionalUnits += Columns[i].width.tableUnitFactor;
+            } else {
+                mifTbl.TblColumnWidths[i]
+                 = MifFOTBuilder::curInstance().computeLengthSpec( Columns[i].width );
+                totalNonproportionalWidth += mifTbl.TblColumnWidths[i];
+            }
+        }
+    }
+
+    double proportionalUnit = 0.0;
+    if( totalProportionalUnits )
+        proportionalUnit
+         = ( parentTable().tableWidth - totalNonproportionalWidth ) / totalProportionalUnits;
+    
+    for( size_t i = 0; i < Columns.size(); i++ ) {
+        if( Columns[i].hasWidth ) {
+            if( Columns[i].width.tableUnitFactor )
+                mifTbl.TblColumnWidths[i]
+                 = long(proportionalUnit * Columns[i].width.tableUnitFactor);
+        } else 
+            mifTbl.TblColumnWidths[i] = long(proportionalUnit);
+    }
+
+    columnsProcessed = true;
+}
+
+void MifFOTBuilder::TablePart::normalizeRows() {
+
+  size_t maxCellsInRow = Columns.size()+1;
+  Vector<Row> *rows;  
+  for( int step = 0; step < 2; step++ ) {
+    for( int rowType = 0; rowType < 3; rowType++ ) {
+      switch( rowType ) {
+        case 0: rows = &Header; break;
+        case 1: rows = &Body; break;
+        default: rows = &Footer;
+      }
+      for( size_t r = 0; r < rows->size(); r++ ) {
+        if( step == 0 ) {
+          if( (*rows)[r].Cells.size() > 1 ) {
+            size_t lastCellIdx = (*rows)[r].Cells.size()-2;
+            Cell &lastCell = (*rows)[r].Cells[lastCellIdx];
+            if( !lastCell.missing
+                  &&
+                lastCellIdx+lastCell.nColumnsSpanned+1 > maxCellsInRow )
+              maxCellsInRow = lastCellIdx+lastCell.nColumnsSpanned+1;
+          }
+        } else if( (*rows)[r].Cells.size() < maxCellsInRow )
+          (*rows)[r].Cells.resize( maxCellsInRow );
+      }
+    }
+  }
+}
+
+// --------- MifFOTBuilder::Row -----------------------------------------------
+
+void MifFOTBuilder::Row::translate( Vector<MifDoc::Row> &mifRows, MifDoc &mifDoc ) {
+
+    mifRows.resize( mifRows.size() + 1 );
+    MifDoc::Row &mifRow = mifRows.back();
+    mifRow.Cells.resize( Cells.size() - 1 );
+    for( size_t i = 0; i + 1 < Cells.size(); i++ ) {
+        Cells[i].translate( Cells[i].mifCell(), mifDoc );
+        mifRow.Cells[i] = Cells[i].mifCell();    
+    }
+}
+
+// --------- MifFOTBuilder::Cell ----------------------------------------------
+
+void MifFOTBuilder::Cell::translate( MifDoc::Cell &mifCell, MifDoc &mifDoc ) {
+
+   MifDoc::T_tagstring rulingTag; 
+
+   rulingTag = beforeRowBorder.makeMifRuling( mifDoc );
+   if( rulingTag.size() )
+       mifCell.setCellTRuling( rulingTag );
+
+   rulingTag = afterRowBorder.makeMifRuling( mifDoc );
+   if( rulingTag.size() )
+       mifCell.setCellBRuling( rulingTag );
+
+   rulingTag = beforeColumnBorder.makeMifRuling( mifDoc );
+   if( rulingTag.size() )
+       mifCell.setCellLRuling( rulingTag );
+
+   rulingTag = afterColumnBorder.makeMifRuling( mifDoc );
+   if( rulingTag.size() )
+       mifCell.setCellRRuling( rulingTag );
+}
+
+// --------- MifFOTBuilder::Border --------------------------------------------
+
+void MifFOTBuilder::Border::setFromFot() {
+
+    MifFOTBuilder::Format &f = MifFOTBuilder::curInstance().format();
+    borderPriority = f.FotBorderPriority;
+    borderPresent = f.FotBorderPresent;
+    lineThickness = f.FotLineThickness;
+    lineRepeat = f.FotLineRepeat;
+    lineSep  = f.FotLineSep;
+    color = f.FColor;
+}
+
+MifDoc::T_tagstring MifFOTBuilder::Border::makeMifRuling( MifDoc &mifDoc ) {
+
+    MifDoc::T_tagstring result;
+
+    if( borderPresent ) {
+
+        MifDoc::Ruling *mifRuling = new MifDoc::Ruling;
+    
+        mifRuling->setRulingPenWidth( lineThickness );
+        mifRuling->setRulingLines( lineRepeat >= 2 ? 2 : lineRepeat );
+        mifRuling->setRulingGap( lineRepeat >= 2 ? lineSep - lineThickness : 0 );
+        mifRuling->setRulingColor( color );
+    
+        result = MifDoc::T_tagstring( mifRuling->key( *mifRuling ) );
+        mifRuling->setRulingTag( result );
+
+        if( mifDoc.rulingCatalog().Rulings.lookup( result ) == NULL ) {
+            mifDoc.rulingCatalog().Rulings.insert( mifRuling );    
+        } else
+            delete mifRuling;
+    }
+
+    return result;
+}
+
+void MifFOTBuilder::Border::resolve( Border &adjacentBorder ) {
+    
+    if( adjacentBorder.borderPriority > borderPriority
+         ||
+        (   adjacentBorder.borderPriority == borderPriority 
+         && !adjacentBorder.cellBorder
+         && adjacentBorder.borderPresent ) ) {
+
+        lineThickness = adjacentBorder.lineThickness;
+        borderPresent = adjacentBorder.borderPresent;
+        lineRepeat = adjacentBorder.lineRepeat;
+        lineSep = adjacentBorder.lineSep;
+        color = adjacentBorder.color;
+
+        if( adjacentBorder.cellBorder )
+            adjacentBorder.borderPresent = false;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MifFOTBuilder::setFontSize( long n ) {
+
+    nextFormat.FSize = n;
+}
+
+void MifFOTBuilder::setLineSpacing( const LengthSpec &l ) {
+
+    nextFormat.FotLineSpacingSpec = l;
+}
+
+void MifFOTBuilder::setFontWeight( Symbol weight ) {
+
+    if( weight > symbolMedium ) {
+        nextFormat.FWeight = MifDoc::sBold;
+    } else {
+        nextFormat.FWeight = MifDoc::sRegular;
+    }
+}
+
+void MifFOTBuilder::setFontPosture( Symbol posture ) {
+
+    switch( posture ) {
+
+      case symbolOblique:
+      case symbolBackSlantedOblique:
+      case symbolItalic:
+      case symbolBackSlantedItalic:
+
+        nextFormat.FAngle = MifDoc::sItalic;
+        break;
+
+      default:
+        nextFormat.FAngle = MifDoc::sRegular;
+    }
+}
+
+inline void MifFOTBuilder::setStartIndent( const LengthSpec &l ) {
+
+    nextFormat.FotStartIndentSpec = l;
+}
+
+inline void MifFOTBuilder::setEndIndent( const LengthSpec &l ) {
+
+    nextFormat.FotEndIndentSpec = l;
+}
+
+inline void MifFOTBuilder::setFirstLineStartIndent( const LengthSpec &l ) {
+
+    nextFormat.FotFirstLineStartIndentSpec = l;
+}
+
+void MifFOTBuilder::setQuadding( Symbol quadding ) {
+
+    switch( quadding ) {
+
+      case symbolEnd:
+
+        nextFormat.PgfAlignment = MifDoc::sRight;
+        break;
+
+      case symbolCenter:
+
+        nextFormat.PgfAlignment = MifDoc::sCenter;
+        break;
+
+      case symbolJustify:
+
+        nextFormat.PgfAlignment = MifDoc::sLeftRight;
+        break;
+
+      default: // symbolStart
+        nextFormat.PgfAlignment = MifDoc::sLeft;
+    }
+}
+
+inline void MifFOTBuilder::setKern( bool kern ) {
+
+    nextFormat.FPairKern = kern;
+}
+
+inline void MifFOTBuilder::setLanguage( Letter2 code ) {
+
+    nextFormat.FotLanguage = code;
+    nextFormat.computePgfLanguage();
+}
+
+inline void MifFOTBuilder::setCountry( Letter2 code ) {
+
+    nextFormat.FotCountry = code;
+    nextFormat.computePgfLanguage();
+}
+
+inline void MifFOTBuilder::setHyphenate( bool hyphenate ) {
+
+    nextFormat.PgfHyphenate = hyphenate;
+}
+
+inline void MifFOTBuilder::setHyphenationRemainCharCount( long n ) {
+
+    nextFormat.HyphenMinPrefix = n;
+}
+
+inline void MifFOTBuilder::setHyphenationPushCharCount( long n ) {
+
+    nextFormat.HyphenMinSuffix = n;
+}
+
+inline void MifFOTBuilder::setHyphenationLadderCount( long n ) {
+
+    nextFormat.HyphenMaxLines = n;
+}
+
+void MifFOTBuilder::setFontFamilyName( const StringC &s ) {
+
+    nextFormat.FFamily.resize( 0 );
+    for( size_t i = 0; i < s.size(); i++ )
+        nextFormat.FFamily += char(s[i]);
+}
+
+inline void MifFOTBuilder::setWidowCount( long n ) {
+
+    nextFormat.PgfBlockSize = n;
+}
+
+inline void MifFOTBuilder::setOrphanCount( long n ) {
+
+    nextFormat.PgfBlockSize = n;
+}
+
+inline void MifFOTBuilder::setPageWidth( Length pWidth ) {
+
+    nextFormat.FotPageWidth = pWidth;
+}
+
+inline void MifFOTBuilder::setPageHeight( Length pHeight ) {
+
+    nextFormat.FotPageHeight = pHeight;
+}
+
+inline void MifFOTBuilder::setLeftMargin( Length leftM ) {
+
+    nextFormat.FotLeftMargin = leftM;
+}
+
+inline void MifFOTBuilder::setRightMargin( Length rightM ) {
+
+    nextFormat.FotRightMargin = rightM;
+}
+
+inline void MifFOTBuilder::setTopMargin( Length topM ) {
+
+    nextFormat.FotTopMargin = topM;
+}
+
+inline void MifFOTBuilder::setBottomMargin( Length bottomM ) {
+
+    nextFormat.FotBottomMargin = bottomM;
+}
+
+void MifFOTBuilder::setHeaderMargin( Length headerM ) {
+
+    nextFormat.FotHeaderMargin = headerM;
+}
+
+void MifFOTBuilder::setFooterMargin( Length footerM ) {
+
+    nextFormat.FotFooterMargin = footerM;
+}
+
+void MifFOTBuilder::setDisplayAlignment( Symbol alignment ) {
+
+    nextFormat.FotDisplayAlignment = alignment;
+}
+
+//--------- LEADERS -----------------------------------------------------------
+
+void MifFOTBuilder::startLeader( const LeaderNIC & ) {
+
+    checkForParagraphReopening();
+    lastFlowObjectWasWhitespace = false;
+
+    mifDoc.outSpecialChar( MifDoc::sTab );
+    inLeader = true;
+    setCurLeaderStream( new MifTmpOutputByteStream() );
+}
+
+void MifFOTBuilder::endLeader() {
+
+    if( !mifDoc.curPara()->leaderTabsSet ) {
+        String<char> leaderStr;
+        curLeaderStream().commit( leaderStr );
+
+        int numTabs = mifDoc.curFormat().PgfNumTabs + 1;
+        mifDoc.curFormat().setPgfNumTabs( numTabs );
+        mifDoc.curPara()->format().TabStops.push_back
+         ( MifDoc::TabStop( MifDoc::sRight, format().FotCurDisplaySize
+                                             - mifDoc.curFormat().PgfRIndent - 1,
+                            MifDoc::T_string( leaderStr ) ) );
+        mifDoc.curPara()->format().setPgfNumTabs( numTabs );
+        mifDoc.curPara()->curFormat().setPgfNumTabs( numTabs );
+        mifDoc.curPara()->format().setProperties |= MifDoc::ParagraphFormat::fTabStops;
+
+        mifDoc.curPara()->leaderTabsSet = true;
+    }
+
+    if( CurLeaderStream ) {
+        delete CurLeaderStream;
+        CurLeaderStream = NULL;
+    }
+    inLeader = false;
+    lastFlowObjectWasWhitespace = false;
+}
+
+//--------- LINE FIELDS -------------------------------------------------------
+
+void MifFOTBuilder::startLineField( const LineFieldNIC & ) {
+
+    checkForParagraphReopening();
+    lastFlowObjectWasWhitespace = false;
+
+    Length fieldWidth = computeLengthSpec( nextFormat.FotFieldWidth );
+    Length firstLineIndent = mifDoc.curPara()->format().PgfFIndent;
+    bool leadingTab = true;
+    switch( nextFormat.FotFieldAlign ) {
+        case symbolStart: default:
+            mifDoc.curPara()->format().TabStops.push_back
+             ( MifDoc::TabStop( MifDoc::sLeft, firstLineIndent + fieldWidth ) );
+            leadingTab = false;
+            break;
+        case symbolEnd:
+            mifDoc.curPara()->format().TabStops.push_back
+             ( MifDoc::TabStop( MifDoc::sRight, firstLineIndent + fieldWidth ) );
+            mifDoc.curPara()->format().TabStops.push_back
+             ( MifDoc::TabStop( MifDoc::sLeft, firstLineIndent + fieldWidth + 1 ) );
+            break;
+        case symbolCenter:
+            mifDoc.curPara()->format().TabStops.push_back
+             ( MifDoc::TabStop( MifDoc::sCenter, firstLineIndent + fieldWidth / 2 ) );
+            mifDoc.curPara()->format().TabStops.push_back
+             ( MifDoc::TabStop( MifDoc::sLeft, firstLineIndent + fieldWidth + 1 ) );
+    }
+
+
+    int numTabs = mifDoc.curFormat().PgfNumTabs + leadingTab ? 2 : 1;
+    mifDoc.curFormat().setPgfNumTabs( numTabs );
+    mifDoc.curPara()->format().setPgfNumTabs( numTabs );
+    mifDoc.curPara()->curFormat().setPgfNumTabs( numTabs );
+    mifDoc.curPara()->format().setProperties |= MifDoc::ParagraphFormat::fTabStops;
+
+    start();
+
+    if( leadingTab )
+        mifDoc.outSpecialChar( MifDoc::sTab );
+}
+
+void MifFOTBuilder::endLineField() {
+
+    mifDoc.outSpecialChar( MifDoc::sTab );
+    end();
+    lastFlowObjectWasWhitespace = false;
+}
+
+//--------- PARAGRAPH BREAKS --------------------------------------------------
+
+void MifFOTBuilder::paragraphBreak( const ParagraphNIC &nic ) {
+
+    if( MifDoc::Para::currentlyOpened ) {
+        if( paragraphBreakInEffect )
+            doEndParagraph( false, false, false );
+        else {
+            doEndParagraph( true, false, false );
+            paragraphBreakInEffect = true;
+        }
+        doStartParagraph( nic );
+    }
+}
+
+//--------- SCORES ------------------------------------------------------------
+
+void MifFOTBuilder::startScore( Symbol scoreType ) {
+
+    checkForParagraphReopening();
+
+    switch( scoreType ) {
+        case symbolBefore:
+            nextFormat.setFOverline( true );
+            break;
+        case symbolThrough:
+            nextFormat.setFStrike( true );
+            break;
+        case symbolAfter: default:
+            nextFormat.setFUnderlining
+             ( nextFormat.FotLineRepeat > 1 ? MifDoc::sFDouble : MifDoc::sFSingle );
+            break;
+    }
+
+    start();
+}
+
+void MifFOTBuilder::endScore() {
+
+    end();
+}
+
+//--------- ANCHORED FRAMES (GENERAL) -----------------------------------------
+
+MifDoc::Frame &MifFOTBuilder::makeAnchoredFrame
+ ( MifDoc::T_keyword frameType, long width, long height, MifDoc::T_keyword anchorAlign ) {
+
+    mifDoc.aFrames().resize( mifDoc.aFrames().size() + 1 );
+    MifDoc::Frame &frame = mifDoc.aFrames().back();
+
+    frame.setFrameType( frameType );
+    frame.setAnchorAlign( anchorAlign );
+    frame.setShapeRect( MifDoc::T_LTWH( 0,  0, width, height ) );
+    return frame;
+}
+
+//--------- EXTERNAL GRAPHICS -------------------------------------------------
+
+void MifFOTBuilder::externalGraphic( const ExternalGraphicNIC &nic ) {
+
+    bool isInline = MifDoc::Para::currentlyOpened ? true : false;
+
+    if( !isInline )
+        startDisplay( nic );
+    start();
+
+    MifDoc::T_pathname mifPathname;
+    if( systemIdToMifPathname( nic.entitySystemId, mifPathname ) ) {
+
+
+        MifDoc::T_keyword mifAlignment = MifDoc::sLeft;
+        switch( format().FotDisplayAlignment ) {
+            case symbolStart:   mifAlignment = MifDoc::sLeft; break;
+            case symbolEnd:     mifAlignment = MifDoc::sRight; break;
+            case symbolCenter:  mifAlignment = MifDoc::sCenter; break;
+            case symbolInside:  mifAlignment = MifDoc::sInside; break;
+            case symbolOutside: mifAlignment = MifDoc::sOutside; break;
+            default: assert( false );
+        }
+
+        MifDoc::Frame &frame
+         = makeAnchoredFrame( isInline ? MifDoc::sInline : MifDoc::sBelow,
+                              nic.hasMaxWidth ? computeLengthSpec( nic.maxWidth ) : 72000,
+                              nic.hasMaxHeight ? computeLengthSpec( nic.maxHeight ) : 72000,
+                              mifAlignment );
+
+        MifDoc::ImportObject *importObject
+         = new MifDoc::ImportObject( mifPathname, frame.ShapeRect );        
+        frame.Objects.resize( frame.Objects.size() + 1 );
+        frame.Objects.back() = importObject;
+
+        if( !isInline )
+            doStartParagraph( nic, true, 0, false );
+        else
+            checkForParagraphReopening();
+        mifDoc.outAFrame( frame.ID, mifDoc.os() );
+        if( !isInline )
+            endParagraph();
+        else
+            lastFlowObjectWasWhitespace = false;
+    }
+
+    end();
+    if( !isInline )
+        endDisplay();
+}
+
+enum TComponent { cName, cUp, cRoot, cRootDrive };
+void addComponent( MifDoc::T_pathname &target, TComponent cType, StringC &component ) {
+
+    target += '<';
+    target += cType == cName ? 'c' : ( cType == cUp ? 'u' : 'r' );
+    target += '\\';
+    target += '>';
+    if( cType == cName || cType == cRootDrive )
+        for( size_t i = 0; i < component.size(); i++ )
+            target += char( component[i] );
+}
+
+bool MifFOTBuilder::systemIdToMifPathname
+ ( const StringC &systemId, MifDoc::T_pathname &mifPathname ) {
+
+    StringC filename;
+    StringC component;
+    int result;
+
+    if( ( result = systemIdFilename( systemId, filename ) ) < 0 ) {
+        App->message( MifMessages::systemIdNotFilename, StringMessageArg( systemId ) );
+        return false;
+    } else {
+        bool firstComponent = true;
+        size_t i = 0;
+        do {
+            component.resize( 0 );
+            while( i < filename.size() && filename[i] != '\\' && filename[i] != '/' )
+                    component += char( filename[i++] );
+            switch( component.size() ) {
+                case 2:
+                    if( firstComponent && component[1] == ':' )
+                        addComponent( mifPathname, cRootDrive, component );
+                    else
+                    if( component[0] == '.' && component[1] == '.' )
+                        addComponent( mifPathname, cUp, component );
+                    else 
+                        goto add_component;
+                    break;
+                case 1:
+                    if( component[0] != '.' )
+                        goto add_component;
+                    break;
+                case 0:
+                    if( firstComponent && filename.size() > 0 )
+                        addComponent( mifPathname, cRoot, component );
+                    break;
+                add_component: default:
+                    addComponent( mifPathname, cName, component );
+            }
+            firstComponent = false;
+            i++;
+        } while( i < filename.size() );
+    }
+
+    return result == 0 ? false : true;
+}
+
+// System Id Resolution from James Clark
+
+// Return -1 if an error should be generated
+// FIXME in some cases should copy the entity into a file in the same
+// directory as the output file.
+
+int MifFOTBuilder::systemIdFilename(const StringC &systemId, StringC &filename)
+{
+  if (systemId.size() == 0)
+    return -1;
+  Owner<InputSource> in(EntityManager->open(systemId,
+                                            *SystemCharset,
+                                            InputSourceOrigin::make(),
+                                            0,
+                                            *App));
+  if (!in)
+    return 0;
+  Xchar c = in->get(*App);
+  StorageObjectLocation soLoc;
+  ParsedSystemId parsedBuf;
+  if (c == InputSource::eE && in->accessError()) {
+    if (!EntityManager->parseSystemId(systemId, *SystemCharset, 0, 0, *App, parsedBuf))
+      return 0;
+    if (parsedBuf.size() != 1 || parsedBuf[0].baseId.size())
+      return 0;
+    soLoc.storageObjectSpec = &parsedBuf[0];
+    soLoc.actualStorageId = parsedBuf[0].specId;
+  }
+  else {
+    const Location &loc = in->currentLocation();
+    if (loc.origin().isNull())
+      return -1;
+    const InputSourceOrigin *tem = loc.origin()->asInputSourceOrigin();
+    if (!tem)
+      return -1;
+    const ParsedSystemId *psi
+      = ExtendEntityManager::externalInfoParsedSystemId(tem->externalInfo());
+    if (!psi || psi->size() != 1)
+      return -1;
+    if (!ExtendEntityManager::externalize(tem->externalInfo(), 0, soLoc))
+      return -1;
+  }
+  if (strcmp(soLoc.storageObjectSpec->storageManager->type(), "OSFILE") != 0)
+    return -1;
+  filename = soLoc.actualStorageId;
+  return 1;
+}
+
+//--------- RULES -------------------------------------------------------------
+
+void MifFOTBuilder::rule( const RuleNIC &nic ) {
+
+    bool isInline = ( nic.orientation == symbolHorizontal || nic.orientation == symbolVertical )
+                     ? false : true;
+
+    if( isInline )
+        checkForParagraphReopening();
+
+    if( !isInline )
+        startDisplay( nic );
+    start();
+
+    long indentlessDisplaySize
+          = format().FotCurDisplaySize - computeLengthSpec( format().FotStartIndentSpec )
+            - computeLengthSpec( format().FotEndIndentSpec );
+
+    MifDoc::T_dimension ruleHeight
+     = format().FotLineThickness + format().FotLineSep * ( format().FotLineRepeat - 1 );
+    if( ruleHeight < 0 )
+        ruleHeight = 0;
+        
+    MifDoc::T_dimension ruleLength;
+    MifDoc::T_dimension ruleOffset;
+
+    if( nic.hasLength && ( ruleLength = computeLengthSpec( nic.length ) ) > 0 ) {
+        switch( format().FotDisplayAlignment ) {
+            case symbolStart: default:
+                ruleOffset = 0;
+                break;
+            case symbolCenter:
+                ruleOffset = ( indentlessDisplaySize - ruleLength ) / 2;
+                break;
+            case symbolEnd:
+                ruleOffset = indentlessDisplaySize - ruleLength;
+        }
+    } else {
+        ruleOffset = 0;
+        ruleLength = indentlessDisplaySize;
+    }
+
+    MifDoc::Frame &frame
+     = makeAnchoredFrame( MifDoc::sInline, isInline ? long(ruleLength) : indentlessDisplaySize,
+                          ruleHeight );
+
+   if( isInline )
+        frame.setBLOffset( computeLengthSpec( format().FotPositionPointShiftSpec ) );
+    else
+        frame.setBLOffset( -ruleHeight / 2 + 4000 / 3 ); // min font baseline correction
+
+    MifDoc::T_keyword capType;
+    switch( format().FotLineCap ) {
+        case symbolButt: default: capType = MifDoc::sButt; break;
+        case symbolRound: capType = MifDoc::sRound; break;
+        case symbolSquare: capType = MifDoc::sSquare;
+    }
+    MifDoc::PolyLine *polyLine;
+    Length curLineVOffset = format().FotLineThickness / 2;
+    for( long i = format().FotLineRepeat; i > 0; i--, curLineVOffset += format().FotLineSep ) {
+
+        polyLine = new MifDoc::PolyLine( capType, 0, 0, format().FotLineThickness,
+                                         format().FColor );        
+        frame.Objects.resize( frame.Objects.size() + 1 );
+        frame.Objects.back() = polyLine;
+
+        polyLine->setHeadCap( capType );
+        polyLine->setTailCap( capType );
+        polyLine->Points.resize( polyLine->Points.size() + 1 );
+        polyLine->Points.back() = MifDoc::T_XY( ruleOffset, curLineVOffset );
+        polyLine->Points.resize( polyLine->Points.size() + 1 );
+        polyLine->Points.back() = MifDoc::T_XY( ruleOffset + ruleLength, curLineVOffset );
+    }
+
+    if( !isInline ) doStartParagraph( nic, true, 0, true );
+    mifDoc.outAFrame( frame.ID, mifDoc.os() );
+    if( !isInline )
+        endParagraph();
+    else
+        lastFlowObjectWasWhitespace = false;
+
+    end();
+    if( !isInline )
+        endDisplay();
+}
+
+//--------- TABLES ------------------------------------------------------------
+
+void MifFOTBuilder::startTable( const TableNIC &nic ) {
+
+    startDisplay( nic );
+    start();
+
+    if( !curTable().DefaultTblFormatGenerated ) {
+    
+        MifDoc::TblFormat defaultTblFormat( MifDoc::sDefaultTblFormat );
+        defaultTblFormat.setDSSSLDefaults();
+        mifDoc.tblCatalog().TblFormats.push_back( defaultTblFormat );
+        curTable().DefaultTblFormatGenerated = true;
+    }
+
+    Length curStartIndent = computeLengthSpec( format().FotStartIndentSpec );
+    curTable().startIndent = curStartIndent;
+
+    curTable().begin( mifDoc );
+//    curTable().nic = nic;
+    curTable().displayAlignment = format().FotDisplayAlignment;
+
+    if( nic.widthType == TableNIC::widthExplicit )
+        curTable().tableWidth = computeLengthSpec( nic.width );
+    else
+        curTable().tableWidth
+         = format().FotCurDisplaySize - curStartIndent
+            - computeLengthSpec( format().FotEndIndentSpec );
+
+
+    doStartParagraph( nic, true, 0 );
+    endParagraph();
+}
+
+void MifFOTBuilder::endTable() {
+
+    bool firstPart, lastPart, hasHeader, hasFooter;
+    for( size_t i = 0; i < curTable().TableParts.size(); i++ ) {
+        firstPart = ( i == 0 ) ? true : false;
+        lastPart = ( i == curTable().TableParts.size() - 1 ) ? true : false;
+        TablePart &tablePart = curTable().TableParts[i];
+        tablePart.normalizeRows();
+        hasHeader = tablePart.Header.size() > 0 ? true : false;
+        hasFooter = tablePart.Footer.size() > 0 ? true : false;
+        if( hasHeader )
+            curTable().resolveBorders( tablePart.Header,
+                                       firstPart ? true : false, false );
+        curTable().resolveBorders( tablePart.Body,
+                                   hasHeader ? false : true, hasFooter ? false : true );
+        if( hasFooter )
+            curTable().resolveBorders( tablePart.Footer,
+                                       false, lastPart ? true : false );
+        tablePart.translate( mifDoc );
+    }
+
+    MifDoc::CurInstance->setCurTblNum( 0 );
+
+    endDisplay();
+    end();
+}
+
+void MifFOTBuilder::tableColumn( const TableColumnNIC &nic ) {
+
+    if( nic.columnIndex >= curTable().curTablePart().Columns.size() )
+        curTable().curTablePart().Columns.resize( nic.columnIndex + 1 );
+  
+    curTable().curTablePart().Columns[nic.columnIndex].hasWidth = nic.hasWidth;
+    if( nic.hasWidth ) {
+        curTable().curTablePart().Columns[nic.columnIndex].width = nic.width;
+    }
+}
+
+void MifFOTBuilder::startTableRow() {
+
+    curTable().curRows().resize( curTable().curRows().size() + 1 );
+}
+
+void MifFOTBuilder::endTableRow() {
+
+}
+
+void MifFOTBuilder::startTableCell( const TableCellNIC &nic ) {
+
+    start();
+
+    TablePart &tp = curTable().curTablePart();
+    if( !tp.columnsProcessed )
+        tp.processColumns();
+   
+    Vector<Cell> &Cells = curTable().curRows().back().Cells;
+    if( nic.columnIndex >= Cells.size() )
+        Cells.resize( nic.columnIndex + 1 );
+
+    Cell &cell = Cells[nic.columnIndex];
+    curTable().CurCell = &cell;
+    cell.missing = nic.missing;
+
+    if( nic.nColumnsSpanned != 1 ) {
+        cell.nColumnsSpanned = nic.nColumnsSpanned;
+        cell.mifCell().setCellColumns( nic.nColumnsSpanned );
+    }
+
+    if( nic.nRowsSpanned != 1 ) {
+        cell.nRowsSpanned = nic.nRowsSpanned;
+        cell.mifCell().setCellRows( nic.nRowsSpanned );
+    }
+
+    if( format().FotCellBackground && format().MifBackgroundColor.size() > 0 ) {
+        cell.mifCell().setCellFill( 0 );
+        cell.mifCell().setCellColor( format().MifBackgroundColor );
+    }
+
+    long newDisplaySize = 0;
+    for( size_t i = nic.columnIndex; i < nic.columnIndex + nic.nColumnsSpanned; i++ )
+        if( i < tp.Columns.size() ) {
+            if( tp.Columns[i].hasWidth )
+                newDisplaySize
+                 += computeLengthSpec( tp.Columns[i].width );
+        } else
+        if( !nic.missing ) {
+            App->message( MifMessages::missingTableColumnFlowObject );  
+            // NOTE: at this point there's already a danger of not realizing
+            // right display space sizes inside cells
+            tp.Columns.resize( tp.Columns.size() + 1 ); 
+            tp.Columns.back().hasWidth = true;
+            TableLengthSpec tls; tls.tableUnitFactor = 1.0;
+            tp.Columns.back().width = tls;
+            tp.needsColumnReprocessing = true;
+            if( (MifDoc::T_integer)i > tp.mifTable( mifDoc ).TblNumColumns )
+                tp.mifTable( mifDoc ).setTblNumColumns( i );
+        }
+
+    newDisplaySize -= format().PgfCellMargins.l + format().PgfCellMargins.r;
+
+    if( newDisplaySize > 0 )
+        format().FotCurDisplaySize = newDisplaySize;
+
+    cell.displaySize = format().FotCurDisplaySize;
+    mifDoc.enterTableCell( cell.mifCell() ); 
+}
+
+void MifFOTBuilder::endTableCell() {
+
+    mifDoc.exitTableCell();
+    end();
+
+    curTable().CurCell = NULL;
+}
+
+void MifFOTBuilder::startTablePartSerial( const TablePartNIC &nic ) {
+
+    startDisplay( nic );
+    start();
+
+    if( curTable().NoTablePartsSeen )
+        curTable().NoTablePartsSeen = false;
+    else
+        curTable().TableParts.resize( curTable().TableParts.size() + 1 );
+
+    curTable().TableParts.back().begin( curTable(), mifDoc );    
+
+    doStartParagraph( nic, true, 0 );
+    endParagraph();
+}
+void MifFOTBuilder::endTablePartSerial() {
+
+    curTable().CurTablePart = NULL;
+    endDisplay();
+    end();
+}
+
+void MifFOTBuilder::startTablePartHeader() {
+
+    curTable().CurRows = &curTable().curTablePart().Header; 
+}
+
+void MifFOTBuilder::endTablePartHeader() {
+
+    curTable().CurRows = &curTable().curTablePart().Body; 
+}
+
+void MifFOTBuilder::startTablePartFooter() {
+
+    curTable().CurRows = &curTable().curTablePart().Footer; 
+}
+
+void MifFOTBuilder::endTablePartFooter() {
+
+    curTable().CurRows = &curTable().curTablePart().Body; 
+}
+
+void MifFOTBuilder::setCellBeforeRowMargin( Length l ) {
+
+    nextFormat.PgfCellMargins.t = l;
+}
+
+void MifFOTBuilder::setCellAfterRowMargin( Length l ) {
+
+    nextFormat.PgfCellMargins.b = l;
+}
+
+void MifFOTBuilder::setCellBeforeColumnMargin( Length l ) {
+
+    nextFormat.PgfCellMargins.l = l;
+}
+
+void MifFOTBuilder::setCellAfterColumnMargin( Length l ) {
+
+    nextFormat.PgfCellMargins.r = l;
+}
+
+void MifFOTBuilder::setCellRowAlignment( Symbol alignment ) {
+
+    switch( alignment ) {
+        case symbolEnd:     nextFormat.PgfCellAlignment = MifDoc::sBottom; break;
+        case symbolCenter:  nextFormat.PgfCellAlignment = MifDoc::sMiddle; break;
+        default:            nextFormat.PgfCellAlignment = MifDoc::sTop; break;
+    }
+}
+
+//--------- TABLE BORDERS -----------------------------------------------------
+
+void MifFOTBuilder::setBorderPresent( bool b ) {
+
+    nextFormat.FotBorderPresent = b;
+}
+
+void MifFOTBuilder::setBorderPriority( long p ) {
+
+    nextFormat.FotBorderPriority = p;
+}
+
+void MifFOTBuilder::setBorderOmitAtBreak(bool) {
+}
+
+void MifFOTBuilder::tableBeforeRowBorder() {
+
+    start();
+    curTable().beforeRowBorder.setFromFot();
+    end();
+}
+
+void MifFOTBuilder::tableAfterRowBorder() {
+
+    start();
+    curTable().afterRowBorder.setFromFot();
+    end();
+}
+
+void MifFOTBuilder::tableBeforeColumnBorder() {
+
+    start();
+    curTable().beforeColumnBorder.setFromFot();
+    end();
+}
+
+void MifFOTBuilder::tableAfterColumnBorder() {
+
+    start();
+    curTable().afterColumnBorder.setFromFot();
+    end();
+}
+
+void MifFOTBuilder::tableCellBeforeRowBorder() {
+
+    start();
+    curTable().curCell().beforeRowBorder.setFromFot();
+    end();
+}
+
+void MifFOTBuilder::tableCellAfterRowBorder() {
+
+    start();
+    curTable().curCell().afterRowBorder.setFromFot();
+    end();
+}
+
+void MifFOTBuilder::tableCellBeforeColumnBorder() {
+
+    start();
+    curTable().curCell().beforeColumnBorder.setFromFot();
+    end();
+}
+
+void MifFOTBuilder::tableCellAfterColumnBorder() {
+
+    start();
+    curTable().curCell().afterColumnBorder.setFromFot();
+    end();
+}
+
+
+//--------- CROSS-REFERENCES, LINKS, AND INDEX-ENTRIES ------------------------
+
+void MifFOTBuilder::outPendingInlineStatements() {
+
+    if(    linkStack.size() > 1
+        && linkStack[linkStack.size()-2].openedInMif
+        && !linkStack[linkStack.size()-2].forcesNoLink() ) {
+        LinkInfo::pendingMifClosings++;
+        linkStack[linkStack.size()-2].openedInMif = false;
+    }
+
+    for( ; LinkInfo::pendingMifClosings > 0; LinkInfo::pendingMifClosings-- ) {
+        MifDoc::Marker marker( MifDoc::T_string( "" ), MifDoc::Marker::Hypertext );
+        marker.out( mifDoc.os() );
+    }
+
+    if( indexEntryStack.size() > 0 ) {
+        indexEntryStack.back().out( mifDoc.os() );
+        indexEntryStack.resize( indexEntryStack.size() - 1 );
+    }
+
+    for( size_t i = 0; i < nodeStack.size(); i++ ) {
+        unsigned long n;
+        if( nodeStack[i].node->elementIndex( n ) == accessOK ) {
+            GroveString id; 
+            nodeStack[i].node->getId( id );
+            unsigned long groveIndex = nodeStack[i].node->groveIndex();
+            mifDoc.os() << MifDoc::CrossRefInfo
+                          ( groveIndex, n, mifDoc.os().CurTagIndent,
+                            MifDoc::CrossRefInfo::PotentialMarker, id.data(), id.size() );
+            if( id.size() > 0 )
+                mifDoc.elements().setBookComponentIndex
+                 ( groveIndex, StringC( id.data(), id.size() ),
+                   mifDoc.bookComponents().size() - 1 );
+            else
+                mifDoc.elements().setBookComponentIndex
+                 ( groveIndex, n, mifDoc.bookComponents().size() - 1 );
+        }
+    }
+    NodeInfo::nonEmptyElementsOpened = 0;
+    nodeStack.resize(0);
+
+    if(    linkStack.size() > 0
+        && !linkStack.back().openedInMif
+        && !linkStack.back().forcesNoLink() ) {
+        linkStack.back().crossRefInfo->tagIndent = mifDoc.os().CurTagIndent;
+        mifDoc.os() << *linkStack.back().crossRefInfo;
+        linkStack.back().openedInMif = true;
+    }
+}
+
+//--------- LINKS -------------------------------------------------------------
+
+void MifFOTBuilder::startLink( const Address &address ) {
+
+    switch( address.type ) {
+      case Address::resolvedNode: {
+        unsigned long n;
+        if( address.node->elementIndex( n ) == accessOK ) {
+            GroveString id; 
+            address.node->getId( id );
+            unsigned long groveIndex = address.node->groveIndex();
+            linkStack.resize( linkStack.size() + 1 );
+            linkStack.back().crossRefInfo
+             = new MifDoc::CrossRefInfo
+                    ( groveIndex, n, 0, MifDoc::CrossRefInfo::HypertextLink,
+                      id.data(), id.size() );
+            if( id.size() > 0 )
+                mifDoc.elements().setReferencedFlag
+                 ( MifDoc::ElementSet::LinkReference, groveIndex,
+                   StringC( id.data(), id.size() ) );
+            else
+                mifDoc.elements().setReferencedFlag
+                 ( MifDoc::ElementSet::LinkReference, groveIndex, n );
+        }
+        break; }
+
+      case Address::idref: {
+        const StringC &id = address.params[0];
+        size_t i;
+        for( i = 0; i < id.size(); i++ )
+            if( id[i] == ' ')
+                break;
+        linkStack.resize( linkStack.size() + 1 );
+        linkStack.back().crossRefInfo
+         = new MifDoc::CrossRefInfo
+                ( address.node->groveIndex(), 0, 0, MifDoc::CrossRefInfo::HypertextLink,
+                  id.data(), i );
+        mifDoc.elements().setReferencedFlag
+          ( MifDoc::ElementSet::LinkReference, address.node->groveIndex(),
+            StringC( id.data(), i ) );
+        break; }
+
+      case Address::none: default:
+        linkStack.resize( linkStack.size() + 1 );
+    }
+}
+
+void MifFOTBuilder::endLink() {
+
+    assert( linkStack.size() > 0 );
+    if( linkStack.back().openedInMif )
+        LinkInfo::pendingMifClosings++;
+    linkStack.resize( linkStack.size() - 1 );
+
+    // MifDoc::Marker marker( MifDoc::T_string( "" ), MifDoc::Marker::Hypertext );
+    // marker.out( mifDoc.os() );
+}
+
+//--------- CROSS-REFERENCES --------------------------------------------------
+
+void MifFOTBuilder::startNode( const NodePtr &node, const StringC &mode ) {
+
+    NodeInfo::curNodeLevel++;
+    if( mode.size() == 0 )
+        nodeStack.push_back( NodeInfo( node, NodeInfo::curNodeLevel ) );
+}
+
+void MifFOTBuilder::endNode() {
+
+    if( nodeStack.size() > 0 && nodeStack.back().nodeLevel == NodeInfo::curNodeLevel
+         && NodeInfo::nonEmptyElementsOpened < nodeStack.size() )
+        nodeStack.resize( nodeStack.size() - 1 );
+    NodeInfo::curNodeLevel--;
+}
+
+void MifFOTBuilder::currentNodePageNumber( const NodePtr &node ) {
+
+    unsigned long n;
+    if( node->elementIndex( n ) == accessOK ) {
+        GroveString id; 
+        node->getId( id );
+        if( !mifDoc.bookComponent().pageNumXRefFormatGenerated ) {
+            mifDoc.bookComponent().XRefFormats.push_back
+             ( MifDoc::XRefFormat( MifDoc::sPageNumXRefFormatName, "<$pagenum\\>" ) );
+            mifDoc.bookComponent().pageNumXRefFormatGenerated = true;
+        }
+        unsigned long groveIndex = node->groveIndex();
+        mifDoc.os() << MifDoc::CrossRefInfo
+                        ( groveIndex, n, mifDoc.os().CurTagIndent,
+                          MifDoc::CrossRefInfo::XRef, id.data(), id.size() );
+        if( id.size() > 0 )
+            mifDoc.elements().setReferencedFlag
+             ( MifDoc::ElementSet::PageReference, groveIndex, StringC( id.data(), id.size() ) );
+        else
+            mifDoc.elements().setReferencedFlag
+             ( MifDoc::ElementSet::PageReference, groveIndex, n );
+    }
+}
+
+//--------- INDEX-ENTRIES -----------------------------------------------------
+
+void MifFOTBuilder::indexEntry( const IndexEntryNIC &nic ) {
+
+    MifDoc::T_string mText;
+    if( nic.components.size() > 0 ) {
+        if( !nic.pageNumber )
+            mText += MifDoc::T_string( "<$nopage>" );
+        if( nic.startsPageRange )
+            mText += MifDoc::T_string( "<$startrange>" );
+        if( nic.endsPageRange )
+            mText += MifDoc::T_string( "<$endrange>" );
+        bool first = true;
+        for( size_t i = 0; i < nic.components.size(); first = false, i++ ) {
+            if( !first ) mText += ':';
+            for( size_t ii = 0; ii < nic.components[i].size(); ii++ )
+                mText += char( nic.components[i][ii] );
+        }
+        if( nic.sortString.size() > 0 ) {
+            mText += '[';
+            for( size_t i = 0; i < nic.sortString.size(); i++ )
+                mText += char( nic.sortString[i] );
+            mText += ']';
+        }
+        indexEntryStack.resize( indexEntryStack.size() + 1 );
+        indexEntryStack.back() = MifDoc::Marker( mText, MifDoc::Marker::Index );
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MifFOTBuilder::setCellBackground( bool to ) {
+
+    nextFormat.FotCellBackground = to;
+}
+
+void MifFOTBuilder::setBackgroundColor( const DeviceRGBColor &rgbColor ) {
+
+    MifDoc::Color *color = new MifDoc::Color( rgbColor.red, rgbColor.green, rgbColor.blue );
+    nextFormat.MifBackgroundColor = color->ColorTag;
+    if( mifDoc.colorCatalog().Colors.lookup( color->ColorTag ) == NULL ) {
+        mifDoc.colorCatalog().Colors.insert( color );    
+    } else
+        delete color;
+}
+
+void MifFOTBuilder::setBackgroundColor() {
+
+    nextFormat.MifBackgroundColor = MifDoc::T_tagstring();
+}
+
+void MifFOTBuilder::setColor( const DeviceRGBColor &rgbColor ) {
+
+    MifDoc::Color *color = new MifDoc::Color( rgbColor.red, rgbColor.green, rgbColor.blue );
+    nextFormat.FColor = color->ColorTag;
+    if( mifDoc.colorCatalog().Colors.lookup( color->ColorTag ) == NULL ) {
+        mifDoc.colorCatalog().Colors.insert( color );    
+    } else
+        delete color;
+}
+
+void MifFOTBuilder::setSpan( long n ) {
+
+    nextFormat.FotSpan = n;
+}
+
+void MifFOTBuilder::setPageNColumns( long n ) {
+
+    nextFormat.FotPageNColumns = n;
+    mifDoc.document().setDColumns( n );
+}
+
+void MifFOTBuilder::setPageColumnSep( Length l ) {
+
+    nextFormat.FotPageColumnSep = l;
+    mifDoc.document().setDColumnGap( l );
+}
+
+void MifFOTBuilder::setPageBalanceColumns( bool b ) {
+
+    nextFormat.FotPageBalanceColumns = b;
+}
+
+void MifFOTBuilder::setLines( Symbol s ) {
+
+    nextFormat.FotLines = s;
+}
+
+void MifFOTBuilder::setInputWhitespaceTreatment( Symbol s ) {
+
+    nextFormat.FotInputWhitespaceTreatment = s;
+}
+
+void MifFOTBuilder::setMinLeading( const OptLengthSpec &ol ) {
+
+    nextFormat.FotMinLeading = ol;
+}
+
+void MifFOTBuilder::setPositionPointShift( const LengthSpec &l ) {
+
+    nextFormat.FotPositionPointShiftSpec = l;
+}
+
+void MifFOTBuilder::setLineThickness( Length l ) {
+
+    nextFormat.FotLineThickness = l;
+}
+
+void MifFOTBuilder::setLineRepeat( long n ) {
+
+    nextFormat.FotLineRepeat = n;
+}
+
+void MifFOTBuilder::setLineSep( Length l ) {
+
+    nextFormat.FotLineSep = l;
+}
+
+void MifFOTBuilder::setFieldWidth( const LengthSpec &l ) {
+
+    nextFormat.FotFieldWidth = l;
+}
+
+void MifFOTBuilder::setLineCap( Symbol s ) {
+
+    nextFormat.FotLineCap = s;
+}
+
+void MifFOTBuilder::setFieldAlign( Symbol s ) {
+
+    nextFormat.FotFieldAlign = s;
+}
+
+//---------------------------------------------------------------------------------------------
+
+void MifFOTBuilder::extension( const ExtensionFlowObj &fo, const NodePtr &node ) {
+
+  ((const MifExtensionFlowObj &)fo).atomic( *this, node );
+}
+
+bool MifFOTBuilder::IndexEntryFlowObj::hasNIC( const StringC &name ) const {
+
+    return name == "components" || name == "page-number?" || name == "sort-string"
+           || name == "starts-page-range?" || name == "ends-page-range?" ;
+}
+
+void MifFOTBuilder::IndexEntryFlowObj::setNIC( const StringC &name, const Value &value ) {
+
+    if( name == "components" )
+        value.convertStringList( nic.components );
+    else if( name == "page-number?" )
+        value.convertBoolean( nic.pageNumber );
+    else if( name == "sort-string" ) {
+        bool hasString;
+        value.convertBoolean( hasString );
+        if( hasString )
+            value.convertString( nic.sortString );
+    } else if( name == "starts-page-range?" )
+        value.convertBoolean( nic.startsPageRange );
+    else if( name == "ends-page-range?" )
+        value.convertBoolean( nic.endsPageRange );
+}
+
+//---------------------------------------------------------------------------------------------
+
+unsigned long StringHash::hash( const String<char> &str ) {
+
+  const char *p = str.data();
+  unsigned long h = 0;
+  for( size_t n = str.size(); n > 0; n-- )
+    h = (h << 5) + h + *p++;   // from Chris Torek
+  return h;
+}
+
+FOTBuilder *makeMifFOTBuilder( const String<CmdLineApp::AppChar> &fileLoc,
+                               const Ptr<ExtendEntityManager> &entityManager,
+                                          const CharsetInfo &systemCharset,
+                               CmdLineApp *app,
+                               const FOTBuilder::Extension *&ext ) {
+
+    
+    MifFOTBuilder::IndexEntryFlowObj *indexEntryFlowObject
+     = new MifFOTBuilder::IndexEntryFlowObj;
+
+    static const FOTBuilder::Extension extensions[] = {
+    {
+      "UNREGISTERED::ISOGEN//Flow Object Class::index-entry",
+      0,
+      0,
+      0,
+      0,
+      indexEntryFlowObject
+    },
+    {
+      "UNREGISTERED::James Clark//Characteristic::page-n-columns",
+      0,
+      0,
+      (void (FOTBuilder::*)(long))&MifFOTBuilder::setPageNColumns,
+      0
+    },
+    {
+      "UNREGISTERED::James Clark//Characteristic::page-column-sep",
+      0,
+      0,
+      0,
+      (void (FOTBuilder::*)(FOTBuilder::Length))&MifFOTBuilder::setPageColumnSep,
+    },
+    {
+      "UNREGISTERED::James Clark//Characteristic::page-balance-columns?",
+      (void (FOTBuilder::*)(bool))&MifFOTBuilder::setPageBalanceColumns,
+      0,
+      0
+    },
+    { 0, 0, 0}
+  };
+  ext = extensions;
+  return new MifFOTBuilder( fileLoc, entityManager, systemCharset, app );
+}
+
+const Char MifFOTBuilder::FrameCharsetMap[] = { // Latin-1 -> Frame Charset
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x00c1, 0x00a2, 0x00a3, 0x00db, 0x00b4, 0x007c, 0x00a4,
+    0x00ac, 0x00a9, 0x00bb, 0x00c7, 0x00c2, 0x002d, 0x00a8, 0x00f8,
+    0x00fb, 0x0000, 0x0000, 0x0000, 0x00ab, 0x0000, 0x00a6, 0x00a5,
+    0x00fc, 0x0000, 0x00bc, 0x00c8, 0x0000, 0x0000, 0x0000, 0x00c0,
+    0x00cb, 0x00e7, 0x00e5, 0x00cc, 0x0080, 0x0081, 0x00ae, 0x0082,
+    0x00e9, 0x0083, 0x00e6, 0x00e9, 0x00ed, 0x00ea, 0x00eb, 0x00ec,
+    0x0000, 0x0084, 0x00f1, 0x00ee, 0x00ef, 0x00cd, 0x0085, 0x0000,
+    0x00af, 0x00f4, 0x00f2, 0x00f3, 0x0086, 0x0000, 0x0000, 0x00a7,
+    0x0088, 0x0087, 0x0089, 0x008b, 0x008a, 0x008c, 0x00be, 0x008d,
+    0x008f, 0x008e, 0x0090, 0x0091, 0x0093, 0x0092, 0x0094, 0x0095,
+    0x0000, 0x0096, 0x0098, 0x0097, 0x0099, 0x009b, 0x009a, 0x0000,
+    0x00bf, 0x009d, 0x009c, 0x009e, 0x009f, 0x0000, 0x0000, 0x00d8
+};
+
+const MifFOTBuilder::SymbolFont
+MifFOTBuilder::SymbolFonts[MifFOTBuilder::nSymbolFonts] = {
+  { "Symbol", {
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0020, 0x0021, 0x2200, 0x0023, 0x2203, 0x0025, 0x0026, 0x220B,
+    0x0028, 0x0029, 0x2217, 0x002B, 0x002C, 0x2212, 0x002E, 0x002F,
+    0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+    0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+    0x2245, 0x0391, 0x0392, 0x03A7, 0x2206, 0x0395, 0x03A6, 0x0393,
+    0x0397, 0x0399, 0x03D1, 0x039A, 0x039B, 0x039C, 0x039D, 0x039F,
+    0x03A0, 0x0398, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03C2, 0x2126,
+    0x039E, 0x03A8, 0x0396, 0x005B, 0x2234, 0x005D, 0x22A5, 0x005F,
+    0x203E, 0x03B1, 0x03B2, 0x03C7, 0x03B4, 0x03B5, 0x03C6, 0x03B3,
+    0x03B7, 0x03B9, 0x03D5, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BF,
+    0x03C0, 0x03B8, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03D6, 0x03C9,
+    0x03BE, 0x03C8, 0x03B6, 0x007B, 0x007C, 0x007D, 0x223C, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x03D2, 0x2032, 0x2264, 0x2215, 0x221E, 0x0192, 0x2663,
+    0x2666, 0x2665, 0x2660, 0x2194, 0x2190, 0x2191, 0x2192, 0x2193,
+    0x00B0, 0x00B1, 0x2033, 0x2265, 0x00D7, 0x221D, 0x2202, 0x2022,
+    0x00F7, 0x2260, 0x2261, 0x2248, 0x2026, 0x0000, 0x0000, 0x21B5,
+    0x2135, 0x2111, 0x211C, 0x2118, 0x2297, 0x2295, 0x2205, 0x2229,
+    0x222A, 0x2283, 0x2287, 0x2284, 0x2282, 0x2286, 0x2208, 0x2209,
+    0x2220, 0x2207, 0x00AE, 0x00A9, 0x2122, 0x220F, 0x221A, 0x22C5,
+    0x00AC, 0x2227, 0x2228, 0x21D4, 0x21D0, 0x21D1, 0x21D2, 0x21D3,
+    0x25CA, 0x2329, 0x00AE, 0x00A9, 0x2122, 0x2211, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x232A, 0x222B, 0x2320, 0x0000, 0x2321, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }
+  },
+  // I created this table by hand.  It's sometimes not obvious what
+  // the appropriate mapping is (James Clark)
+  { "Wingdings", {
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x2702, 0x2701, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x260e, 0x2706, 0x2709, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2328,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2707, 0x270d,
+    0x0000, 0x270c, 0x0000, 0x0000, 0x0000, 0x261c, 0x261e, 0x261d,
+    0x261f, 0x0000, 0x263a, 0x0000, 0x2639, 0x0000, 0x2620, 0x0000,
+    0x0000, 0x2708, 0x263c, 0x0000, 0x2744, 0x0000, 0x271e, 0x0000,
+    0x2720, 0x2721, 0x262a, 0x262f, 0x0950, 0x2638, 0x2648, 0x2649,
+    0x264a, 0x264b, 0x264c, 0x264d, 0x264e, 0x264f, 0x2650, 0x2651,
+    0x2652, 0x2653, 0x0000, 0x0000, 0x25cf, 0x274d, 0x25a0, 0x25a1,
+    0x0000, 0x2751, 0x2752, 0x0000, 0x0000, 0x25c6, 0x2756, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x2780, 0x2781, 0x2782, 0x2783, 0x2784, 0x2785, 0x2786,
+    0x2787, 0x2788, 0x2789, 0x0000, 0x278a, 0x278b, 0x278c, 0x278d,
+    0x278e, 0x278f, 0x2790, 0x2791, 0x2792, 0x2793, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x25cb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x25aa,
+    0x0000, 0x0000, 0x2726, 0x2605, 0x2736, 0x0000, 0x2739, 0x0000,
+    0x0000, 0x0000, 0x2727, 0x0000, 0x0000, 0x272a, 0x2730, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x232b, 0x2326, 0x0000,
+    0x27a2, 0x0000, 0x0000, 0x0000, 0x27b2, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x25ab, 0x2718, 0x2714, 0x2612, 0x2611, 0x0000 }
+  },
+  { "ZapfDingbats", {
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x2701, 0x2702, 0x2703, 0x2704, 0x260E, 0x2706, 0x2707,
+    0x2708, 0x2709, 0x261B, 0x261E, 0x270C, 0x270D, 0x270E, 0x270F,
+    0x2710, 0x2711, 0x2712, 0x2713, 0x2714, 0x2715, 0x2716, 0x2717,
+    0x2718, 0x2719, 0x271A, 0x271B, 0x271C, 0x271D, 0x271E, 0x271F,
+    0x2720, 0x2721, 0x2722, 0x2723, 0x2724, 0x2725, 0x2726, 0x2727,
+    0x2605, 0x2729, 0x272A, 0x272B, 0x272C, 0x272D, 0x272E, 0x272F,
+    0x2730, 0x2731, 0x2732, 0x2733, 0x2734, 0x2735, 0x2736, 0x2737,
+    0x2738, 0x2739, 0x273A, 0x273B, 0x273C, 0x273D, 0x273E, 0x273F,
+    0x2740, 0x2741, 0x2742, 0x2743, 0x2744, 0x2745, 0x2746, 0x2747,
+    0x2748, 0x2749, 0x274A, 0x274B, 0x0000, 0x274D, 0x25A0, 0x274F,
+    0x2750, 0x2751, 0x2752, 0x25B2, 0x25BC, 0x25C6, 0x2756, 0x0000,
+    0x2758, 0x2759, 0x275A, 0x275B, 0x275C, 0x275D, 0x275E, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x2761, 0x2762, 0x2763, 0x2764, 0x2765, 0x2766, 0x2767,
+    0x2663, 0x2666, 0x2665, 0x2660, 0x2460, 0x2461, 0x2462, 0x2463,
+    0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x2776, 0x2777,
+    0x2778, 0x2779, 0x277A, 0x277B, 0x277C, 0x277D, 0x277E, 0x277F,
+    0x2780, 0x2781, 0x2782, 0x2783, 0x2784, 0x2785, 0x2786, 0x2787,
+    0x2788, 0x2789, 0x278A, 0x278B, 0x278C, 0x278D, 0x278E, 0x278F,
+    0x2790, 0x2791, 0x2792, 0x2793, 0x2794, 0x2192, 0x2194, 0x2195,
+    0x2798, 0x2799, 0x279A, 0x279B, 0x279C, 0x279D, 0x279E, 0x279F,
+    0x27A0, 0x27A1, 0x27A2, 0x27A3, 0x27A4, 0x27A5, 0x27A6, 0x27A7,
+    0x27A8, 0x27A9, 0x27AA, 0x27AB, 0x27AC, 0x27AD, 0x27AE, 0x27AF,
+    0x0000, 0x27B1, 0x27B2, 0x27B3, 0x27B4, 0x27B5, 0x27B6, 0x27B7,
+    0x27B8, 0x27B9, 0x27BA, 0x27BB, 0x27BC, 0x27BD, 0x27BE, 0x0000 }
+    },
+};
+
+// --------- static -----------------------------------------------------------
+
+#define CONST_STRING( symbolName ) \
+const String<char> MifDoc::s ## symbolName ( #symbolName, sizeof( #symbolName ) - 1 )
+
+const String<char> MifDoc::sNONE;
+const String<char> MifDoc::sSPACE( " ", sizeof( " " ) - 1 );
+const String<char> MifDoc::sDefaultTblFormat
+                    ( "Default Tbl Format", sizeof( "Default Tbl Format" ) - 1 );
+const String<char> MifDoc::sDefaultPgfFormat
+                    ( "Default Pgf Format", sizeof( "Default Pgf Format" ) - 1 );
+const String<char> MifDoc::sTimesNewRoman
+                    ( "Times New Roman", sizeof( "Times New Roman" ) - 1 );
+const String<char> MifDoc::sPageNumXRefFormatName
+                    ( "Page Number Format", sizeof( "Page Number Format" ) - 1 );
+CONST_STRING( A );
+CONST_STRING( Regular );
+CONST_STRING( Bold );
+CONST_STRING( Italic );
+CONST_STRING( FNoUnderlining );
+CONST_STRING( FSingle );
+CONST_STRING( FDouble );
+CONST_STRING( FNumeric );
+CONST_STRING( FNormal );
+CONST_STRING( FSuperscript );
+CONST_STRING( FSubscript );
+CONST_STRING( FAsTyped );
+CONST_STRING( FSmallCaps );
+CONST_STRING( FLowercase );
+CONST_STRING( FUppercase );
+CONST_STRING( LeftRight );
+CONST_STRING( Left );
+CONST_STRING( Right );
+CONST_STRING( Center );
+CONST_STRING( Fixed );
+CONST_STRING( Proportional );
+CONST_STRING( Top );
+CONST_STRING( Middle );
+CONST_STRING( Bottom );
+CONST_STRING( NoLanguage );
+CONST_STRING( USEnglish );
+CONST_STRING( UKEnglish );
+CONST_STRING( German );
+CONST_STRING( SwissGerman );
+CONST_STRING( French );
+CONST_STRING( CanadianFrench );
+CONST_STRING( Spanish );
+CONST_STRING( Catalan );
+CONST_STRING( Italian );
+CONST_STRING( Portuguese );
+CONST_STRING( Brazilian );
+CONST_STRING( Danish );
+CONST_STRING( Dutch );
+CONST_STRING( Norwegian );
+CONST_STRING( Nynorsk );
+CONST_STRING( Finnish );
+CONST_STRING( Swedish );
+CONST_STRING( LeftMasterPage );
+CONST_STRING( RightMasterPage );
+CONST_STRING( OtherMasterPage );
+CONST_STRING( BodyPage );
+CONST_STRING( Decimal );
+CONST_STRING( Tab );
+CONST_STRING( HardSpace );
+CONST_STRING( SoftHyphen );
+CONST_STRING( HardHyphen );
+CONST_STRING( HardReturn );
+CONST_STRING( NumberSpace );
+CONST_STRING( ThinSpace );
+CONST_STRING( EnSpace );
+CONST_STRING( EmSpace );
+CONST_STRING( Header );
+CONST_STRING( Footer );
+CONST_STRING( Arabic );
+CONST_STRING( UCRoman );
+CONST_STRING( LCRoman );
+CONST_STRING( UCAlpha );
+CONST_STRING( LCAlpha );
+CONST_STRING( FirstLeft );
+CONST_STRING( FirstRight );
+CONST_STRING( Anywhere );
+CONST_STRING( ColumnTop );
+CONST_STRING( PageTop );
+CONST_STRING( LPageTop );
+CONST_STRING( RPageTop );
+CONST_STRING( First );
+CONST_STRING( Inside );
+CONST_STRING( Outside );
+CONST_STRING( None );
+CONST_STRING( RunIntoParagraph );
+CONST_STRING( Inline );
+CONST_STRING( Below );
+CONST_STRING( Butt );
+CONST_STRING( Round );
+CONST_STRING( Square );
+CONST_STRING( White );
+CONST_STRING( Black );
+CONST_STRING( Normal );
+CONST_STRING( Straddle );
+CONST_STRING( Cent );
+CONST_STRING( Pound );
+CONST_STRING( Yen );
+CONST_STRING( EnDash );
+CONST_STRING( EmDash );
+CONST_STRING( Dagger );
+CONST_STRING( DoubleDagger );
+CONST_STRING( Bullet);
+
+MifDoc *MifDoc::CurInstance = NULL;
+
+MifDoc::T_ID MifDoc::Object::IDCnt = 0;
+
+MifDoc::T_indent MifOutputByteStream::INDENT = MifDoc::T_indent( 0xFFF );
+
+bool MifDoc::Para::currentlyOpened = false;
+unsigned MifDoc::ParaLine::setProperties = 0;
+MifDoc::T_ID MifDoc::ParaLine::TextRectID;
+MifDoc::T_ID MifDoc::ParaLine::ATbl;
+
+// ----------------------------------------------------------------------------
+
+int operator!=( const MifDoc::T_LTRB &o1, const MifDoc::T_LTRB &o2 ) {
+
+    return o1.l != o2.l || o1.t != o2.t || o1.r != o2.r || o1.b != o2.b;
+}
+
+// --------- MifTmpOutputByteStream -------------------------------------------
+
+void MifTmpOutputByteStream::commit( OutputByteStream &os, bool resolveCrossReferences ) {
+
+    MifOutputByteStream outS( os );
+    TmpOutputByteStream::Iter iter( *this );
+    const char *s;
+    size_t n;
+
+    unsigned crossRefInfoIdx;
+    char *byteDestPtr = NULL;
+    size_t neededBytesNum = 0;
+    enum { normal, waitingForCrossRefInfoIdx } state = normal;
+    while( iter.next( s, n ) ) {
+        while( n > 0 ) {
+            switch( state ) {
+              case waitingForCrossRefInfoIdx: {
+                int bytesCopiedNum = neededBytesNum > n ? n : neededBytesNum;
+                memcpy( byteDestPtr, s, bytesCopiedNum );
+                byteDestPtr += bytesCopiedNum; n -= bytesCopiedNum; s += bytesCopiedNum;
+                neededBytesNum -= bytesCopiedNum;
+                if( neededBytesNum == 0 ) {
+                    assert( crossRefInfoIdx < MifDoc::CurInstance->crossRefInfos().size() );
+                    MifDoc::CrossRefInfo &crossRefInfo
+                     = MifDoc::CurInstance->crossRefInfos()[crossRefInfoIdx];   
+                    crossRefInfo.out( outS );
+                    state = normal;
+                } }
+                break;
+
+              case normal:
+                if( resolveCrossReferences ) {
+                    const char *escapeCharPtr
+                     = (char*)memchr( s, MifDoc::escapeChar(), n );
+                    if( escapeCharPtr != NULL ) {
+                        outS.stream().sputn( s, escapeCharPtr - s);
+                        n -= (escapeCharPtr - s); s = escapeCharPtr; n--; s++;
+                        state = waitingForCrossRefInfoIdx;
+                        byteDestPtr = (char*)&crossRefInfoIdx;
+                        neededBytesNum = sizeof( unsigned );
+                        break;
+                    }
+                }
+                outS.stream().sputn( s, n );
+                n = 0;
+            }
+        }
+    }
+
+    assert( neededBytesNum == 0 );
+}
+
+void MifTmpOutputByteStream::commit( String<char> &str ) {
+
+    TmpOutputByteStream::Iter iter( *this );
+    const char *s;
+    size_t n;
+
+    while( iter.next( s, n ) ) {
+        str.append( s, n );
+    }
+}
+
+// --------- MifDoc::T_string -------------------------------------------------
+
+void MifDoc::T_string::escapeSpecialChars() {
+
+    T_string newValue;
+
+    bool changes = false;
+    for( size_t i = 0; i < size(); i++ ) {
+        switch( (*this)[i] ) {
+          case '\n': case '\r': changes = true; break;
+          case '\t': newValue.append( "\\t", 2 ); changes = true; break;
+          case '>': newValue.append( "\\>", 2 ); changes = true; break;
+          case '\'': newValue.append( "\\q", 2 ); changes = true; break;
+          case '`':  newValue.append( "\\Q", 2 ); changes = true; break;
+          case '\\': newValue.append( "\\\\", 2 );  changes = true; break;
+          default: 
+            if( (unsigned)(*this)[i] >= 0x80 ) {
+                changes = true;
+                MifDoc::CurInstance->outHexChar( (*this)[i], newValue );
+            } else
+                newValue += (*this)[i];
+        }
+    }
+    if( changes )
+        *this = newValue;
+}
+
+// --------- MifDoc::CrossRefInfo ---------------------------------------------
+
+MifDoc::T_string MifDoc::CrossRefInfo::crossRefText() const {
+
+    char buf[32];
+    if( sgmlId.size() > 0 ) {
+        sprintf( buf, "NODE%lu.", groveIndex );
+        T_string result( buf );
+        for( size_t i = 0; i < sgmlId.size(); i++ )
+            result += char( sgmlId[i] );
+        return result;
+    } else {    
+        sprintf( buf, "NODE%lu.%lu", groveIndex, elementIndex );
+        return T_string( buf );
+    }
+}
+
+void MifDoc::CrossRefInfo::out( MifOutputByteStream &os ) {
+
+    switch( type() ) {
+      case PotentialMarker: {
+        bool regularMarkerOut = false;
+        bool linkMarkerOut = false;
+        if( sgmlId.size() > 0 ) {
+            if( MifDoc::CurInstance->elements().hasBeenReferenced
+                 ( MifDoc::ElementSet::PageReference, groveIndex, sgmlId ) )
+                regularMarkerOut = true;
+            if( MifDoc::CurInstance->elements().hasBeenReferenced
+                 ( MifDoc::ElementSet::LinkReference, groveIndex, sgmlId ) )
+                linkMarkerOut = true;
+        } else {
+            if( MifDoc::CurInstance->elements().hasBeenReferenced
+                 ( MifDoc::ElementSet::PageReference, groveIndex, elementIndex ) )
+                regularMarkerOut = true;
+            if( MifDoc::CurInstance->elements().hasBeenReferenced
+                 ( MifDoc::ElementSet::LinkReference, groveIndex, elementIndex ) ) 
+                linkMarkerOut = true;
+        }
+        if( regularMarkerOut ) {
+            os.CurTagIndent = tagIndent;
+            MifDoc::Marker marker( *this );
+            marker.out( os );
+        }
+        if( linkMarkerOut ) {
+            os.CurTagIndent = tagIndent;
+            MifDoc::Marker marker( *this, true );
+            marker.out( os );
+        } }
+        break;
+
+      case HypertextLink: {
+        os.CurTagIndent = tagIndent;
+        MifDoc::Marker marker( *this );
+        marker.out( os ); }
+        break;
+
+      case XRef: {
+        os.CurTagIndent = tagIndent;
+        MifDoc::XRef xRef( *this );
+        xRef.out( os ); }
+        break;
+
+      default: assert( false );        
+    }
+}
+
+// ----------------------------------------------------------------------------
+
+#define CHECK_PROPERTY( propertyName ) \
+    \
+    if( setProperties & f ## propertyName ) \
+        os << '\n' << MifOutputByteStream::INDENT \
+           << "<" #propertyName " " << propertyName << ">"; 
+
+#define CHECK_VECTOR_OF_PROPERTIES( propertyName ) \
+    \
+    if( setProperties & f ## propertyName ## s) \
+        for( size_t i = 0; i < propertyName ## s.size(); i++ ) { \
+            os << '\n' << MifOutputByteStream::INDENT \
+               << "<" #propertyName " " << propertyName ## s[i] << ">"; \
+        }
+
+// --------- MifDoc::TagStream ------------------------------------------------
+
+MifDoc::TagStream::TagStream( MifDoc::T_indent osIndent )
+ : Format(), Content( new MifTmpOutputByteStream( osIndent ) ), PgfTagUsed( false ),
+   InitialPgfTag( sDefaultPgfFormat ), TagStreamClass( tsTagStream ) {
+}
+
+MifDoc::TagStream::~TagStream() {
+
+    if( Content )
+        delete Content;
+}
+
+// --------- MifDoc::TextFlow -------------------------------------------------
+
+MifDoc::TextFlow::TextFlow( const TextRect &textRect, bool body, ParagraphFormat *format, 
+                            T_tagstring pgfTag )
+ : TagStream(), TextRectID( textRect.ID ), setProperties( 0 ), TextRectIDUsed( false ),
+   TextRect_( &textRect ) {
+
+    TagStreamClass = tsTextFlow;
+    InitialPgfTag = pgfTag;
+
+    if( format )
+        Format = *format;
+
+    if( body ) {
+        setTFTag( MifDoc::sA );
+        setTFAutoConnect( true );
+    }
+}
+
+void MifDoc::TextFlow::out( MifOutputByteStream &os, bool resolveCrossReferences ) {
+
+    os << '\n' << MifOutputByteStream::INDENT << "<TextFlow ";
+    os.indent();
+    CHECK_PROPERTY( TFTag );
+    CHECK_PROPERTY( TFAutoConnect );
+    content().commit( os.stream(), resolveCrossReferences );
+    os.undent();
+    os << '\n' << MifOutputByteStream::INDENT << ">";
+}
+
+
+// --------- MifDoc::Color ----------------------------------------------------
+
+MifDoc::Color::Color( unsigned char red, unsigned char green, unsigned char blue ) 
+ : setProperties( 0 ) {
+
+    char colorTag[64];
+
+    sprintf( colorTag, "RGB-%i-%i-%i", int( red ), int( green ), int( blue ) );
+    setColorTag( T_tagstring( colorTag ) );
+
+    if( red >= green && red >= blue ) {
+        setColorBlack( double( 255 - red ) / 2.55 );
+        setColorYellow( double( red - blue ) / 2.55 );
+        setColorMagenta( double( red - green ) / 2.55 );
+        setColorCyan( 0.0 );
+    } else
+    if( green >= red && green >= blue ) {
+        setColorBlack( double( 255 - green ) / 2.55 );
+        setColorCyan( double( green - red ) / 2.55 );
+        setColorYellow( double( green - blue ) / 2.55 );
+        setColorMagenta( 0.0 );
+    } else { // blue is largest
+        setColorBlack( double( 255 - blue ) / 2.55 );
+        setColorCyan( double( blue - red ) / 2.55 );
+        setColorMagenta( double( blue - green ) / 2.55 );
+        setColorYellow( 0.0 );
+    }
+}
+
+void MifDoc::Color::out( MifOutputByteStream &os ) const {
+
+    os << '\n' << MifOutputByteStream::INDENT << "<Color ";
+    os.indent();
+    CHECK_PROPERTY( ColorTag );
+    CHECK_PROPERTY( ColorCyan );
+    CHECK_PROPERTY( ColorMagenta );
+    CHECK_PROPERTY( ColorYellow );
+    CHECK_PROPERTY( ColorBlack );
+    os.undent();
+    os << '\n' << MifOutputByteStream::INDENT << ">";
+}
+
+const String<char> &MifDoc::Color::key( Color &color ) {
+
+    return color.ColorTag;
+}
+
+// --------- MifDoc::ColorCatalog ---------------------------------------------
+
+void MifDoc::ColorCatalog::out( MifOutputByteStream &os ) {
+
+    if( Colors.count() > 0 ) {
+        os << '\n' << MifOutputByteStream::INDENT << "<ColorCatalog ";
+        os.indent();
+    
+        PointerTableIter<Color*,String<char>,StringHash,Color> iter( Colors );
+        const Color *color;
+        while( ( color = iter.next() ) != NULL )
+            color->out( os );
+    
+        os.undent();
+        os << '\n' << MifOutputByteStream::INDENT << ">";
+    }
+}
+
+// --------- MifDoc::Ruling ---------------------------------------------------
+
+const String<char> &MifDoc::Ruling::key( Ruling &r ) {
+
+    if( r.Key.size() < 1 ) {
+        char keyStr[ 48 ];
+        sprintf( keyStr, "Ruling-%li-%li-%li-%li-",
+                 long( r.RulingPenWidth ), long( r.RulingGap ), r.RulingPen, r.RulingLines );
+        r.Key.assign( keyStr, strlen( keyStr ) );
+        r.Key += r.RulingColor;
+     }
+
+     return r.Key;       
+}
+
+void MifDoc::Ruling::out( MifOutputByteStream &os ) const {
+
+    os << '\n' << MifOutputByteStream::INDENT << "<Ruling ";
+    os.indent();
+    CHECK_PROPERTY( RulingTag );
+    CHECK_PROPERTY( RulingPenWidth );
+    CHECK_PROPERTY( RulingGap );
+    CHECK_PROPERTY( RulingColor );
+    CHECK_PROPERTY( RulingPen );
+    CHECK_PROPERTY( RulingLines );
+    os.undent();
+    os << '\n' << MifOutputByteStream::INDENT << ">";
+}
+
+// --------- MifDoc::RulingCatalog --------------------------------------------
+
+void MifDoc::RulingCatalog::out( MifOutputByteStream &os ) {
+
+    if( Rulings.count() > 0 ) {
+        os << '\n' << MifOutputByteStream::INDENT << "<RulingCatalog ";
+        os.indent();
+    
+        PointerTableIter<Ruling*,String<char>,StringHash,Ruling> iter( Rulings );
+        const Ruling *ruling;
+        while( ( ruling = iter.next() ) != NULL )
+            ruling->out( os );
+    
+        os.undent();
+        os << '\n' << MifOutputByteStream::INDENT << ">";
+    }
+}
+
+// --------- MifDoc::Cell -----------------------------------------------------
+
+void MifDoc::Cell::out( MifOutputByteStream &os, bool resolveCrossReferences ) {
+
+    os << '\n' << MifOutputByteStream::INDENT << "<Cell ";
+    os.indent();
+
+    CHECK_PROPERTY( CellFill );
+    CHECK_PROPERTY( CellColor );
+    CHECK_PROPERTY( CellLRuling );
+    CHECK_PROPERTY( CellBRuling );
+    CHECK_PROPERTY( CellRRuling );
+    CHECK_PROPERTY( CellTRuling );
+    CHECK_PROPERTY( CellColumns );
+    CHECK_PROPERTY( CellRows );
+
+    os << '\n' << MifOutputByteStream::INDENT << "<CellContent ";
+    os.indent();
+    content().commit( os.stream(), resolveCrossReferences );
+    os.undent();
+    os << '\n' << MifOutputByteStream::INDENT << ">";
+
+    os.undent();
+    os << '\n' << MifOutputByteStream::INDENT << ">";
+}
+
+// --------- MifDoc::Row ------------------------------------------------------
+
+void MifDoc::Row::out( MifOutputByteStream &os, bool resolveCrossReferences ) {
+
+    os << '\n' << MifOutputByteStream::INDENT << "<Row ";
+    os.indent();
+
+    for( size_t i = 0; i < Cells.size(); i++ ) Cells[i].out( os, resolveCrossReferences );
+
+    os.undent();
+    os << '\n' << MifOutputByteStream::INDENT << ">";
+}
+
+// --------- MifDoc::TblColumn ------------------------------------------------
+
+void MifDoc::TblColumn::out( MifOutputByteStream &os ) {
+
+    os << '\n' << MifOutputByteStream::INDENT << "<TblFormat ";
+    os.indent();
+
+    CHECK_PROPERTY( TblColumnNum );
+    CHECK_PROPERTY( TblColumnWidth );
+
+    os.undent();
+    os << '\n' << MifOutputByteStream::INDENT << ">";
+}
+
+// --------- MifDoc::TblFormat ------------------------------------------------
+
+void MifDoc::TblFormat::out( MifOutputByteStream &os ) {
+
+    os << '\n' << MifOutputByteStream::INDENT << "<TblFormat ";
+    os.indent();
+
+    CHECK_PROPERTY( TblTag );
+    CHECK_PROPERTY( TblLIndent );
+    CHECK_PROPERTY( TblRIndent );
+    CHECK_PROPERTY( TblSpBefore );
+    CHECK_PROPERTY( TblSpAfter );
+    CHECK_PROPERTY( TblAlignment );
+    CHECK_PROPERTY( TblCellMargins );
+    CHECK_PROPERTY( TblTitlePlacement );
+    CHECK_PROPERTY( TblWidth );
+    for( size_t i = 0; i < TblColumns.size(); i++ ) TblColumns[i].out( os );
+
+    os.undent();
+    os << '\n' << MifOutputByteStream::INDENT << ">";
+}
+
+// --------- MifDoc::Tbl ------------------------------------------------------
+
+void MifDoc::Tbl::out( MifOutputByteStream &os, bool resolveCrossReferences ) {
+
+    os << '\n' << MifOutputByteStream::INDENT << "<Tbl ";
+    os.indent();
+    CHECK_PROPERTY( TblID );
+    CHECK_PROPERTY( TblTag );
+
+    if( setProperties & fTblFormat )
+        tblFormat.out( os );
+
+    CHECK_PROPERTY( TblNumColumns );
+    CHECK_VECTOR_OF_PROPERTIES( TblColumnWidth );
+
+    size_t i;
+
+    if( TblH.size() ) {
+        os << '\n' << MifOutputByteStream::INDENT << "<TblH ";
+        os.indent();
+        for( i = 0; i < TblH.size(); i++ ) TblH[i].out( os, resolveCrossReferences );
+        os.undent();
+        os << '\n' << MifOutputByteStream::INDENT << ">";
+    }
+
+    if( TblBody.size() ) {
+        os << '\n' << MifOutputByteStream::INDENT << "<TblBody ";
+        os.indent();
+        for( i = 0; i < TblBody.size(); i++ ) TblBody[i].out( os, resolveCrossReferences );
+        os.undent();
+        os << '\n' << MifOutputByteStream::INDENT << ">";
+    }
+
+    if( TblF.size() ) {
+        os << '\n' << MifOutputByteStream::INDENT << "<TblF ";
+        os.indent();
+        for( i = 0; i < TblF.size(); i++ ) TblF[i].out( os, resolveCrossReferences );
+        os.undent();
+        os << '\n' << MifOutputByteStream::INDENT << ">";
+    }
+    
+    os.undent();
+    os << '\n' << MifOutputByteStream::INDENT << ">";
+}
+
+// --------- MifDoc::Document -------------------------------------------------
+
+void MifDoc::Document::out( MifOutputByteStream &os ) {
+
+    os << '\n' << MifOutputByteStream::INDENT << "<Document ";
+    os.indent();
+    CHECK_PROPERTY( DMargins );
+    CHECK_PROPERTY( DColumns );
+    CHECK_PROPERTY( DColumnGap );
+    CHECK_PROPERTY( DPageSize );
+    CHECK_PROPERTY( DStartPage );
+    CHECK_PROPERTY( DPageNumStyle );
+    CHECK_PROPERTY( DTwoSides );
+    CHECK_PROPERTY( DParity );
+    os.undent();
+    os << '\n' << MifOutputByteStream::INDENT << ">";
+}
+
+// --------- MifDoc::XRefFormat -----------------------------------------------
+
+void MifDoc::XRefFormat::out( MifOutputByteStream &os ) {
+
+    os << '\n' << MifOutputByteStream::INDENT << "<XRefFormat ";
+    os.indent();
+    CHECK_PROPERTY( XRefName );
+    CHECK_PROPERTY( XRefDef );
+    os.undent();
+    os << '\n' << MifOutputByteStream::INDENT << ">";
+}
+
+// --------- MifDoc::XRef -----------------------------------------------------
+
+MifDoc::XRef::XRef( CrossRefInfo &crossRefInfo ) {
+
+    switch( crossRefInfo.type() ) {
+      case CrossRefInfo::XRef: {
+        MifDoc::T_pathname targetFileName( "<c\\>" );
+        int bookComponentIdx 
+         = crossRefInfo.sgmlId.size() > 0
+            ? MifDoc::CurInstance->elements().bookComponentIndex
+                  ( crossRefInfo.groveIndex, crossRefInfo.sgmlId )
+            : MifDoc::CurInstance->elements().bookComponentIndex
+                  ( crossRefInfo.groveIndex, crossRefInfo.elementIndex );
+        targetFileName
+         += MifDoc::T_pathname
+             ( MifDoc::CurInstance->bookComponents()[bookComponentIdx].FileName );
+        setXRefSrcFile( targetFileName );
+        setXRefName( MifDoc::sPageNumXRefFormatName );
+        setXRefSrcText( crossRefInfo.crossRefText() );
+        setXRefText( "000" );
+        break; }
+      default: assert( false );
+    }
+}
+
+void MifDoc::XRef::out( MifOutputByteStream &os ) {
+
+    os << '\n' << MifOutputByteStream::INDENT << "<XRef ";
+    os.indent();
+    CHECK_PROPERTY( XRefName );
+    if( setProperties & fXRefSrcText )
+        XRefSrcText.escapeSpecialChars();
+    CHECK_PROPERTY( XRefSrcText );
+    CHECK_PROPERTY( XRefSrcFile );
+    os.undent();
+    os << '\n' << MifOutputByteStream::INDENT << ">";
+    if( setProperties & fXRefText )
+        os << '\n' << MifOutputByteStream::INDENT
+           << "<String " << XRefText << ">"; 
+    os << '\n' << MifOutputByteStream::INDENT << "<XRefEnd>";
+}
+
+// --------- MifDoc::Marker ---------------------------------------------------
+
+MifDoc::Marker::Marker( CrossRefInfo &crossRefInfo, bool linkDestinationMode ) {
+
+    switch( crossRefInfo.type() ) {
+      case CrossRefInfo::PotentialMarker:
+        if( linkDestinationMode ) {
+            setMType( Hypertext );
+            setMText( "newlink " );
+            MText += crossRefInfo.crossRefText();
+        } else {
+            setMType( XRef );
+            setMText( crossRefInfo.crossRefText() );
+        }
+        break;
+
+      case CrossRefInfo::HypertextLink: {
+        setMType( Hypertext );
+        MifDoc::T_pathname targetFileName( "<c>" );
+        int bookComponentIdx 
+         = crossRefInfo.sgmlId.size() > 0
+            ? MifDoc::CurInstance->elements().bookComponentIndex
+                  ( crossRefInfo.groveIndex, crossRefInfo.sgmlId )
+            : MifDoc::CurInstance->elements().bookComponentIndex
+                  ( crossRefInfo.groveIndex, crossRefInfo.elementIndex );
+        targetFileName
+         += MifDoc::T_pathname
+             ( MifDoc::CurInstance->bookComponents()[bookComponentIdx].FileName );
+        setMText( T_string( "gotolink " ) );
+        MText += targetFileName;
+        MText += ':';
+        MText += crossRefInfo.crossRefText();
+        break; }
+
+      case HypertextDestination:
+        setMText( T_string( "newlink " ) );
+        MText += crossRefInfo.crossRefText();
+        break;
+
+      default: assert( false );
+    }
+}
+
+void MifDoc::Marker::out( MifOutputByteStream &os ) {
+
+    os << '\n' << MifOutputByteStream::INDENT << "<Marker ";
+    os.indent();
+    CHECK_PROPERTY( MType );
+    if( setProperties & fMText )
+        MText.escapeSpecialChars();
+    CHECK_PROPERTY( MText );
+    os.undent();
+    os << '\n' << MifOutputByteStream::INDENT << ">";
+}
+
+// --------- MifDoc::Object ---------------------------------------------------
+
+void MifDoc::Object::outObjectProperties( MifOutputByteStream &os ) {
+
+    CHECK_PROPERTY( ID );
+    CHECK_PROPERTY( Pen );
+    CHECK_PROPERTY( Fill );
+    CHECK_PROPERTY( PenWidth );
+    CHECK_PROPERTY( ObColor );
+}
+
+// --------- MifDoc::PolyLine -------------------------------------------------
+
+void MifDoc::PolyLine::out( MifOutputByteStream &os ) {
+
+    os << '\n' << MifOutputByteStream::INDENT << "<PolyLine ";
+    os.indent();
+    outObjectProperties( os );
+    CHECK_PROPERTY( HeadCap );
+    CHECK_PROPERTY( TailCap );
+    for( size_t i = 0; i < Points.size(); i++ )
+        os << '\n' << MifOutputByteStream::INDENT << "<Point " << Points[i] << ">";
+    os.undent();
+    os << '\n' << MifOutputByteStream::INDENT << ">";
+}
+
+// --------- MifDoc::ImportObject ---------------------------------------------
+
+void MifDoc::ImportObject::out( MifOutputByteStream &os ) {
+
+    os << '\n' << MifOutputByteStream::INDENT << "<ImportObject ";
+    os.indent();
+    outObjectProperties( os );
+    CHECK_PROPERTY( ImportObFileDI );
+    CHECK_PROPERTY( BitMapDpi );
+    CHECK_PROPERTY( ShapeRect );
+    CHECK_PROPERTY( ImportObFixedSize );
+    CHECK_PROPERTY( NativeOrigin );
+    os.undent();
+    os << '\n' << MifOutputByteStream::INDENT << ">";
+}
+
+// --------- MifDoc::Frame ----------------------------------------------------
+
+void MifDoc::Frame::out( MifOutputByteStream &os ) {
+
+    os << '\n' << MifOutputByteStream::INDENT << "<Frame ";
+    os.indent();
+    outObjectProperties( os );
+    CHECK_PROPERTY( ShapeRect );
+    CHECK_PROPERTY( FrameType );
+    CHECK_PROPERTY( NSOffset );
+    CHECK_PROPERTY( BLOffset );
+    CHECK_PROPERTY( AnchorAlign );
+    for( size_t i = 0; i < Objects.size(); i++ ) Objects[i]->out( os );
+    os.undent();
+    os << '\n' << MifOutputByteStream::INDENT << ">";
+}
+
+// --------- MifDoc::TextRect -------------------------------------------------
+
+void MifDoc::TextRect::out( MifOutputByteStream &os ) {
+
+    os << '\n' << MifOutputByteStream::INDENT << "<TextRect ";
+    os.indent();
+    outObjectProperties( os );
+    CHECK_PROPERTY( ShapeRect );
+    CHECK_PROPERTY( TRNumColumns );
+    CHECK_PROPERTY( TRColumnGap );
+    CHECK_PROPERTY( TRColumnBalance );
+    os.undent();
+    os << '\n' << MifOutputByteStream::INDENT << ">";
+}
+
+// --------- MifDoc::Page -----------------------------------------------------
+
+void MifDoc::Page::out( MifOutputByteStream &os ) {
+
+    os << '\n' << MifOutputByteStream::INDENT << "<Page ";
+    os.indent();
+    CHECK_PROPERTY( PageType );
+    CHECK_PROPERTY( PageTag );
+    CHECK_PROPERTY( PageBackground );
+    for( size_t i = 0; i < TextRects.size(); i++ )
+        TextRects[i].out( os );
+    os.undent();
+    os << '\n' << MifOutputByteStream::INDENT << ">";
+}                                      
+
+// --------- MifDoc::TabStop --------------------------------------------------
+
+void MifDoc::TabStop::out( MifOutputByteStream &os ) {
+
+    os << '\n' << MifOutputByteStream::INDENT << "<TabStop ";
+    os.indent();
+    CHECK_PROPERTY( TSX );
+    CHECK_PROPERTY( TSType );
+    CHECK_PROPERTY( TSLeaderStr );
+    CHECK_PROPERTY( TSDecimalChar );
+    os.undent();
+    os << '\n' << MifOutputByteStream::INDENT << ">";
+}
+
+// --------- MifDoc::Para -----------------------------------------------------
+
+void MifDoc::Para::out( MifOutputByteStream &os ) {
+
+    outProlog( os );
+    MifDoc::ParaLine::outProlog( os );
+    content().commit( os.stream() );
+    MifDoc::ParaLine::outEpilog( os );
+    outEpilog( os );
+}
+
+void MifDoc::Para::outSimpleProlog( MifOutputByteStream &os ) {
+
+    currentlyOpened = true;
+    os << '\n' << MifOutputByteStream::INDENT << "<Para ";
+    os.indent();
+}
+
+void MifDoc::Para::outProlog( MifOutputByteStream &os ) {
+
+    currentlyOpened = true;
+    outSimpleProlog( os );
+    CHECK_PROPERTY( PgfTag );
+    if( setProperties & fParagraphFormat )
+        format().out( os );
+}
+
+void MifDoc::Para::outEpilog( MifOutputByteStream &os ) {
+
+    os.undent();
+    os << '\n' << MifOutputByteStream::INDENT << ">";
+    currentlyOpened = false;
+}
+
+// --------- MifDoc::ParaLine -------------------------------------------------
+
+void MifDoc::ParaLine::outProlog( MifOutputByteStream &os ) {
+
+    os << '\n' << MifOutputByteStream::INDENT << "<ParaLine ";
+    os.indent();
+    
+    MifDoc::TextFlow *tf = MifDoc::CurInstance->curTextFlow();
+    if( tf != NULL && !tf->TextRectIDUsed ) {
+        setTextRectID( tf->TextRectID );
+        CHECK_PROPERTY( TextRectID );
+        setProperties &= ~fTextRectID;
+        tf->TextRectIDUsed = true;
+    }
+
+    MifDoc::Tbl *tbl = MifDoc::CurInstance->curTbl( false );
+    if( tbl != NULL && !tbl->TblIDUsed ) {
+        setATbl( tbl->TblID );
+        CHECK_PROPERTY( ATbl );
+        setProperties &= ~fATbl;
+        tbl->TblIDUsed = true;
+    }
+}
+
+void MifDoc::ParaLine::outEpilog( MifOutputByteStream &os ) {
+
+    os.undent();
+    os << '\n' << MifOutputByteStream::INDENT << ">";
+}
+
+
+// --------- MifDoc::PgfCatalog -----------------------------------------------
+
+void MifDoc::PgfCatalog::out( MifOutputByteStream &os ) {
+
+    os << '\n' << MifOutputByteStream::INDENT << "<PgfCatalog ";
+    os.indent();
+    for( size_t i = 0; i < ParaFormats.size(); i++ ) ParaFormats[i].out( os, false );
+    os.undent();
+    os << '\n' << MifOutputByteStream::INDENT << ">";
+}
+
+// --------- MifDoc::TblCatalog -----------------------------------------------
+
+void MifDoc::TblCatalog::out( MifOutputByteStream &os ) {
+
+    if( TblFormats.size() > 0 ) {
+        os << '\n' << MifOutputByteStream::INDENT << "<TblCatalog ";
+        os.indent();
+        for( size_t i = 0; i < TblFormats.size(); i++ ) TblFormats[i].out( os );
+        os.undent();
+        os << '\n' << MifOutputByteStream::INDENT << ">";
+    }
+}
+
+// ----------------------------------------------------------------------------
+
+#define COMPARE_PROPERTY( propertyName ) \
+\
+    if( propertyName != f.propertyName ) \
+        differingProperties |= f ## propertyName;        
+
+#define COND_SET_PROPERTY( propertyName ) \
+\
+    if( properties & f ## propertyName ) \
+        propertyName =  f.propertyName;        
+
+#define PROPERTY_OUT( propertyName ) \
+\
+    if( properties & f ## propertyName ) \
+        os << '\n' << MifOutputByteStream::INDENT \
+           << "<" #propertyName " " << propertyName << ">"; 
+
+// --------- MifDoc::FontFormat -----------------------------------------------
+
+unsigned MifDoc::FontFormat::compare( FontFormat &f ) {
+
+    unsigned differingProperties = 0;
+
+    COMPARE_PROPERTY( FFamily );
+    COMPARE_PROPERTY( FAngle );
+    COMPARE_PROPERTY( FWeight );
+    COMPARE_PROPERTY( FVar );
+    COMPARE_PROPERTY( FSize );
+    COMPARE_PROPERTY( FColor );
+    COMPARE_PROPERTY( FUnderlining );
+    COMPARE_PROPERTY( FOverline );
+    COMPARE_PROPERTY( FStrike );
+    COMPARE_PROPERTY( FPosition );
+    COMPARE_PROPERTY( FPairKern );
+    COMPARE_PROPERTY( FCase );
+    COMPARE_PROPERTY( FDX );
+    COMPARE_PROPERTY( FDY );
+    COMPARE_PROPERTY( FDW );
+
+    return differingProperties;
+}
+
+void MifDoc::FontFormat::setFrom( FontFormat &f, unsigned properties ) {
+
+    COND_SET_PROPERTY( FFamily );
+    COND_SET_PROPERTY( FAngle );
+    COND_SET_PROPERTY( FWeight );
+    COND_SET_PROPERTY( FVar );
+    COND_SET_PROPERTY( FSize );
+    COND_SET_PROPERTY( FColor );
+    COND_SET_PROPERTY( FUnderlining );
+    COND_SET_PROPERTY( FOverline );
+    COND_SET_PROPERTY( FStrike );
+    COND_SET_PROPERTY( FPosition );
+    COND_SET_PROPERTY( FPairKern );
+    COND_SET_PROPERTY( FCase );
+    COND_SET_PROPERTY( FDX );
+    COND_SET_PROPERTY( FDY );
+    COND_SET_PROPERTY( FDW );
+}
+
+void MifDoc::FontFormat::out( MifOutputByteStream &os,
+                              unsigned properties,
+                              FontStatement fontStatement ) {
+
+    const char *statementName = (fontStatement == stPgfFont) ? "PgfFont" : "Font";
+
+    if( properties ) {
+
+        os << '\n' << MifOutputByteStream::INDENT << "<" << statementName << " ";
+        os.indent();
+
+        PROPERTY_OUT( FFamily );
+        PROPERTY_OUT( FAngle );
+        PROPERTY_OUT( FWeight );
+        PROPERTY_OUT( FVar );
+        PROPERTY_OUT( FSize );
+        PROPERTY_OUT( FColor );
+        PROPERTY_OUT( FUnderlining );
+        PROPERTY_OUT( FOverline );
+        PROPERTY_OUT( FStrike );
+        PROPERTY_OUT( FPosition );
+        PROPERTY_OUT( FPairKern );
+        PROPERTY_OUT( FCase );
+        PROPERTY_OUT( FDX );
+        PROPERTY_OUT( FDY );
+        PROPERTY_OUT( FDW );
+
+        os.undent();
+        os << '\n' << MifOutputByteStream::INDENT << ">";
+    }
+}
+
+void MifDoc::FontFormat::updateFrom( FontFormat &f ) {
+
+    unsigned differingProperties = FontFormat::compare( f );
+    setFrom( f, differingProperties );
+    setProperties = differingProperties;
+}
+
+// --------- MifDoc::ParagraphFormat ------------------------------------------
+
+unsigned MifDoc::ParagraphFormat::compare( ParagraphFormat &f ) {
+
+    unsigned differingProperties = 0;
+
+    COMPARE_PROPERTY( PgfTag );
+    COMPARE_PROPERTY( PgfLanguage );
+    COMPARE_PROPERTY( PgfFIndent );
+    COMPARE_PROPERTY( PgfLIndent );
+    COMPARE_PROPERTY( PgfRIndent );
+    COMPARE_PROPERTY( PgfAlignment );
+    COMPARE_PROPERTY( PgfSpBefore );
+    COMPARE_PROPERTY( PgfSpAfter );
+    COMPARE_PROPERTY( PgfLineSpacing );
+    COMPARE_PROPERTY( PgfLeading );
+    COMPARE_PROPERTY( PgfNumTabs );
+    COMPARE_PROPERTY( PgfPlacement );
+    COMPARE_PROPERTY( PgfPlacementStyle );
+    COMPARE_PROPERTY( PgfWithPrev );
+    COMPARE_PROPERTY( PgfWithNext );
+    COMPARE_PROPERTY( PgfBlockSize );
+    COMPARE_PROPERTY( PgfAutoNum );
+    COMPARE_PROPERTY( PgfNumFormat );
+    COMPARE_PROPERTY( PgfNumberFont );
+    COMPARE_PROPERTY( PgfHyphenate );
+    COMPARE_PROPERTY( HyphenMaxLines );
+    COMPARE_PROPERTY( HyphenMinPrefix );
+    COMPARE_PROPERTY( HyphenMinSuffix );
+    COMPARE_PROPERTY( HyphenMinWord );
+    COMPARE_PROPERTY( PgfLetterSpace );
+    COMPARE_PROPERTY( PgfCellAlignment );
+    COMPARE_PROPERTY( PgfCellMargins );
+    COMPARE_PROPERTY( PgfCellLMarginFixed );
+    COMPARE_PROPERTY( PgfCellTMarginFixed );
+    COMPARE_PROPERTY( PgfCellRMarginFixed );
+    COMPARE_PROPERTY( PgfCellBMarginFixed );
+
+    return differingProperties;
+}
+
+void MifDoc::ParagraphFormat::setFrom( ParagraphFormat &f,
+                                       unsigned properties,
+                                       unsigned fontProperties ) {
+    COND_SET_PROPERTY( PgfTag );
+    COND_SET_PROPERTY( PgfLanguage );
+    COND_SET_PROPERTY( PgfFIndent );
+    COND_SET_PROPERTY( PgfLIndent );
+    COND_SET_PROPERTY( PgfRIndent );
+    COND_SET_PROPERTY( PgfAlignment );
+    COND_SET_PROPERTY( PgfSpBefore );
+    COND_SET_PROPERTY( PgfSpAfter );
+    COND_SET_PROPERTY( PgfLineSpacing );
+    COND_SET_PROPERTY( PgfLeading );
+    COND_SET_PROPERTY( PgfNumTabs );
+    COND_SET_PROPERTY( PgfPlacement );
+    COND_SET_PROPERTY( PgfPlacementStyle );
+    COND_SET_PROPERTY( PgfWithPrev );
+    COND_SET_PROPERTY( PgfWithNext );
+    COND_SET_PROPERTY( PgfBlockSize );
+    COND_SET_PROPERTY( PgfAutoNum );
+    COND_SET_PROPERTY( PgfNumFormat );
+    COND_SET_PROPERTY( PgfNumberFont );
+    COND_SET_PROPERTY( PgfHyphenate );
+    COND_SET_PROPERTY( HyphenMaxLines );
+    COND_SET_PROPERTY( HyphenMinPrefix );
+    COND_SET_PROPERTY( HyphenMinSuffix );
+    COND_SET_PROPERTY( HyphenMinWord );
+    COND_SET_PROPERTY( PgfLetterSpace );
+    COND_SET_PROPERTY( PgfCellAlignment );
+    COND_SET_PROPERTY( PgfCellMargins );
+    COND_SET_PROPERTY( PgfCellLMarginFixed );
+    COND_SET_PROPERTY( PgfCellTMarginFixed );
+    COND_SET_PROPERTY( PgfCellRMarginFixed );
+    COND_SET_PROPERTY( PgfCellBMarginFixed );
+
+    FontFormat::setFrom( f, fontProperties );
+}
+
+void MifDoc::ParagraphFormat::out( MifOutputByteStream &os,
+                                   unsigned properties,
+                                   unsigned fontProperties,
+                                   bool excludeCellProperties ) {
+
+    bool outPgfTag = false;
+    T_tagstring pgfTag;
+
+    if( !( properties & fPgfTag ) ) {
+        MifDoc::TagStream &ts = MifDoc::CurInstance->curTagStream();
+        if( !ts.PgfTagUsed ) {
+            pgfTag = ts.InitialPgfTag;
+            outPgfTag = true;
+            ts.PgfTagUsed = true;
+        }
+    }
+
+    if( properties != 0 || fontProperties != 0 || outPgfTag ) {
+
+        os << '\n' << MifOutputByteStream::INDENT << "<Pgf ";
+        os.indent();
+
+        if( outPgfTag )
+          os << '\n' << MifOutputByteStream::INDENT << "<PgfTag " << pgfTag << ">"; 
+        else 
+          PROPERTY_OUT( PgfTag );
+
+        FontFormat::out( os, fontProperties, FontFormat::stPgfFont );
+
+        PROPERTY_OUT( PgfLanguage );
+        PROPERTY_OUT( PgfFIndent );
+        PROPERTY_OUT( PgfLIndent );
+        PROPERTY_OUT( PgfRIndent );
+        PROPERTY_OUT( PgfAlignment );
+        PROPERTY_OUT( PgfSpBefore );
+        PROPERTY_OUT( PgfSpAfter );
+        PROPERTY_OUT( PgfLineSpacing );
+        PROPERTY_OUT( PgfLeading );
+
+        PROPERTY_OUT( PgfNumTabs );
+        if( properties & fTabStops )
+            for( size_t i = 0; i < TabStops.size(); i++ ) TabStops[i].out( os );
+
+        PROPERTY_OUT( PgfPlacement );
+        PROPERTY_OUT( PgfPlacementStyle );
+        PROPERTY_OUT( PgfWithPrev );
+        PROPERTY_OUT( PgfWithNext );
+        PROPERTY_OUT( PgfBlockSize );
+        PROPERTY_OUT( PgfAutoNum );
+        PROPERTY_OUT( PgfNumFormat );
+        PROPERTY_OUT( PgfNumberFont );
+        PROPERTY_OUT( PgfHyphenate );
+        PROPERTY_OUT( HyphenMaxLines );
+        PROPERTY_OUT( HyphenMinPrefix );
+        PROPERTY_OUT( HyphenMinSuffix );
+        PROPERTY_OUT( HyphenMinWord );
+        PROPERTY_OUT( PgfLetterSpace );
+
+        if( MifDoc::CurInstance->curCell() != NULL || !excludeCellProperties ) {
+
+            PROPERTY_OUT( PgfCellAlignment );
+            PROPERTY_OUT( PgfCellMargins );
+            PROPERTY_OUT( PgfCellLMarginFixed );
+            PROPERTY_OUT( PgfCellTMarginFixed );
+            PROPERTY_OUT( PgfCellRMarginFixed );
+            PROPERTY_OUT( PgfCellBMarginFixed );
+        }
+
+        os.undent();
+        os << '\n' << MifOutputByteStream::INDENT << ">";
+    }
+}
+
+void MifDoc::ParagraphFormat::updateFrom( ParagraphFormat &f ) {
+
+    FontFormat::updateFrom( f );
+
+    unsigned differingProperties = compare( f );
+    setFrom( f, differingProperties, 0 );
+    setProperties = differingProperties;
+}
+
+// --------- MifDoc::BookComponent --------------------------------------------
+
+MifDoc::BookComponent::BookComponent( MifTmpOutputByteStream *epilogOs )
+  : epilogOs( epilogOs ), pageNumXRefFormatGenerated( false ) {
+}  
+
+void MifDoc::BookComponent::commit
+( const String<CmdLineApp::AppChar> &dirName, bool resolveCrossReferences ) {
+
+    assert( FileName.size() > 0 );
+    String<CmdLineApp::AppChar> fileLoc;
+    fileLoc += dirName; fileLoc += FileName; fileLoc += 0;
+    FileOutputByteStream outFile;
+    if( outFile.open( fileLoc.data() ) ) {
+    
+        MifOutputByteStream os( outFile );
+
+        os << "<MIFFile 5.0>";
+
+        colorCatalog.out( os );
+        pgfCatalog.out( os );
+        rulingCatalog.out( os );
+
+        size_t i;
+        if( AFrames.size() ) {
+            os << "\n<AFrames ";
+            os.indent();
+            for( i = 0; i < AFrames.size(); i++ ) AFrames[i].out( os );
+            os.undent();
+            os << '\n' << ">";
+        }
+
+        if( XRefFormats.size() ) {
+            os << "\n<XRefFormats ";
+            os.indent();
+            for( i = 0; i < XRefFormats.size(); i++ ) XRefFormats[i].out( os );
+            os.undent();
+            os << '\n' << ">";
+        }
+
+        tblCatalog.out( os );
+        document.out( os );
+    
+        if( Tbls.size() ) {
+            os << "\n<Tbls ";
+            os.indent();
+            for( i = 0; i < Tbls.size(); i++ ) Tbls[i].out( os, resolveCrossReferences );
+            os.undent();
+            os << '\n' << ">";
+        }
+    
+        for( i = 0; i < Pages.size(); i++ ) Pages[i].out( os );
+        for( i = 0; i < TextFlows.size(); i++ ) TextFlows[i].out( os, resolveCrossReferences );
+    
+        if( epilogOs )
+            epilogOs->commit( os.stream(), resolveCrossReferences );    
+
+    } else {
+        MifDoc::curInstance().App->message
+         ( MifMessages::cannotOpenOutputError,
+           StringMessageArg( MifDoc::curInstance().App->convertInput( fileLoc.data() ) ),
+           ErrnoMessageArg( errno ) );
+        return;
+    }
+}
+
+// --------- MifDoc -----------------------------------------------------------
+
+MifDoc::MifDoc( const String<CmdLineApp::AppChar> &fileLoc, CmdLineApp *app )
+ : App( app ), RootOutputFileLoc( fileLoc ), CurTblNum( 0 ), CurTextFlow( NULL ),
+   CurCell( NULL ), CurPara( NULL ), NextID( 0 ) {
+
+    if( RootOutputFileLoc.size() > 0 && RootOutputFileLoc[RootOutputFileLoc.size()-1] == 0 )
+        RootOutputFileLoc.resize( RootOutputFileLoc.size() - 1 );
+
+    CurInstance = this;
+    enterBookComponent();
+}
+
+MifDoc::~MifDoc() {
+
+    commit();
+}
+
+void MifDoc::commit() {
+
+    String<CmdLineApp::AppChar> outDir = rootOutputFileLoc();
+    String<CmdLineApp::AppChar> outFileName;
+
+    { int i;
+    for( i = outDir.size() - 1; i >= 0; i-- )
+        if( outDir[i] == '/' || outDir[i] == '\\' )
+            break;
+    if( outDir.size() - (i+1) > 0 )
+        outFileName.assign( &outDir.data()[i+1], outDir.size() - (i+1) );
+    outDir.resize( i + 1 ); }
+  
+    if( BookComponents.size() > 1 ) {
+        String<CmdLineApp::AppChar> bookFileLoc( rootOutputFileLoc() );
+        String<CmdLineApp::AppChar> fileNameExt;
+
+        { size_t idx;
+        for( idx = bookFileLoc.size(); idx > 0; idx-- )
+            if( bookFileLoc[idx-1] == char( '.' ) )
+                break;
+        if( idx > 0 && bookFileLoc.size() - idx > 0 )
+            fileNameExt.assign( &bookFileLoc[idx], bookFileLoc.size() - idx );
+        else {
+            fileNameExt += 'm'; fileNameExt += 'i'; fileNameExt += 'f';
+        } }
+
+        String<CmdLineApp::AppChar> fileName;
+        char idxStr[32];
+        for( size_t i = 0; i < BookComponents.size(); i++ ) {
+            fileName.resize( 0 );          
+            sprintf( idxStr, "%u", i+1 );
+            for( const char *c = idxStr; *c; c++)
+                fileName += CmdLineApp::AppChar(*c);
+            fileName += '.'; fileName += fileNameExt;
+            BookComponents[i].FileName = fileName;  
+        }
+
+        bookFileLoc += 0;
+        FileOutputByteStream bookFile;
+        if( bookFile.open( bookFileLoc.data() ) ) {
+    
+            MifOutputByteStream os( bookFile );
+            os << "<Book 5.0>";
+            for( size_t i = 0; i < BookComponents.size(); i++ )
+                os << "\n<BookComponent"
+                   << "\n  <FileName `<c\\>" << BookComponents[i].FileName << "\'>"
+                   << "\n>";
+        } else {
+
+            MifDoc::curInstance().App->message
+             ( MifMessages::cannotOpenOutputError,
+               StringMessageArg( MifDoc::curInstance().App->convertInput( bookFileLoc.data() ) ),
+               ErrnoMessageArg( errno ) );
+        }
+    
+    } else
+        if( BookComponents.size() == 1 )
+            BookComponents[0].FileName = outFileName;
+        
+    for( size_t i = 0; i < BookComponents.size(); i++ )
+        BookComponents[i].commit( outDir );
+}
+
+void MifDoc::enterBookComponent() {
+
+    TagStream *defaultTagStream = new TagStream( MifDoc::T_indent( 0 ) );
+    enterTagStream( *defaultTagStream );
+    BookComponent newBookComponent( &defaultTagStream->content() );
+    bookComponents().push_back( newBookComponent );
+}
+
+void MifDoc::exitBookComponent() {
+
+    exitTagStream();
+}
+
+void MifDoc::outAFrame( T_ID ID, MifOutputByteStream &os ) {
+
+    os << '\n' << MifOutputByteStream::INDENT << "<AFrame " << ID << ">";
+}
+
+void MifDoc::switchToTagStream( TagStream &tagStream, bool startWithDefaultPgfFormat ) {
+
+    if( tagStream.TagStreamClass == TagStream::tsTextFlow )
+        setCurTextFlow( (MifDoc::TextFlow*)&tagStream );
+    else
+        if( tagStream.TagStreamClass == TagStream::tsCell )
+            setCurCell( (MifDoc::Cell*)&tagStream );
+
+    if( tagStream.TagStreamClass == TagStream::tsPara ) {
+        MifDoc::Para::currentlyOpened = true;
+    } else
+        if( startWithDefaultPgfFormat ) {
+            tagStream.PgfTagUsed = false;
+            MifDoc::ParagraphFormat defaultPgfFormat;
+            defaultPgfFormat.setDSSSLDefaults();
+            setCurParagraphFormat( defaultPgfFormat );
+        }
+    setCurOs( tagStream.content().stream() );
+}
+
+void MifDoc::enterTagStream( TagStream &tagStream ) {
+
+    TagStreamStack.resize( TagStreamStack.size() + 1 );
+    TagStreamStack.back() = &tagStream;
+    switchToTagStream( *TagStreamStack.back() );
+}
+
+void MifDoc::exitTagStream() {
+
+    bool startWithDefaultPgfFormat = true;
+
+    assert( TagStreamStack.size() > 0 );
+    if( TagStreamStack.back()->TagStreamClass == TagStream::tsPara ) {
+        MifDoc::Para::currentlyOpened = false;
+        startWithDefaultPgfFormat = false;
+    }
+    TagStreamStack.resize( TagStreamStack.size() - 1 );
+    if( TagStreamStack.size() >= 1 )
+        switchToTagStream( *TagStreamStack.back(), startWithDefaultPgfFormat );
+}
+
+void MifDoc::outTagEnd() { os() << ">"; }
+
+void MifDoc::outHexChar( unsigned code, MifOutputByteStream *o ) {
+
+    MifOutputByteStream &outS = ( o != NULL ) ? *o : os();
+    static const char hex[] = "0123456789abcdef";
+    outS << "\\x" << hex[(code >> 4) & 0xf] << hex[code & 0xf] << " ";
+}
+
+void MifDoc::outHexChar( unsigned code, String<char> &targetString ) {
+
+    static const char hex[] = "0123456789abcdef";
+    targetString += '\\'; targetString += 'x';
+    targetString += hex[(code >> 4) & 0xf];
+    targetString += hex[code & 0xf];
+    targetString += ' ';
+}
+
+void MifDoc::outSpecialChar( const String<char> &charName, MifOutputByteStream *o ) {
+
+    MifOutputByteStream &outS = ( o != NULL ) ? *o : os();
+    outS << '\n' << MifOutputByteStream::INDENT << "<Char " << charName << ">";
+}
+
+void MifDoc::outBreakingPara( MifDoc::T_keyword pgfPlacement ) {
+
+        curFormat().setPgfSpBefore( 0 ),
+        curFormat().setPgfSpAfter( 0 ),
+        curFormat().setPgfPlacement( pgfPlacement );
+        Para::outSimpleProlog( os() );
+        curFormat().out( os() );
+        ParaLine::outProlog( os() );
+        ParaLine::outEpilog( os() );
+        Para::outEpilog( os() );
+}
+
+void MifDoc::beginParaLine() {
+
+    MifDoc::ParaLine::outProlog( os() );
+}
+
+void MifDoc::endParaLine() {
+
+    MifDoc::ParaLine::outEpilog( os() );
+}
+
+void MifDoc::outPageNumber() {
+
+    os() << '\n' << MifOutputByteStream::INDENT
+         << "<Variable <VariableName `Current Page #'>>";
+}
+
+// --------- MifDoc::ElementSet -----------------------------------------------
+
+MifDoc::ElementSet::ElementSet() {}
+
+int MifDoc::ElementSet::bookComponentIndex( unsigned long groveIndex, unsigned long n ) const {
+
+    unsigned short flags;
+    if( getFlags( groveIndex, n, flags ) )
+        return int( flags & BOOK_COMPONENT_INDEX_M() );
+
+    assert( false );
+    return 0;
+}
+
+int MifDoc::ElementSet::bookComponentIndex
+ ( unsigned long groveIndex, const StringC &sgmlId ) {
+
+    SgmlIdInfo &sgmlIdInfo = enforceSgmlId( sgmlId, groveIndex );
+    return int( sgmlIdInfo.flags & BOOK_COMPONENT_INDEX_M() );
+}
+
+void MifDoc::ElementSet::setBookComponentIndex
+ ( unsigned long groveIndex, unsigned long n, int i ) {
+
+    unsigned short flags = 0;
+    getFlags( groveIndex, n, flags );
+    add( groveIndex, n,
+         ( flags & LINK_TYPE_MASK( AnyReference ) )
+          | (unsigned short)( i & BOOK_COMPONENT_INDEX_M() ) );
+}
+
+void MifDoc::ElementSet::setBookComponentIndex
+ ( unsigned long groveIndex, const StringC &sgmlId, int i ) {
+
+    SgmlIdInfo &sgmlIdInfo = enforceSgmlId( sgmlId, groveIndex );
+    unsigned short flags = sgmlIdInfo.flags;
+    sgmlIdInfo.flags = ( flags & LINK_TYPE_MASK( AnyReference ) )
+                          | (unsigned short)( i & BOOK_COMPONENT_INDEX_M() );
+}
+
+bool MifDoc::ElementSet::hasBeenReferenced
+ ( ReferenceType refType, unsigned long groveIndex, unsigned long n ) const {
+
+    unsigned short flags = 0;
+    getFlags( groveIndex, n, flags );
+    return ( flags & LINK_TYPE_MASK( refType ) ) != 0 ? true : false;
+}
+
+bool MifDoc::ElementSet::hasBeenReferenced
+ ( ReferenceType refType, unsigned long groveIndex, const StringC &sgmlId )  {
+
+    SgmlIdInfo &sgmlIdInfo = enforceSgmlId( sgmlId, groveIndex );
+    return ( sgmlIdInfo.flags & LINK_TYPE_MASK( refType ) ) != 0 ? true : false;
+}
+
+MifDoc::ElementSet::SgmlIdInfo &MifDoc::ElementSet::enforceSgmlId
+ ( const StringC &sgmlId, unsigned long groveIndex ) {
+
+    SgmlIdInfo *result = SgmlIdInfos.lookup( sgmlId );
+    if( result == NULL ) {
+        result = new SgmlIdInfo( sgmlId, groveIndex );
+        SgmlIdInfos.insert( result );
+    }
+    return *result;
+}
+
+void MifDoc::ElementSet::setReferencedFlag
+ ( ReferenceType refType, unsigned long groveIndex, unsigned long n ) {
+
+    assert( refType != AnyReference );
+    unsigned short flags = 0;
+    getFlags( groveIndex, n, flags );
+    add( groveIndex, n, flags | LINK_TYPE_MASK( refType ) );
+}
+
+void MifDoc::ElementSet::setReferencedFlag
+ ( ReferenceType refType, unsigned long groveIndex, const StringC &sgmlId ) {
+
+    SgmlIdInfo &sgmlIdInfo = enforceSgmlId( sgmlId, groveIndex );
+    assert( refType != AnyReference );
+    sgmlIdInfo.flags |= LINK_TYPE_MASK( refType );
+}
+
+void MifDoc::ElementSet::add
+ ( unsigned long groveIndex, unsigned long n, unsigned short flags  ) {
+
+    if( groveIndex >= Flags.size() )
+        Flags.resize( groveIndex + 1 );
+    Vector<unsigned short> &elems = Flags[groveIndex];
+    if( n >= elems.size() ) {
+        for( size_t k = 1 + (n - elems.size()); k > 0; --k )
+            elems.push_back(0);
+    }
+    elems[n] = flags;
+}
+
+bool MifDoc::ElementSet::getFlags
+ ( unsigned long groveIndex, unsigned long n, unsigned short &result ) const {
+
+  if( groveIndex < Flags.size() && n < Flags[groveIndex].size() ) {
+    result = Flags[groveIndex][n];
+    return true;        
+  } else
+    return false;
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#include "MifFOTBuilder_inst.cxx"
+
+#endif /* JADE_MIF */
diff --git a/jade/MifFOTBuilder.h b/jade/MifFOTBuilder.h
new file mode 100644 (file)
index 0000000..2bc2d46
--- /dev/null
@@ -0,0 +1,30 @@
+// Jade MIF backend
+// Copyright (c) 1997,1998 Kathleen Marszalek
+// Version 1.0a
+// Date: March 27th, 1998
+
+#ifndef MifFOTBuilder_INCLUDED
+#define MifFOTBuilder_INCLUDED 1
+
+#include "FOTBuilder.h"
+#include "Ptr.h"
+#include "ExtendEntityManager.h"
+#include "CharsetInfo.h"
+#include "CmdLineApp.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+FOTBuilder *
+makeMifFOTBuilder(const String<CmdLineApp::AppChar> &fileLoc,
+                 const Ptr<ExtendEntityManager> &,
+                 const CharsetInfo &,
+                 CmdLineApp *app,
+                 const FOTBuilder::Extension *&ext);
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not MifFOTBuilder_INCLUDED */
diff --git a/jade/MifFOTBuilder_inst.m4 b/jade/MifFOTBuilder_inst.m4
new file mode 100644 (file)
index 0000000..11443e6
--- /dev/null
@@ -0,0 +1,59 @@
+#ifdef SP_MANUAL_INST
+
+#define SP_DEFINE_TEMPLATES
+#include "IList.h"
+#include "IQueue.h"
+#include "Vector.h"
+#include "Hash.h"
+#include "PointerTable.h"
+#undef SP_DEFINE_TEMPLATES
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+__instantiate(IList<MifFOTBuilder::DisplayInfo>)
+__instantiate(IList<MifFOTBuilder::Format>)
+__instantiate(Vector<MifFOTBuilder::Row>)
+__instantiate(Vector<MifFOTBuilder::Cell>)
+__instantiate(Vector<MifFOTBuilder::Column>)
+__instantiate(Vector<MifFOTBuilder::TablePart>)
+__instantiate(Vector<MifFOTBuilder::NodeInfo>)
+__instantiate(Vector<MifFOTBuilder::LinkInfo>)
+__instantiate(Vector<MifDoc::Marker>)
+__instantiate(IQueue<MifFOTBuilder::DisplaySpaceInfo>)
+__instantiate(Vector<MifDoc::TagStream*>)
+__instantiate(Vector<MifDoc::T_dimension>)
+__instantiate(Vector<MifDoc::Tbl>)
+__instantiate(Vector<MifDoc::TblColumn>)
+__instantiate(Vector<MifDoc::Row>)
+__instantiate(Vector<MifDoc::Cell>)
+__instantiate(Vector<MifDoc::Page>)
+__instantiate(Vector<MifDoc::TextRect>)
+__instantiate(Vector<MifDoc::TextFlow>)
+__instantiate(Vector<MifDoc::ParagraphFormat>)
+__instantiate(Vector<MifDoc::TblFormat>)
+__instantiate(Vector<MifDoc::TabStop>)
+__instantiate(Vector<MifDoc::BookComponent>)
+__instantiate(Vector<MifDoc::Frame>)
+__instantiate(Vector<MifDoc::Object*>)
+__instantiate(Vector<MifDoc::T_XY>)
+__instantiate(Vector<MifDoc::CrossRefInfo>)
+__instantiate(`PointerTable<MifDoc::Ruling*, String<char>, StringHash, MifDoc::Ruling>')
+__instantiate(`PointerTableIter<MifDoc::Ruling*, String<char>, StringHash, MifDoc::Ruling>')
+__instantiate(Vector<MifDoc::Ruling*>)
+__instantiate(`PointerTable<MifDoc::Color*, String<char>, StringHash, MifDoc::Color>')
+__instantiate(`PointerTableIter<MifDoc::Color*, String<char>, StringHash, MifDoc::Color>')
+__instantiate(Vector<MifDoc::Color*>)
+__instantiate(`PointerTable<MifDoc::ElementSet::SgmlIdInfo*, StringC, Hash, MifDoc::ElementSet::SgmlIdInfo>')
+__instantiate(`PointerTableIter<MifDoc::ElementSet::SgmlIdInfo*, StringC, Hash, MifDoc::ElementSet::SgmlIdInfo>')
+__instantiate(Vector<MifDoc::ElementSet::SgmlIdInfo*>)
+__instantiate(Vector<MifDoc::XRefFormat>)
+__instantiate(Vector<unsigned short>)
+__instantiate(Vector<Vector<unsigned short> >)
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* SP_MANUAL_INST */
diff --git a/jade/MifMessages.msg b/jade/MifMessages.msg
new file mode 100644 (file)
index 0000000..4c0bf6a
--- /dev/null
@@ -0,0 +1,11 @@
+# Jade MIF backend
+# Copyright (c) 1997,1998 Kathleen Marszalek
+# Version 1.0a
+# Date: March 27th, 1998
+#
+=7000
+#
+E2+cannotOpenOutputError++MIF: cannot open output file %1 (%2)
+E1+systemIdNotFilename++MIF: could not convert system identifier %1 to a single filename
+W0+missingTableColumnFlowObject++MIF: missing table column flow object (table-auto-width feature not fully supported)
+#
\ No newline at end of file
diff --git a/jade/RtfFOTBuilder.cxx b/jade/RtfFOTBuilder.cxx
new file mode 100644 (file)
index 0000000..070bf94
--- /dev/null
@@ -0,0 +1,4390 @@
+// Copyright (c) 1996, 1997 James Clark
+// See the file copying.txt for copying permission.
+
+#include "config.h"
+#include "RtfFOTBuilder.h"
+#include "TmpOutputByteStream.h"
+#include "RtfMessages.h"
+#include "MessageArg.h"
+#include "Vector.h"
+#include "HashTable.h"
+#include "InputSource.h"
+#include "StorageManager.h"
+#include "Location.h"
+#include "macros.h"
+#include "CharMap.h"
+#include "CharsetRegistry.h"
+#ifdef WIN32
+#include "RtfOle.h"
+#endif
+#include "IList.h"
+#include <string.h>
+#include <limits.h>
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class NullOutputByteStream : public OutputByteStream {
+public:
+  NullOutputByteStream() { ptr_ = end_ = 0; }
+  void flush() { }
+  void flushBuf(char) { }
+};
+
+class ElementSet {
+public:
+  ElementSet();
+  void add(unsigned long, unsigned long);
+  bool contains(unsigned long, unsigned long) const;
+private:
+  Vector<Vector<char> > v_;
+};
+
+class RtfFOTBuilder : public SerialFOTBuilder {
+public:
+  RtfFOTBuilder(OutputByteStream *, const Vector<StringC> &, 
+               const Ptr<ExtendEntityManager> &, const CharsetInfo &, Messenger *);
+  ~RtfFOTBuilder();
+  void characters(const Char *, size_t);
+  void paragraphBreak(const ParagraphNIC &);
+  void externalGraphic(const ExternalGraphicNIC &);
+  void rule(const RuleNIC &);
+  void setFontSize(long n);
+  void setFontFamilyName(const StringC &);
+  void setFontWeight(Symbol);
+  void setFontPosture(Symbol);
+  void setGlyphSubstTable(const Vector<ConstPtr<GlyphSubstTable> > &);
+  void setPositionPointShift(const LengthSpec &);
+  void setLanguage(Letter2);
+  void setCountry(Letter2);
+  void setStartIndent(const LengthSpec &);
+  void setEndIndent(const LengthSpec &);
+  void setFirstLineStartIndent(const LengthSpec &);
+  void setLineSpacing(const LengthSpec &);
+  void setMinLeading(const OptLengthSpec &);
+  void setFieldWidth(const LengthSpec &);
+  void setLines(Symbol);
+  void setInputWhitespaceTreatment(Symbol);
+  void setExpandTabs(long);
+  void setQuadding(Symbol);
+  void setDisplayAlignment(Symbol);
+  void setFieldAlign(Symbol);
+  void setHyphenate(bool);
+  void setKern(bool);
+  void setHyphenationLadderCount(long);
+  void setWidowCount(long);
+  void setOrphanCount(long);
+  void setHeadingLevel(long);
+  void setColor(const DeviceRGBColor &);
+  void setBackgroundColor(const DeviceRGBColor &);
+  void setBackgroundColor();
+  void setLineThickness(Length);
+  void setLineRepeat(long);
+  void setScoreSpaces(bool);
+  void setBoxType(Symbol);
+  void setBorderPresent(bool);
+  void setBorderPriority(long);
+  void setBorderOmitAtBreak(bool);
+  void setPageWidth(long units);
+  void setPageHeight(long units);
+  void setLeftMargin(long units);
+  void setRightMargin(long units);
+  void setTopMargin(long units);
+  void setBottomMargin(long units);
+  void setHeaderMargin(long units);
+  void setFooterMargin(long units);
+  void setPageNumberRestart(bool);
+  void setPageNumberFormat(const StringC &);
+  void setPageNColumns(long);
+  void setPageColumnSep(Length);
+  void setPageBalanceColumns(bool);
+  void setSpan(long);
+  enum { nHF = FOTBuilder::nHF };
+  void startSimplePageSequenceSerial();
+  void endSimplePageSequenceSerial();
+  void startSimplePageSequenceHeaderFooter(unsigned);
+  void endSimplePageSequenceHeaderFooter(unsigned);
+  void endAllSimplePageSequenceHeaderFooter();
+  void pageNumber();
+  void startLink(const Address &);
+  void endLink();
+  void startScore(Symbol);
+  void startBox(const BoxNIC &);
+  void endBox();
+  void startParagraph(const ParagraphNIC &);
+  void endParagraph();
+  void startDisplayGroup(const DisplayGroupNIC &);
+  void endDisplayGroup();
+  void startLineField(const LineFieldNIC &);
+  void endLineField();
+  void startLeader(const LeaderNIC &);
+  void endLeader();
+  void startTable(const TableNIC &);
+  void endTable();
+  void startTablePartSerial(const TablePartNIC &);
+  void endTablePartSerial();
+  void startTablePartHeader();
+  void endTablePartHeader();
+  void startTablePartFooter();
+  void endTablePartFooter();
+  void tableColumn(const TableColumnNIC &);
+  void startTableRow();
+  void endTableRow();
+  void startTableCell(const TableCellNIC &);
+  void endTableCell();
+  void tableBeforeRowBorder();
+  void tableAfterRowBorder();
+  void tableBeforeColumnBorder();
+  void tableAfterColumnBorder();
+  void tableCellBeforeRowBorder();
+  void tableCellAfterRowBorder();
+  void tableCellBeforeColumnBorder();
+  void tableCellAfterColumnBorder();
+  void setCellBeforeRowMargin(Length);
+  void setCellAfterRowMargin(Length);
+  void setCellBeforeColumnMargin(Length);
+  void setCellAfterColumnMargin(Length);
+  void setCellBackground(bool);
+  void setCellRowAlignment(Symbol);
+  // math
+  void startMathSequence();
+  void endMathSequence();
+  void startFractionSerial();
+  void endFractionSerial();
+  void startFractionNumerator();
+  void endFractionNumerator();
+  void startFractionDenominator();
+  void endFractionDenominator();
+  void startSubscript();
+  void endSubscript();
+  void startSuperscript();
+  void endSuperscript();
+  void startRadicalSerial();
+  void endRadicalSerial();
+  void startRadicalDegree();
+  void endRadicalDegree();
+  void startFenceSerial();
+  void endFenceSerial();
+  void startFenceOpen();
+  void endFenceOpen();
+  void startFenceClose();
+  void endFenceClose();
+  void startMathOperatorSerial();
+  void endMathOperatorSerial();
+  void startMathOperatorOperator();
+  void endMathOperatorOperator();
+  void startMathOperatorLowerLimit();
+  void endMathOperatorLowerLimit();
+  void startMathOperatorUpperLimit();
+  void endMathOperatorUpperLimit();
+  void startMarkSerial();
+  void endMarkSerial();
+  void startMarkOver();
+  void endMarkOver();
+  void startMarkUnder();
+  void endMarkUnder();
+  void startScriptSerial();
+  void endScriptSerial();
+  void startScriptPreSup();
+  void startScriptPreSub();
+  void startScriptPostSup();
+  void startScriptPostSub();
+  void startScriptMidSup();
+  void startScriptMidSub();
+  void startGrid(const GridNIC &);
+  void endGrid();
+  void startGridCell(const GridCellNIC &);
+  void endGridCell();
+  void setMathDisplayMode(Symbol);
+  void setGridPositionCellType(Symbol);
+  void setGridColumnAlignment(Symbol);
+  void setGridRowSep(Length);
+  void setGridColumnSep(Length);
+  void setSubscriptDepth(Length);
+  void setSuperscriptHeight(Length);
+  void setUnderMarkDepth(Length);
+  void setOverMarkHeight(Length);
+
+  void startNode(const NodePtr &, const StringC &);
+  void endNode();
+  void currentNodePageNumber(const NodePtr &);
+  struct WinCharset {
+    unsigned char charsetCode;
+    const char *fontSuffix;
+    Char mapping[128];
+  };
+  enum { jisCharset = 5, nWinCharsets = 7 };
+  static const WinCharset winCharsets[nWinCharsets];
+  struct SymbolFont {
+    const char *name;
+    Char mapping[256];
+  };
+  enum { nSymbolFonts = 3 };
+  static const SymbolFont symbolFonts[nSymbolFonts];
+  enum {
+    topBorder,
+    bottomBorder,
+    leftBorder,
+    rightBorder
+  };
+  struct Border {
+    Border() : priority(0), flags(0) { }
+    long priority;
+    enum {
+      isPresent = 01,
+      isDouble = 02,
+      omitAtBreak = 04
+    };
+    unsigned char flags;
+    unsigned char thickness;
+    unsigned short color;
+  };
+  enum BreakType {
+    breakNone,
+    breakPage,
+    breakColumn
+  };
+private:
+  OutputByteStream &os() { return *osp_; }
+  void start();
+  void end();
+  void atomic();
+  void syncCharFormat();
+  void setCharset(int);
+  void inlinePrepare();
+  void flushPendingElements();
+  void doStartLink(const Address &);
+  void flushFields() {
+    if (!suppressBookmarks_)
+      flushPendingElements();
+    if (havePendingLink_) {
+      havePendingLink_ = 0;
+      doStartLink(pendingLink_);
+    }
+  }
+  void startDisplay(const DisplayNIC &);
+  void endDisplay();
+  void newPar(bool allowSpaceBefore = 1);
+  bool includePicture(const ExternalGraphicNIC &);
+  bool embedObject(const ExternalGraphicNIC &);
+  bool systemIdNotation(const StringC &systemId, const char *, StringC &);
+  bool systemIdFilename(const StringC &systemId, StringC &filename);
+  int systemIdFilename1(const StringC &systemId, StringC &filename);
+  int makeColor(const DeviceRGBColor &);
+  void outputBookmarkName(unsigned long groveIndex, const Char *, size_t);
+  void outputBookmarkName(unsigned long groveIndex, unsigned long elementIndex);
+  static unsigned convertLanguage(unsigned language, unsigned country,
+                                 unsigned &langCharsets);
+  void idrefButton(unsigned long groveIndex, const Char *s, size_t n);
+  void outputTable();
+  void storeBorder(Border &);
+  void resolveBorder(Border &, Border &);
+  void resolveOutsideBorder(Border &, const Border &);
+  void outputTableBorder(const Border &);
+  void outputHeaderFooter(const char *suffix, unsigned flags);
+  long computeLengthSpec(const LengthSpec &);
+  void displaySizeChanged();
+  void symbolChar(int ff, unsigned code);
+  void initJIS();
+  void enterMathMode();
+  void exitMathMode();
+  static int points(Length n) {
+    if (n >= 0)
+      return (n + 10)/20;
+    else
+      return (n - 10)/20;
+  }
+
+  enum InlineState {
+    inlineFirst,               // never had an inline FO
+    inlineStart,               // must emit \par before next inline FO
+    inlineField,               // in a line field
+    inlineFieldEnd,             // in a line field with align=end
+    inlineMiddle,              // had some inline FOs
+    inlineTable                        // just after \row
+  };
+  InlineState inlineState_;
+  bool continuePar_;
+  enum UnderlineType {
+     noUnderline,
+     underlineSingle,
+     underlineDouble,
+     underlineWords
+   };
+  // What the RTF reader thinks the format is.
+  struct CommonFormat {
+    CommonFormat();
+    bool isBold;
+    bool isItalic;
+    bool isSmallCaps;
+    // UnderlineType
+    char underline;
+    bool isStrikethrough;
+    int fontFamily;
+    int fontSize;
+    int color;
+    int charBackgroundColor;
+    int positionPointShift;
+    unsigned language;
+    unsigned country;
+    bool kern;
+    bool charBorder;
+    int charBorderColor;
+    long charBorderThickness;
+    bool charBorderDouble;
+  };
+  struct OutputFormat : CommonFormat {
+    OutputFormat();
+    int charset;
+    unsigned lang; // the RTF language code
+    // bitmap of charsets that can be used for the lang
+    unsigned langCharsets;
+  };
+  enum {
+    widowControl = 01,
+    orphanControl = 02
+  };
+  struct ParaFormat {
+    ParaFormat();
+    int leftIndent;
+    int rightIndent;
+    int firstLineIndent;
+    int lineSpacing;
+    bool lineSpacingAtLeast;
+    char quadding;             // 'l', 'c', 'r', 'j'
+    Symbol lines;
+    char widowOrphanControl;
+    char headingLevel;
+  };
+  enum {
+    gridPosRowMajor,
+    gridPosColumnMajor,
+    gridPosExplicit
+  };
+  struct Format : ParaFormat, CommonFormat {
+    Format();
+    bool hyphenate;
+    int fieldWidth;
+    Symbol fieldAlign;
+    Symbol inputWhitespaceTreatment;
+    long expandTabs;
+    char displayAlignment;      // 'l', 'c', 'r'
+    long lineThickness;
+    bool lineDouble;
+    bool scoreSpaces;
+    bool boxHasBorder;
+    bool boxHasBackground;
+    int backgroundColor; // 0 for none
+    bool borderPresent;
+    bool borderOmitAtBreak;
+    bool cellBackground;
+    long borderPriority;
+    long cellTopMargin;
+    long cellBottomMargin;
+    long cellLeftMargin;
+    long cellRightMargin;
+    char cellVerticalAlignment;
+    char gridPosType;
+    char gridColumnAlignment;
+    bool mathInline;
+    bool mathPosture;
+    int superscriptHeight; // in points
+    int subscriptDepth; // in points
+    int overMarkHeight; // in points
+    int underMarkDepth; // in points
+    int gridRowSep; // in points
+    int gridColumnSep; // in points
+    bool span;
+    // These are needed for handling LengthSpecs
+    LengthSpec positionPointShiftSpec;
+    LengthSpec leftIndentSpec;
+    LengthSpec rightIndentSpec;
+    LengthSpec firstLineIndentSpec;
+    LengthSpec lineSpacingSpec;
+    LengthSpec fieldWidthSpec;
+  };
+  struct PageFormat {
+    PageFormat();
+    long pageWidth;
+    long pageHeight;
+    long leftMargin;
+    long rightMargin;
+    long headerMargin;
+    long footerMargin;
+    long topMargin;
+    long bottomMargin;
+    bool pageNumberRestart;
+    const char *pageNumberFormat;
+    long nColumns;
+    long columnSep;
+    bool balance;
+  };
+  // This is for a nested displayed flow object
+  struct DisplayInfo {
+    int spaceAfter;
+    bool keepWithNext;
+    bool saveKeep;
+    BreakType breakAfter;
+  };
+  OutputFormat outputFormat_;
+  Format specFormat_;
+  ParaFormat paraFormat_;
+  Vector<ParaFormat> paraStack_;
+  Vector<DisplayInfo> displayStack_;
+  Vector<Format> specFormatStack_;
+  Vector<NodePtr> pendingElements_;
+  Vector<unsigned> pendingElementLevels_;
+  unsigned nPendingElementsNonEmpty_;
+  bool suppressBookmarks_;
+  unsigned nodeLevel_;
+  Vector<size_t> displayBoxLevels_;
+  bool boxFirstPara_;      // not yet had a paragraph in the outermost displayed box
+  long boxLeftSep_;
+  long boxRightSep_;
+  long boxTopSep_;
+  long accumSpaceBox_;
+  HashTable<StringC,int> fontFamilyNameTable_;
+  struct FontFamilyCharsets {
+    FontFamilyCharsets();
+    int rtfFontNumber[nWinCharsets];
+  };
+  Vector<FontFamilyCharsets> fontFamilyCharsetsTable_;
+  int nextRtfFontNumber_;
+  int accumSpace_;
+  bool keepWithNext_;
+  bool hyphenateSuppressed_;
+  long maxConsecHyphens_;
+  OutputByteStream *osp_;
+  OutputByteStream *finalos_;
+  TmpOutputByteStream tempos_;
+  StrOutputByteStream cellos_;
+  long tableWidth_;
+  char tableAlignment_;
+  long tableDisplaySize_;
+  int tableLeftIndent_;
+  int tableRightIndent_;
+  long addLeftIndent_;
+  long addRightIndent_;
+  Border tableBorder_[4];
+  unsigned cellIndex_;
+  struct Cell {
+    Cell() : present(0), hasBackground(0), span(1), vspan(1), valign('t') { }
+    bool present;
+    bool hasBackground;
+    unsigned short backgroundColor;
+    char valign;
+    String<char> content;
+    unsigned span;
+    unsigned vspan;
+    Border border[4];
+  };
+  struct Column {
+    Column() : hasWidth(0) { }
+    bool hasWidth;
+    TableLengthSpec width;
+  };
+  Vector<Vector<Cell> > cells_;
+  bool inTableHeader_;
+  unsigned nHeaderRows_;
+  Vector<Column> columns_;
+  unsigned tableLevel_;
+  StrOutputByteStream fieldos_;
+  int fieldTabPos_;
+  long displaySize_;
+  bool hadSection_;
+  bool doBalance_;
+  unsigned spanDisplayLevels_;
+  unsigned currentCols_;
+  BreakType doBreak_;
+  bool keep_;
+  bool hadParInKeep_;
+  unsigned linkDepth_;
+  unsigned inSimplePageSequence_;
+  PageFormat pageFormat_;
+  Vector<PageFormat> pageFormatStack_;
+  OutputFormat saveOutputFormat_;
+  OutputFormat leaderSaveOutputFormat_;
+  Vector<unsigned> colorTable_;
+  Ptr<ExtendEntityManager> entityManager_;
+  Messenger *mgr_;
+  const CharsetInfo *systemCharset_;
+  bool followWhitespaceChar_;
+  unsigned currentColumn_;
+  ElementSet elementsRefed_;
+  // Leaders
+  unsigned leaderDepth_;
+  NullOutputByteStream nullos_;
+  OutputByteStream *preLeaderOsp_;
+  enum { CHAR_TABLE_CHAR_BITS = 16 };
+  enum { CHAR_TABLE_SYMBOL_FLAG = 1U << 31, CHAR_TABLE_DB_FLAG = 1U << 30 };
+  CharMap<Unsigned32> charTable_;
+  String<char> hfPart_[nHF];
+  StrOutputByteStream hfos_;
+  enum RTFVersion {
+    word95,
+    word97
+  };
+  RTFVersion rtfVersion_;
+  Address pendingLink_;
+  bool havePendingLink_;
+  // Charaction for separating arguments in an EQ field; must be ',' or ';'
+  char eqArgSep_;
+  unsigned mathLevel_;
+  enum MathSpecial {
+    mathNormal,
+    mathFence,
+    mathIntegral
+  };
+  MathSpecial mathSpecial_;
+  OutputFormat mathSaveOutputFormat_;
+  struct ReorderFlowObject;
+  friend struct ReorderFlowObject;
+  struct ReorderFlowObject : public Link {
+    OutputByteStream *saveOsp;
+    StrOutputByteStream buf;
+    OutputFormat saveOutputFormat;
+    Vector<String<char> > streams;
+  };
+  struct Grid;
+  friend struct Grid;
+  struct Grid : public Link {
+    OutputByteStream *saveOsp;
+    StrOutputByteStream buf;
+    OutputFormat saveOutputFormat;
+    size_t nRows;
+    size_t nColumns;
+    char posType;
+    String<char> *curCellPtr;
+    Vector<Vector<String<char> > > cells;
+  };
+  IList<ReorderFlowObject> reorderStack_;
+  IList<Grid> gridStack_;
+#ifdef WIN32
+  Vector<StringC> oleObject_;
+#endif
+  void startReorderFlowObject();
+  void endReorderFlowObjectPort();
+  void endReorderFlowObject();
+  friend struct OutputFormat;
+  friend struct Format;
+  friend struct CommonFormat;
+  friend struct ParaFormat;
+};
+
+inline
+long RtfFOTBuilder::computeLengthSpec(const LengthSpec &spec)
+{
+  if (spec.displaySizeFactor == 0.0)
+    return spec.length;
+  else {
+    double tem = displaySize_ * spec.displaySizeFactor;
+    return spec.length + long(tem >= 0.0 ? tem +.5 : tem - .5);
+  }
+}
+
+// Use a line-spacing of 12pt for the header and footer
+// and assume 2.5pt of it occur after the baseline.
+
+const int hfPreSpace = 190;
+const int hfPostSpace = 50;
+const char INSERTION_CHAR = '\0';
+const int SYMBOL_FONT_PAGE = 0xf000;
+const unsigned DEFAULT_LANG = 0x400;
+
+inline int halfPoints(long n)
+{
+  return n/10;
+}
+
+TmpOutputByteStream::TmpOutputByteStream()
+: head_(0), last_(0), nFullBlocks_(0)
+{
+}
+
+TmpOutputByteStream::~TmpOutputByteStream()
+{
+  while (head_) {
+    Block *tem = head_;
+    head_ = head_->next;
+    delete tem;
+  }
+}
+
+void TmpOutputByteStream::flushBuf(char ch)
+{
+  Block *tem = new Block;
+  char *p = tem->buf;
+  *p++ = ch;
+  ptr_ = p;
+  end_ = tem->buf + bufSize;
+  tem->next = 0;
+  if (last_) {
+    nFullBlocks_++;
+    last_->next = tem;
+  }
+  else
+    head_ = tem;
+  last_ = tem;
+}
+
+void TmpOutputByteStream::flush()
+{
+}
+
+
+FOTBuilder *makeRtfFOTBuilder(OutputByteStream *os,
+                             const Vector<StringC> &options,
+                             const Ptr<ExtendEntityManager> &entityManager,
+                             const CharsetInfo &systemCharset,
+                             Messenger *mgr,
+                             const FOTBuilder::Extension *&ext)
+{
+  static const FOTBuilder::Extension extensions[] = {
+    {
+      "UNREGISTERED::James Clark//Characteristic::page-number-format",
+      0,
+      (void (FOTBuilder::*)(const StringC &))&RtfFOTBuilder::setPageNumberFormat,
+      0,
+      0
+    },
+    {
+      "UNREGISTERED::James Clark//Characteristic::page-number-restart?",
+      (void (FOTBuilder::*)(bool))&RtfFOTBuilder::setPageNumberRestart,
+      0,
+      0
+    },
+    {
+      "UNREGISTERED::James Clark//Characteristic::page-n-columns",
+      0,
+      0,
+      (void (FOTBuilder::*)(long))&RtfFOTBuilder::setPageNColumns,
+      0
+    },
+    {
+      "UNREGISTERED::James Clark//Characteristic::page-column-sep",
+      0,
+      0,
+      0,
+      (void (FOTBuilder::*)(FOTBuilder::Length))&RtfFOTBuilder::setPageColumnSep,
+    },
+    {
+      "UNREGISTERED::James Clark//Characteristic::page-balance-columns?",
+      (void (FOTBuilder::*)(bool))&RtfFOTBuilder::setPageBalanceColumns,
+      0,
+      0
+    },
+    {
+      "UNREGISTERED::James Clark//Characteristic::subscript-depth",
+      0,
+      0,
+      0,
+      (void (FOTBuilder::*)(FOTBuilder::Length))&RtfFOTBuilder::setSubscriptDepth,
+    },
+    {
+      "UNREGISTERED::James Clark//Characteristic::over-mark-height",
+      0,
+      0,
+      0,
+      (void (FOTBuilder::*)(FOTBuilder::Length))&RtfFOTBuilder::setOverMarkHeight,
+    },
+    {
+      "UNREGISTERED::James Clark//Characteristic::under-mark-depth",
+      0,
+      0,
+      0,
+      (void (FOTBuilder::*)(FOTBuilder::Length))&RtfFOTBuilder::setUnderMarkDepth,
+    },
+    {
+      "UNREGISTERED::James Clark//Characteristic::superscript-height",
+      0,
+      0,
+      0,
+      (void (FOTBuilder::*)(FOTBuilder::Length))&RtfFOTBuilder::setSuperscriptHeight,
+    },
+    {
+      "UNREGISTERED::James Clark//Characteristic::grid-row-sep",
+      0,
+      0,
+      0,
+      (void (FOTBuilder::*)(FOTBuilder::Length))&RtfFOTBuilder::setGridRowSep,
+    },
+    {
+      "UNREGISTERED::James Clark//Characteristic::grid-column-sep",
+      0,
+      0,
+      0,
+      (void (FOTBuilder::*)(FOTBuilder::Length))&RtfFOTBuilder::setGridColumnSep,
+    },
+    {
+      "UNREGISTERED::James Clark//Characteristic::heading-level",
+      0,
+      0,
+      (void (FOTBuilder::*)(long))&RtfFOTBuilder::setHeadingLevel,
+      0
+    },
+    { 0, 0, 0}
+  };
+  ext = extensions;
+  return new RtfFOTBuilder(os, options, entityManager, systemCharset, mgr);
+}
+
+RtfFOTBuilder::RtfFOTBuilder(OutputByteStream *os,
+                            const Vector<StringC> &options,
+                            const Ptr<ExtendEntityManager> &entityManager,
+                            const CharsetInfo &systemCharset, Messenger *mgr)
+: finalos_(os),
+  entityManager_(entityManager),
+  systemCharset_(&systemCharset), mgr_(mgr),
+  inlineState_(inlineFirst),
+  continuePar_(0),
+  osp_(&tempos_),
+  accumSpace_(0),
+  keepWithNext_(0), hadSection_(0),
+  linkDepth_(0),
+  tableLevel_(0),
+  nodeLevel_(0),
+  nPendingElementsNonEmpty_(0),
+  suppressBookmarks_(0),
+  followWhitespaceChar_(0),
+  currentColumn_(0),
+  boxFirstPara_(0),
+  leaderDepth_(0),
+  fontFamilyCharsetsTable_(1 + nSymbolFonts),
+  nextRtfFontNumber_(1),
+  inTableHeader_(0),
+  nHeaderRows_(0),
+  displaySize_(72*10*17),
+  addLeftIndent_(0),
+  addRightIndent_(0),
+  inSimplePageSequence_(0),
+  doBalance_(0),
+  spanDisplayLevels_(0),
+  currentCols_(1),
+  hyphenateSuppressed_(0),
+  maxConsecHyphens_(0),
+  doBreak_(breakNone),
+  keep_(0),
+  hadParInKeep_(0),
+  charTable_(0),
+  rtfVersion_(word97),
+  havePendingLink_(0),
+  eqArgSep_(','),
+  mathLevel_(0),
+  mathSpecial_(mathNormal)
+{
+  specFormat_.fontSize = 20; // 10 points
+  specFormatStack_.push_back(specFormat_);
+  pageFormatStack_.push_back(pageFormat_);
+  StringC times;
+  for (const char *s = "Times New Roman"; *s; s++)
+    times += *s;
+  fontFamilyNameTable_.insert(times, 0);
+  fontFamilyCharsetsTable_[0].rtfFontNumber[0] = 0;
+  for (int i = 0; i < nWinCharsets; i++) {
+    for (int j = 0; j < 128; j++) {
+      Char c = winCharsets[i].mapping[j];
+      if (c) {
+       if (!charTable_[c])
+         charTable_.setChar(c, (j + 0x80) | (1 << (i + CHAR_TABLE_CHAR_BITS)));
+       else if ((charTable_[c] & ((1 << CHAR_TABLE_CHAR_BITS) - 1)) == (j + 0x80))
+         charTable_.setChar(c, charTable_[c] | (1 << (i + CHAR_TABLE_CHAR_BITS)));
+      }
+    }
+  }
+  for (int i = 0; i < nSymbolFonts; i++) {
+    for (int j = 0; j < 256; j++) {
+      Char c = symbolFonts[i].mapping[j];
+      if (c && !charTable_[c])
+       charTable_.setChar(c, j | (i << CHAR_TABLE_CHAR_BITS) | CHAR_TABLE_SYMBOL_FLAG);
+    }
+    StringC tem;
+    for (const char *s = symbolFonts[i].name; *s; s++)
+      tem += *s;
+    fontFamilyNameTable_.insert(tem, i + 1);
+  }
+  // We want characters like right arrow to come from the symbol font, not using
+  // charset 128.
+  initJIS();
+  for (size_t i = 0; i < options.size(); i++) {
+    if (options[i] == systemCharset.execToDesc("95"))
+      rtfVersion_ = word95;
+  }
+}
+
+void RtfFOTBuilder::initJIS()
+{
+  WideChar min, max;
+  UnivChar univ;
+  Owner<CharsetRegistry::Iter> jis(CharsetRegistry::makeIter(CharsetRegistry::JIS0208));
+  while (jis->next(min, max, univ)) {
+    do {
+      if (!charTable_[univ]) {
+       unsigned char c1 = min >> 8;
+       unsigned char c2 = min & 0x7f;
+       unsigned char out1;
+       if (c1 < 33)
+         out1 = 0;
+       else if (c1 < 95)
+         out1 = ((c1 + 1) >> 1) + 112;
+       else if (c1 < 127)
+         out1 = ((c1 + 1) >> 1) + 176;
+       else
+         out1 = 0;
+       if (out1) {
+         unsigned char out2;
+         if (c1 & 1) {
+           if (c2 < 33)
+             out2 = 0;
+           else if (c2 <= 95)
+             out2 = c2 + 31;
+           else if (c2 <= 126)
+             out2 = c2 + 32;
+           else
+             out2 = 0;
+         }
+         else {
+           if (33 <= c2 && c2 <= 126)
+             out2 = c2 + 126;
+           else
+             out2 = 0;
+         }
+         if (out2)
+           charTable_.setChar(univ, (out1 << 8) | out2 | (1 << (jisCharset + CHAR_TABLE_CHAR_BITS)) | CHAR_TABLE_DB_FLAG);
+       }
+      }
+      univ++;
+    } while (min++ != max);
+  }
+}
+
+inline
+void outputWord(OutputByteStream &os, unsigned long n)
+{
+  os << char((n >> 24) & 0xff)
+     << char((n >> 16) & 0xff)
+     << char((n >> 8) & 0xff)
+     << char(n & 0xff);
+}
+
+inline
+unsigned long readWord(const char *&s, size_t &n, TmpOutputByteStream::Iter &sbIter)
+{
+  unsigned long result = 0;
+  for (int i = 0; i < 4; i++, n--) {
+    if (n == 0) {
+      bool gotSome = sbIter.next(s, n);
+      ASSERT(gotSome);
+    }
+    result = (result << 8) | (unsigned char)*s++;
+  }
+  return result;
+}
+
+RtfFOTBuilder::~RtfFOTBuilder()
+{
+  if (doBalance_) {
+    os() << "\\sect\\sbknone\\par";
+    doBalance_ = 0;
+  }
+  os() << "}\n";
+  os().flush();
+  osp_ = finalos_;
+  os() << "{\\rtf1\\ansi\\deff0\n";
+  os() << "{\\fonttbl";
+  HashTableIter<StringC,int> iter(fontFamilyNameTable_);
+  for (;;) {
+    const StringC *key;
+    const int *ip;
+    if (!iter.next(key, ip))
+      break;
+    const int *charsets = fontFamilyCharsetsTable_[*ip].rtfFontNumber;
+    for (int i = 0; i < nWinCharsets; i++) {
+      if (charsets[i] >= 0) {
+       os() << "{\\f" << charsets[i] << "\\fnil\\fcharset" << int(winCharsets[i].charsetCode) << ' ';
+       for (size_t j = 0; j < key->size(); j++)
+         os() << (char)(*key)[j];
+       os() << winCharsets[i].fontSuffix;
+       os() << ";}\n";
+      }
+    }
+  }
+  os() << "}\n";
+  os() << "{\\colortbl;";
+  for (size_t i = 0; i < colorTable_.size(); i++) {
+    unsigned n = colorTable_[i];
+    os() << "\\red" << (n >> 16)
+         << "\\green" << ((n >> 8) & 0xff)
+        << "\\blue" << (n & 0xff)
+        << ';';
+  }
+  os() << "}{\\stylesheet";
+  for (int i = 1; i <= 9; i++)
+    os() << "{\\s" << i << " Heading " << i << ";}";
+  os() << "}\n";
+  if (maxConsecHyphens_ > 0)
+    os() << "\\hyphconsec" << maxConsecHyphens_;
+  os() << "\\deflang" << DEFAULT_LANG << "\\notabind\\facingp\\hyphauto1\\widowctrl\n";
+
+  TmpOutputByteStream::Iter sbIter(tempos_);
+  const char *s;
+  size_t n;
+  while (sbIter.next(s, n)) {
+    while (n > 0) {
+      const char *p = (char *)memchr(s, INSERTION_CHAR, n);
+      if (!p) {
+       os().sputn(s, n);
+       break;
+      }
+      os().sputn(s, p - s);
+      n -= (p - s);
+      s = p;
+      --n;
+      s++;
+      if (n == 0) {
+       bool gotSome = sbIter.next(s, n);
+       ASSERT(gotSome);
+      }
+      char kind = *s++;
+      n--;
+      switch (kind) {
+      case 'b':
+       {
+         unsigned long grovei = readWord(s, n, sbIter);
+         unsigned long ei = readWord(s, n, sbIter);
+         if (elementsRefed_.contains(grovei, ei)) {
+           os() << "{\\*\\bkmkstart ";
+           outputBookmarkName(grovei, ei);
+           os() << '}';
+           os() << "{\\*\\bkmkend ";
+           outputBookmarkName(grovei, ei);
+           os() << '}';
+         }     
+         break;
+       }
+#ifdef WIN32
+      case 'o':
+       {
+         unsigned long oi = readWord(s, n, sbIter);
+         StringC filename(oleObject_[oi]);
+         filename += 0;
+         StringC clsid(oleObject_[oi + 1]);
+         clsid += 0;
+         if (!outputObject(filename.data(), clsid.data(), os()))
+           mgr_->message(RtfMessages::cannotEmbedFilename,
+                         StringMessageArg(oleObject_[oi]),
+                         StringMessageArg(oleObject_[oi + 1]));
+         break;
+       }
+#endif /* WIN32 */
+      default:
+       CANNOT_HAPPEN();
+      }
+    }
+  }
+}
+
+void RtfFOTBuilder::syncCharFormat()
+{
+  bool changed = 0;
+  if (outputFormat_.isBold != specFormat_.isBold) {
+    os() << "\\b";
+    if (!specFormat_.isBold)
+      os() << '0';
+    outputFormat_.isBold = specFormat_.isBold;
+    changed = 1;
+  }
+  if (outputFormat_.isItalic != specFormat_.isItalic) {
+    os() << "\\i";
+    if (!specFormat_.isItalic)
+      os() << '0';
+    outputFormat_.isItalic = specFormat_.isItalic;
+    changed = 1;
+  }
+  if (outputFormat_.underline != specFormat_.underline) {
+    switch (specFormat_.underline) {
+    case noUnderline:
+      os() << "\\ul0";
+      break;
+    case underlineSingle:
+      os() << "\\ul";
+      break;
+    case underlineDouble:
+      os() << "\\uldb";
+      break;
+    case underlineWords:
+      os() << "\\ulw";
+      break;
+    }
+    outputFormat_.underline = specFormat_.underline;
+    changed = 1;
+  }
+  if (outputFormat_.isSmallCaps != specFormat_.isSmallCaps) {
+    os() << "\\scaps";
+    if (!specFormat_.isSmallCaps)
+      os() << '0';
+    outputFormat_.isSmallCaps = specFormat_.isSmallCaps;
+    changed = 1;
+  }
+  if (outputFormat_.isStrikethrough != specFormat_.isStrikethrough) {
+    os() << "\\strike";
+    if (!specFormat_.isStrikethrough)
+      os() << '0';
+    outputFormat_.isStrikethrough = specFormat_.isStrikethrough;
+    changed = 1;
+  }
+  if (outputFormat_.positionPointShift != specFormat_.positionPointShift) {
+    if (specFormat_.positionPointShift >= 0)
+      os() << "\\up" << specFormat_.positionPointShift;
+    else
+      os() << "\\dn" << -specFormat_.positionPointShift;
+    outputFormat_.positionPointShift = specFormat_.positionPointShift;
+    changed = 1;
+  }
+  if (outputFormat_.fontSize != specFormat_.fontSize) {
+    os() << "\\fs" << specFormat_.fontSize;
+    outputFormat_.fontSize = specFormat_.fontSize;
+    changed = 1;
+  }
+  if (outputFormat_.country != specFormat_.country
+      || outputFormat_.language != specFormat_.language) {
+    outputFormat_.country = specFormat_.country;
+    outputFormat_.language = specFormat_.language;
+    unsigned lang = convertLanguage(outputFormat_.language, outputFormat_.country,
+                                   outputFormat_.langCharsets);
+    if (lang != outputFormat_.lang) {
+      outputFormat_.lang = lang;
+      os() << "\\lang" << lang;
+      changed = 1;
+    }
+  }
+  bool charsetOk = ((1 << outputFormat_.charset) & outputFormat_.langCharsets);
+  if (outputFormat_.fontFamily != specFormat_.fontFamily || !charsetOk) {
+    outputFormat_.fontFamily = specFormat_.fontFamily;
+    // Make sure the charset is compatible with the language
+    if (!charsetOk) {
+      for (outputFormat_.charset = 0;
+           !(outputFormat_.langCharsets & (1 << outputFormat_.charset));
+          outputFormat_.charset++)
+       ;
+    }
+    int &n = fontFamilyCharsetsTable_[outputFormat_.fontFamily].rtfFontNumber[outputFormat_.charset];
+    if (n < 0)
+      n = nextRtfFontNumber_++;
+    os() << "\\f" << n;
+    changed = 1;
+  }
+  if (outputFormat_.color != specFormat_.color) {
+    os() << "\\cf" << specFormat_.color;
+    outputFormat_.color = specFormat_.color;
+    changed = 1;
+  }
+  if (outputFormat_.charBackgroundColor != specFormat_.charBackgroundColor) {
+    os() << "\\highlight" << specFormat_.charBackgroundColor;
+    outputFormat_.charBackgroundColor = specFormat_.charBackgroundColor;
+    changed = 1;
+  }
+  if (specFormat_.charBorder) {
+    if (!outputFormat_.charBorder
+        || specFormat_.charBorderColor != outputFormat_.charBorderColor
+       || specFormat_.charBorderThickness != outputFormat_.charBorderThickness
+       || specFormat_.charBorderDouble != outputFormat_.charBorderDouble) {
+      outputFormat_.charBorder = 1;
+      os() << "\\chbrdr";
+      if (specFormat_.charBorderDouble)
+       os() << "\\brdrdb";
+      else
+       os() << "\\brdrs";
+      os() << "\\brdrw" << specFormat_.charBorderThickness;
+      if (specFormat_.charBorderColor)
+       os() << "\\brdrcf" << specFormat_.charBorderColor;
+      changed = 1;
+      outputFormat_.charBorderColor = specFormat_.charBorderColor;
+      outputFormat_.charBorderThickness = specFormat_.charBorderThickness;
+      outputFormat_.charBorderDouble = specFormat_.charBorderDouble;
+    }
+  }
+  else {
+    if (outputFormat_.charBorder) {
+      os() << "\\chbrdr";
+      changed = 1;
+      outputFormat_.charBorder = 0;
+    }
+  }
+  if (!specFormat_.hyphenate)
+    hyphenateSuppressed_ = 1;
+  if (outputFormat_.kern != specFormat_.kern) {
+    os() << "\\kerning" << (specFormat_.kern ? '1' : '0');
+    outputFormat_.kern = specFormat_.kern;
+    changed = 1;
+  }
+  if (changed)
+    os() << ' ';
+}
+
+void RtfFOTBuilder::setCharset(int cs)
+{
+  outputFormat_.charset = cs;
+  int &n = fontFamilyCharsetsTable_[outputFormat_.fontFamily].rtfFontNumber[cs];
+  if (n < 0)
+    n = nextRtfFontNumber_++;
+  os() << "\\f" << n;
+}
+
+inline
+void hexChar(OutputByteStream &os, unsigned code)
+{
+  static const char hex[] = "0123456789abcdef";
+  os << "\\'" << hex[(code >> 4) & 0xf] << hex[code & 0xf];
+}
+
+void RtfFOTBuilder::symbolChar(int ff, unsigned code)
+{
+#if 0
+  os() << "{\\field{\\*\\fldinst SYMBOL " << (unsigned long)code
+       << " \\\\f \"" << symbolFonts[ff - 1].name << "\"}{\\fldrslt ";
+#endif
+  int &n = fontFamilyCharsetsTable_[ff].rtfFontNumber[nWinCharsets - 1];
+  if (n < 0)
+    n = nextRtfFontNumber_++;
+  os() << "{\\f" << n;
+  hexChar(os(), code);
+  os() << "}";
+#if 0
+  os() << "}}";
+#endif
+}
+
+void RtfFOTBuilder::characters(const Char *s, size_t n)
+{
+  // Ignore record ends at the start of continuation paragraphs.
+  if (continuePar_
+      && (inlineState_ == inlineStart || inlineState_ == inlineFirst)
+      && paraFormat_.lines == symbolWrap) {
+    for (; n > 0 && *s == '\r'; s++, n--)
+      ;
+    if (n == 0)
+      return;
+  }
+  // This avoids clearing followWhitespaceChar_.
+  if (inlineState_ != inlineMiddle)
+    inlinePrepare();
+  else
+    flushFields();
+  syncCharFormat();
+  if (mathLevel_ && mathSpecial_ == mathIntegral && n > 0) {
+    switch (*s) {
+    case 0x222b: // integral
+      return;
+    case 0x2211: // sum
+      os() << "\\\\su";
+      return;
+    case 0x220f: // product
+      os() << "\\\\pr";
+      return;
+    default:
+      os() << "\\\\vc\\\\";
+      break;
+    }
+  }
+  for (; n > 0; s++, n--) {
+    bool prevWhitespaceChar = followWhitespaceChar_;
+    followWhitespaceChar_ = 0;
+    currentColumn_++;
+    switch (*s) {
+    case '\n':
+      currentColumn_--;
+      followWhitespaceChar_ = prevWhitespaceChar;
+      break;
+    case '\r':
+      followWhitespaceChar_ = 1;
+      switch (paraFormat_.lines) {
+      case symbolNone:
+       // FIXME
+      case symbolWrap:
+       switch (specFormat_.inputWhitespaceTreatment) {
+       case symbolIgnore:
+         currentColumn_--;
+         break;
+       case symbolCollapse:
+         if (prevWhitespaceChar) {
+           currentColumn_--;
+           break;
+         }
+         // fall through
+       default:
+         os() << ' ';
+       }
+       break;
+      default:
+       os() << "\\sa0\\par\\fi0\\sb0\n";
+       currentColumn_ = 0;
+       break;
+      }
+      break;
+    case '\t':
+      if (specFormat_.expandTabs && specFormat_.inputWhitespaceTreatment == symbolPreserve) {
+       unsigned col = --currentColumn_ + specFormat_.expandTabs;
+       col = (col / specFormat_.expandTabs) * specFormat_.expandTabs;
+       for (; currentColumn_ < col; currentColumn_++)
+         os() << ' ';
+       followWhitespaceChar_ = 1;
+       break;
+      }
+      // fall through
+    case ' ':
+      followWhitespaceChar_ = 1;
+      switch (specFormat_.inputWhitespaceTreatment) {
+      case symbolIgnore:
+       currentColumn_--;
+       break;
+      case symbolCollapse:
+       if (prevWhitespaceChar) {
+         currentColumn_--;
+         break;
+       }
+       // fall through
+      default:
+       os() << ' ';
+      }
+      break;
+    case 0x2002:
+      os() << "\\u8194\\'20";
+      break;
+    case 0x2003:
+      os() << "\\u8195\\'20";
+      break;
+    case 0x2010:
+      os() << '-';
+      break;
+    case 0x2011:
+      os() << "\\_";
+      break;
+    case 0x200c:
+      os() << "\\zwnj ";
+      break;
+    case 0x200d:
+      os() << "\\zwj ";
+      break;
+    case 0xa0:
+      os() << "\\~";
+      break;
+    case 0xad:
+      os() << "\\-";
+      break;
+    case '\0':
+      break;
+    case ';':
+    case ',':
+      if (mathLevel_ && *s == eqArgSep_ && mathSpecial_ == mathNormal)
+       os() << "\\\\";
+      os() << char(*s);
+      break;
+    case '(':
+    case ')':
+      if (mathLevel_ && mathSpecial_ == mathNormal)
+       os() << "\\\\";
+      os() << char(*s);
+      break;
+    case '\\':
+      if (outputFormat_.charset == jisCharset)
+       setCharset(0);
+      if (mathLevel_ && mathSpecial_ == mathNormal) {
+       // quote once to get through RTF
+       // quote again to get through field
+       // quote again to get through C++
+       os() << "\\\\\\\\";
+       break;
+      }
+      // fall through
+    case '{':
+    case '}':
+      os() << '\\' << char(*s);
+      break;
+    case '|':
+    case '~':
+      if (outputFormat_.charset == jisCharset)
+       setCharset(0);
+      // fall through
+    default:
+      if (*s < 0x80) {
+       if (specFormat_.mathPosture
+           && (('a' <= *s && *s <= 'z')
+               || ('A' <= *s && *s <= 'Z')))
+         os() << "{\\i " << char(*s) << '}';
+       else
+         os() << char(*s);
+      }
+      else {
+       unsigned long code = charTable_[*s];
+       if (code & CHAR_TABLE_SYMBOL_FLAG)
+         symbolChar(((code & ~CHAR_TABLE_SYMBOL_FLAG) >> CHAR_TABLE_CHAR_BITS) + 1,
+                    code & 0xff);
+        else if (code) {
+         if (!(code & (1 << (outputFormat_.charset + CHAR_TABLE_CHAR_BITS)))) {
+           // If possible, choose a charset compatible with the language
+           if (code & (outputFormat_.langCharsets << CHAR_TABLE_CHAR_BITS))
+             code &= ((outputFormat_.langCharsets << CHAR_TABLE_CHAR_BITS) | ((1 << CHAR_TABLE_CHAR_BITS) - 1));
+           int i = 0;
+           for (unsigned mask = 1 << CHAR_TABLE_CHAR_BITS; !(code & mask); mask <<= 1, i++)
+             ;
+           setCharset(i);
+         }
+         if (code & CHAR_TABLE_DB_FLAG) {
+           os() << "{\\dbch\\uc2\\u" << int(short(*s));
+           hexChar(os(), (code >> 8) & 0xff);
+           hexChar(os(), code & 0xff);
+           os() << "}";
+         }
+         else 
+           hexChar(os(), code & 0xff);
+       }
+       else {
+         if (*s >= SYMBOL_FONT_PAGE + 0x20 && *s <= SYMBOL_FONT_PAGE + 0xff)
+           symbolChar(outputFormat_.fontFamily, *s & 0xff);
+         else {
+           os() << "\\u" << int(short(*s));
+           hexChar(os(), '?');
+         }
+       }
+      }
+      break;
+    }
+  }
+}
+
+void RtfFOTBuilder::setFontSize(long n)
+{
+  specFormat_.fontSize = halfPoints(n);
+}
+
+void RtfFOTBuilder::setFontFamilyName(const StringC &name)
+{
+  const int *p = fontFamilyNameTable_.lookup(name);
+  if (!p) {
+    specFormat_.fontFamily = fontFamilyCharsetsTable_.size();
+    fontFamilyNameTable_.insert(name, specFormat_.fontFamily);
+    fontFamilyCharsetsTable_.resize(fontFamilyCharsetsTable_.size() + 1);
+  }
+  else
+    specFormat_.fontFamily = *p;
+}
+
+void RtfFOTBuilder::setFontWeight(Symbol weight)
+{
+  specFormat_.isBold = (weight > symbolMedium);
+}
+
+void RtfFOTBuilder::setFontPosture(Symbol posture)
+{
+  switch (posture) {
+  case symbolOblique:
+  case symbolItalic:
+    specFormat_.isItalic = 1;
+    specFormat_.mathPosture = 0;
+    break;
+  case symbolMath:
+    specFormat_.isItalic = 0;
+    specFormat_.mathPosture = 1;
+    break;
+  default:
+    specFormat_.isItalic = 0;
+    specFormat_.mathPosture = 0;
+    break;
+  }
+}
+
+void RtfFOTBuilder::setGlyphSubstTable(const Vector<ConstPtr<GlyphSubstTable> > &tables)
+{
+  static const int smallCapAfiiSignature = 0375;
+  specFormat_.isSmallCaps = 0;
+  for (size_t i = 0; i < tables.size(); i++) {
+    const Vector<GlyphId> &pairs = tables[i]->pairs;
+    for (size_t j = 0; j < pairs.size(); j += 2) {
+      if (pairs[j].suffix + (smallCapAfiiSignature << 8) == pairs[j + 1].suffix
+         && pairs[j].suffix >= 'a'
+         && pairs[j].suffix <= 'z'
+         && pairs[j].publicId == pairs[j + 1].publicId
+         && strcmp(pairs[j].publicId, "ISO/IEC 10036/RA//Glyphs") == 0) {
+       specFormat_.isSmallCaps = 1;
+       break;
+      }
+    }
+  }
+}
+
+void RtfFOTBuilder::setHyphenate(bool b)
+{
+  specFormat_.hyphenate = b;
+}
+
+void RtfFOTBuilder::setKern(bool b)
+{
+  specFormat_.kern = b;
+}
+
+void RtfFOTBuilder::setHyphenationLadderCount(long n)
+{
+  if (n > 0 && (maxConsecHyphens_ == 0 || n < maxConsecHyphens_))
+    maxConsecHyphens_ = n;
+}
+
+void RtfFOTBuilder::setWidowCount(long n)
+{
+  if (n > 1)
+    specFormat_.widowOrphanControl |= widowControl;
+  else
+    specFormat_.widowOrphanControl &= orphanControl;
+}
+
+void RtfFOTBuilder::setOrphanCount(long n)
+{
+  if (n > 1)
+    specFormat_.widowOrphanControl |= orphanControl;
+  else
+    specFormat_.widowOrphanControl &= widowControl;
+}
+
+void RtfFOTBuilder::setHeadingLevel(long n)
+{
+  specFormat_.headingLevel = (n >= 1 && n <= 9) ? char(n) : 0;
+}
+
+void RtfFOTBuilder::setColor(const DeviceRGBColor &color)
+{
+  specFormat_.color = makeColor(color);
+}
+
+void RtfFOTBuilder::setBackgroundColor(const DeviceRGBColor &color)
+{
+  specFormat_.backgroundColor = makeColor(color);
+}
+
+void RtfFOTBuilder::setBackgroundColor()
+{
+  specFormat_.backgroundColor = 0;
+}
+
+int RtfFOTBuilder::makeColor(const DeviceRGBColor &color)
+{
+  unsigned n = (color.red << 16) | (color.green << 8) | color.blue;
+  for (int i = 0; i < colorTable_.size(); i++)
+    if (colorTable_[i] == n)
+      return i + 1;
+  colorTable_.push_back(n);
+  return colorTable_.size();
+}
+
+void RtfFOTBuilder::setBoxType(Symbol sym)
+{
+  switch (sym) {
+  case symbolBorder:
+    specFormat_.boxHasBorder = 1;
+    specFormat_.boxHasBackground = 0;
+    break;
+  case symbolBackground:
+    specFormat_.boxHasBorder = 0;
+    specFormat_.boxHasBackground = 1;
+    break;
+  case symbolBoth:
+    specFormat_.boxHasBorder = 1;
+    specFormat_.boxHasBackground = 1;
+    break;
+  default:
+    break;
+  }
+}
+
+void RtfFOTBuilder::setLineThickness(Length len)
+{
+  specFormat_.lineThickness = (len > 150 ? 150 : len);
+}
+
+void RtfFOTBuilder::setLineRepeat(long n)
+{
+  specFormat_.lineDouble = (n > 1);
+}
+
+void RtfFOTBuilder::setScoreSpaces(bool b)
+{
+  specFormat_.scoreSpaces = b;
+}
+
+void RtfFOTBuilder::setBorderPresent(bool b)
+{
+  specFormat_.borderPresent = b;
+}
+
+void RtfFOTBuilder::setBorderPriority(long n)
+{
+  specFormat_.borderPriority = n;
+}
+
+void RtfFOTBuilder::setBorderOmitAtBreak(bool b)
+{
+  specFormat_.borderOmitAtBreak = b;
+}
+
+void RtfFOTBuilder::newPar(bool allowSpaceBefore)
+{
+  long boxExtraTopSep = 0;
+  if (boxFirstPara_) {
+    boxFirstPara_ = 0;
+    boxLeftSep_ = paraFormat_.leftIndent;
+    boxRightSep_ = paraFormat_.rightIndent;
+    for (size_t i = 1; i < displayBoxLevels_.size(); i++) {
+      boxLeftSep_ += specFormatStack_[displayBoxLevels_[i]].leftIndent;
+      boxRightSep_ += specFormatStack_[displayBoxLevels_[i]].rightIndent;
+    }
+    // RTF doesn't include space before or after a paragraph inside
+    // the box.
+    boxTopSep_ = accumSpace_;
+    accumSpace_ = accumSpaceBox_;
+    accumSpaceBox_ = 0;
+  }
+  if (inlineState_ != inlineFirst) {
+    if (!allowSpaceBefore) {
+      os() << "\\sa" << accumSpace_;
+      accumSpace_ = 0;
+    }
+    if (keep_) {
+      if (hadParInKeep_ || continuePar_)
+       keepWithNext_ = 1;
+      hadParInKeep_ = 1;
+    }
+    if (!doBreak_ && keepWithNext_)
+      os() << "\\keepn";
+    keepWithNext_ = 0;
+    if (hyphenateSuppressed_) {
+      os() << "\\hyphpar0";
+      hyphenateSuppressed_ = 0;
+    }
+    os() << "\\par";
+  }
+  switch (doBreak_) {
+  case breakPage:
+    os() << "\\page";
+    doBreak_ = breakNone;
+    break;
+  case breakColumn:
+    os() << "\\column";
+    doBreak_ = breakNone;
+    break;
+  default:
+    break;
+  }
+  if (currentCols_ > 1) {
+    if (spanDisplayLevels_) {
+      os() << "\\sect\\sbknone\\cols1";
+      currentCols_ = 1;
+    }
+  }
+  else if (spanDisplayLevels_ == 0 && currentCols_ == 1 && pageFormat_.nColumns > 1) {
+    if (inlineState_ != inlineFirst)
+      os() << "\\sect\\sbknone";
+    os() << "\\cols" << pageFormat_.nColumns << "\\colsx" << pageFormat_.columnSep;
+    currentCols_ = pageFormat_.nColumns;
+  }
+  os() << "\\pard";
+  if (tableLevel_)
+    os() << "\\intbl";
+  if (accumSpace_) {
+    os() << "\\sb" << accumSpace_;
+    accumSpace_ = 0;
+  }
+  if (keep_)
+    os() << "\\keep";
+  if (!paraFormat_.widowOrphanControl)
+    os() << "\\nowidctlpar";
+  if (paraFormat_.headingLevel)
+    os() << "\\s" << int(paraFormat_.headingLevel);
+  if (displayBoxLevels_.size() > 0) {
+    const Format &boxFormat = specFormatStack_[displayBoxLevels_[0]];
+    for (const char *s = "tlbr"; *s; s++) {
+      os() << "\\brdr" << *s;
+      if (boxFormat.lineThickness > 75)
+       os() << "\\brdrth\\brdrw" << boxFormat.lineThickness/2;
+      else {
+       if (boxFormat.lineDouble)
+         os() << "\\brdrdb";
+       else
+         os() << "\\brdrs";
+       os() << "\\brdrw" << boxFormat.lineThickness;
+      }
+      long sep;
+      switch (*s) {
+      case 't':
+       sep = boxTopSep_;
+       break;
+      case 'l':
+       sep = boxLeftSep_;
+       break;
+      case 'r':
+       sep = boxRightSep_;
+       break;
+      default:
+       sep = 0;
+       break;
+      }
+      os() << "\\brsp" << sep;
+      if (boxFormat.color)
+       os() << "\\brdrcf" << boxFormat.color;
+      if (boxLeftSep_ + boxFormat.leftIndent + addLeftIndent_)
+       os() << "\\li" << boxLeftSep_ + boxFormat.leftIndent + addLeftIndent_;
+      if (boxRightSep_ + boxFormat.rightIndent + addRightIndent_)
+       os() << "\\ri" << boxRightSep_ + boxFormat.rightIndent + addRightIndent_;
+    }
+  }
+  else {
+    if (paraFormat_.leftIndent || addLeftIndent_)
+      os() << "\\li" << paraFormat_.leftIndent + addLeftIndent_;
+    if (paraFormat_.rightIndent || addRightIndent_)
+      os() << "\\ri" << paraFormat_.rightIndent + addRightIndent_;
+  }
+}
+
+// This must be called before any inline flow object.
+
+void RtfFOTBuilder::inlinePrepare()
+{
+  followWhitespaceChar_ = 0;
+  if (inlineState_ == inlineMiddle
+      || inlineState_ == inlineField
+      || inlineState_ == inlineFieldEnd) {
+    flushFields();
+    return;
+  }
+  newPar();
+  os() << "\\sl" << (paraFormat_.lineSpacingAtLeast ? paraFormat_.lineSpacing : - paraFormat_.lineSpacing);
+  int fli = continuePar_ ? 0 : paraFormat_.firstLineIndent;
+  if (fli)
+    os() << "\\fi" << fli;
+  if (paraFormat_.quadding != 'l')
+    os() << "\\q" << paraFormat_.quadding;
+  inlineState_ = inlineMiddle;
+  os() << ' ';
+  flushFields();
+}
+
+void RtfFOTBuilder::setPositionPointShift(const LengthSpec &val)
+{
+  specFormat_.positionPointShiftSpec = val;
+  specFormat_.positionPointShift = halfPoints(computeLengthSpec(val));
+}
+
+void RtfFOTBuilder::setStartIndent(const LengthSpec &val)
+{
+  specFormat_.leftIndentSpec = val;
+  specFormat_.leftIndent = computeLengthSpec(val);
+}
+
+void RtfFOTBuilder::setLanguage(Letter2 code)
+{
+  specFormat_.language = code;
+}
+
+void RtfFOTBuilder::setCountry(Letter2 code)
+{
+  specFormat_.country = code;
+}
+void RtfFOTBuilder::setEndIndent(const LengthSpec &val)
+{
+  specFormat_.rightIndentSpec = val;
+  specFormat_.rightIndent = computeLengthSpec(val);
+}
+
+void RtfFOTBuilder::setFirstLineStartIndent(const LengthSpec &val)
+{
+  specFormat_.firstLineIndentSpec = val;
+  specFormat_.firstLineIndent = computeLengthSpec(val);
+}
+
+void RtfFOTBuilder::setLineSpacing(const LengthSpec &val)
+{
+  specFormat_.lineSpacingSpec = val;
+  specFormat_.lineSpacing = computeLengthSpec(val);
+}
+
+void RtfFOTBuilder::setMinLeading(const OptLengthSpec &ols)
+{
+  specFormat_.lineSpacingAtLeast = ols.hasLength;
+}
+
+void RtfFOTBuilder::setFieldWidth(const LengthSpec &val)
+{
+  specFormat_.fieldWidthSpec = val;
+  specFormat_.fieldWidth = computeLengthSpec(val);
+}
+
+void RtfFOTBuilder::displaySizeChanged()
+{
+  specFormat_.positionPointShift = computeLengthSpec(specFormat_.positionPointShiftSpec);
+  specFormat_.leftIndent = computeLengthSpec(specFormat_.leftIndentSpec);
+  specFormat_.rightIndent = computeLengthSpec(specFormat_.rightIndentSpec);
+  specFormat_.firstLineIndent = computeLengthSpec(specFormat_.firstLineIndentSpec);
+  specFormat_.lineSpacing = computeLengthSpec(specFormat_.lineSpacingSpec);
+  specFormat_.fieldWidth = computeLengthSpec(specFormat_.fieldWidthSpec);
+}
+
+void RtfFOTBuilder::setQuadding(Symbol quadding)
+{
+  switch (quadding) {
+  case symbolStart:
+  default:
+    specFormat_.quadding = 'l';
+    break;
+  case symbolEnd:
+    specFormat_.quadding = 'r';
+    break;
+  case symbolCenter:
+    specFormat_.quadding = 'c';
+    break;
+  case symbolJustify:
+    specFormat_.quadding = 'j';
+    break;
+  }
+}
+
+void RtfFOTBuilder::setDisplayAlignment(Symbol displayAlignment)
+{
+  switch (displayAlignment) {
+  case symbolStart:
+    specFormat_.displayAlignment = 'l';
+    break;
+  case symbolEnd:
+    specFormat_.displayAlignment = 'r';
+    break;
+  case symbolCenter:
+    specFormat_.displayAlignment = 'c';
+    break;
+  case symbolInside:
+  case symbolOutside:
+  default:
+    specFormat_.displayAlignment = 'l';
+    break;
+  }
+}
+
+void RtfFOTBuilder::setFieldAlign(Symbol fieldAlign)
+{
+  specFormat_.fieldAlign = fieldAlign;
+}
+
+void RtfFOTBuilder::setLines(Symbol lines)
+{
+  specFormat_.lines = lines;
+}
+
+void RtfFOTBuilder::setInputWhitespaceTreatment(Symbol sym)
+{
+  specFormat_.inputWhitespaceTreatment = sym;
+}
+
+void RtfFOTBuilder::setExpandTabs(long n)
+{
+  specFormat_.expandTabs = n;
+}
+
+void RtfFOTBuilder::startParagraph(const ParagraphNIC &nic)
+{
+  startDisplay(nic);
+  start();
+  paraStack_.resize(paraStack_.size() + 1);
+  paraStack_.back() = paraFormat_;
+  paraFormat_ = specFormat_;
+}
+
+void RtfFOTBuilder::endParagraph()
+{
+  paraFormat_ = paraStack_.back();
+  paraStack_.resize(paraStack_.size() - 1);
+  endDisplayGroup();
+}
+
+void RtfFOTBuilder::paragraphBreak(const ParagraphNIC &nic)
+{
+  if (paraStack_.size() > 0) {
+    endDisplay();
+    startDisplay(nic);
+    paraFormat_ = specFormat_;
+  }
+  atomic();
+}
+
+void RtfFOTBuilder::startBox(const BoxNIC &nic)
+{
+  if (nic.isDisplay) {
+    startDisplay(nic);
+    if (displayBoxLevels_.size() == 0) {
+      accumSpaceBox_ = accumSpace_;
+      accumSpace_ = 0;
+      boxFirstPara_ = 1;
+    }
+    displayBoxLevels_.push_back(specFormatStack_.size());
+  }
+  else {
+    if (specFormat_.boxHasBackground && specFormat_.backgroundColor)
+      specFormat_.charBackgroundColor = specFormat_.backgroundColor;
+    if (specFormat_.boxHasBorder && !specFormat_.charBorder) {
+      specFormat_.charBorder = 1;
+      specFormat_.charBorderColor = specFormat_.color;
+      specFormat_.charBorderThickness = specFormat_.lineThickness;
+      specFormat_.charBorderDouble = specFormat_.lineDouble;
+    }
+    inlinePrepare();
+  }
+  start();
+}
+
+void RtfFOTBuilder::endBox()
+{
+  if (displayBoxLevels_.size() > 0
+      && displayBoxLevels_.back() + 1 == specFormatStack_.size()) {
+    // We're ending a displayed box.
+    if (displayBoxLevels_.size() == 1) {
+      // It was the outermost box.
+      if (boxFirstPara_) {
+       boxFirstPara_ = 0;
+       boxLeftSep_ = boxRightSep_ = boxTopSep_ = 0;
+       long boxHeight = accumSpace_;
+       if (boxHeight <= 0)
+         boxHeight = 1;
+       accumSpace_ = accumSpaceBox_;
+       newPar(1);
+       os() << "\\sl-" << boxHeight;
+      }
+      else if (accumSpace_) {
+       long extra = accumSpace_;
+       accumSpace_ = 0;
+       keepWithNext_ = 1;
+       newPar(1);
+       os() << "\\sl-" << extra;
+      }
+      else
+       accumSpace_ = 0;
+      // This prevents an adjacent box being merged by RTF.
+      displayBoxLevels_.resize(displayBoxLevels_.size() - 1);
+      os() << "\\keepn\\par\\pard\\sl-1";
+      if (tableLevel_)
+       os() << "\\intbl";
+    }
+    end();
+    endDisplay();
+  }
+  else
+    end();
+}
+
+void RtfFOTBuilder::startDisplayGroup(const DisplayGroupNIC &nic)
+{
+  startDisplay(nic);
+  start();
+}
+
+void RtfFOTBuilder::startDisplay(const DisplayNIC &nic)
+{
+  if (spanDisplayLevels_)
+    spanDisplayLevels_++;
+  else if (specFormat_.span && pageFormat_.nColumns > 1 && tableLevel_ == 0) {
+    spanDisplayLevels_ = 1;
+    displaySize_ = pageFormat_.pageWidth - pageFormat_.leftMargin - pageFormat_.rightMargin;
+    displaySizeChanged();
+  }
+  long spaceBefore = computeLengthSpec(nic.spaceBefore.nominal);
+  if (spaceBefore > accumSpace_)
+    accumSpace_ = spaceBefore;
+  if (nic.keepWithPrevious)
+    keepWithNext_ = 1;
+  if (inlineState_ != inlineFirst && inlineState_ != inlineTable)
+    inlineState_ = inlineStart;
+  continuePar_ = 0;
+  switch (nic.breakBefore) {
+  case symbolPage:
+  case symbolPageRegion:
+  case symbolColumnSet:
+    doBreak_ = breakPage;
+    break;
+  case symbolColumn:
+    if (doBreak_ != breakPage)
+      doBreak_ = breakColumn;
+    break;
+  default:
+    break;
+  }
+  displayStack_.resize(displayStack_.size() + 1);
+  long spaceAfter = computeLengthSpec(nic.spaceAfter.nominal);
+  displayStack_.back().spaceAfter = spaceAfter;
+  displayStack_.back().keepWithNext = nic.keepWithNext;
+  displayStack_.back().saveKeep = keep_;
+  switch (nic.keep) {
+  case symbolTrue:
+  case symbolPage:
+  case symbolColumnSet:
+  case symbolColumn:
+    if (!keep_) {
+      hadParInKeep_ = 0;
+      keep_ = 1;
+    }
+    break;
+  default:
+    break;
+  }
+  switch (nic.breakAfter) {
+  case symbolPage:
+  case symbolPageRegion:
+  case symbolColumnSet:
+    displayStack_.back().breakAfter = breakPage;
+    break;
+  case symbolColumn:
+    displayStack_.back().breakAfter = breakColumn;
+    break;
+  default:
+    displayStack_.back().breakAfter = breakNone;
+    break;
+  }
+}
+
+void RtfFOTBuilder::endDisplayGroup()
+{
+  end();
+  endDisplay();
+}
+
+void RtfFOTBuilder::endDisplay()
+{
+  doBreak_ = displayStack_.back().breakAfter;
+  keep_ = displayStack_.back().saveKeep;
+  if (inlineState_ != inlineTable) {
+    if (inlineState_ != inlineFirst)
+      inlineState_ = inlineStart;
+    continuePar_ = 1;
+  }
+  if (displayStack_.back().spaceAfter > accumSpace_)
+    accumSpace_ = displayStack_.back().spaceAfter;
+  if (displayStack_.back().keepWithNext)
+    keepWithNext_ = 1;
+  displayStack_.resize(displayStack_.size() - 1);
+  if (spanDisplayLevels_) {
+    if (--spanDisplayLevels_ == 0) {
+      displaySize_ = pageFormat_.pageWidth - pageFormat_.leftMargin - pageFormat_.rightMargin;
+      displaySize_ -= pageFormat_.columnSep * (pageFormat_.nColumns - 1);
+      displaySize_ /= pageFormat_.nColumns;
+      displaySizeChanged();
+    }
+  }
+}
+
+void RtfFOTBuilder::startLineField(const LineFieldNIC &)
+{
+  start();
+  if (inlineState_ == inlineStart || inlineState_ == inlineFirst) {
+    fieldTabPos_ = specFormat_.fieldWidth + paraFormat_.leftIndent;
+    if (!continuePar_)
+      fieldTabPos_ += paraFormat_.firstLineIndent;
+    inlinePrepare();
+    inlineState_ = inlineField;
+    // Empirically-determined minimum possible distance between tabs.
+    static const int minTabSep = 26;
+    switch (specFormat_.fieldAlign) {
+    case symbolStart:
+    default:
+      os() << "\\tx" << fieldTabPos_ <<  ' ';
+      break;
+    case symbolEnd:
+      osp_ = &fieldos_;
+      inlineState_ = inlineFieldEnd;
+      break;
+    case symbolCenter:
+      {
+       int sep = specFormat_.fieldWidth / 2;
+       if (sep < minTabSep)
+         sep = minTabSep;
+       os() << "\\tqc\\tx" <<  fieldTabPos_ - sep << "\\tx" << fieldTabPos_ << "\\tab ";
+      }
+      break;
+    }
+  }
+}
+
+void RtfFOTBuilder::endLineField()
+{
+  if (inlineState_ == inlineFieldEnd) {
+    osp_ = &tempos_;
+    // Strip trailing spaces and adjust position of
+    // tab stop accordingly.
+    String<char> str;
+    fieldos_.extractString(str);
+    size_t i = str.size();
+    for (; i > 0; i--)
+      if (str[i - 1] != ' ')
+        break;
+    // Assume each space is .25 em.
+    int sep = (str.size() - i)*outputFormat_.fontSize*5/2;
+    str.resize(i);
+    static const int minTabSep = 26;
+    if (sep < minTabSep)
+      sep = minTabSep;
+    os() << "\\tqr\\tx" <<  fieldTabPos_ - sep << "\\tx" << fieldTabPos_ << "\\tab ";
+    os() << str;
+    os() << "\\tab ";
+  }
+  else if (inlineState_ == inlineField) {
+    os() << "\\tab ";
+    inlineState_ = inlineMiddle;
+  }
+  end();
+}
+
+void RtfFOTBuilder::startLeader(const LeaderNIC &)
+{
+  start();
+  inlinePrepare();
+  syncCharFormat();
+  if (leaderDepth_++ == 0) {
+    leaderSaveOutputFormat_ = outputFormat_;
+    preLeaderOsp_ = osp_;
+    osp_ = &nullos_;
+  }
+}
+
+void RtfFOTBuilder::endLeader()
+{
+  if (--leaderDepth_ == 0) {
+    outputFormat_ = leaderSaveOutputFormat_;
+    osp_ = preLeaderOsp_;
+    // MS Word doesn't mind if tabs aren't set at the beginning of the paragraph.
+    os() << "\\tqr\\tldot\\tx" << (displaySize_ - paraFormat_.rightIndent) << "\\tab ";
+  }
+  end();
+}
+
+void RtfFOTBuilder::setPageWidth(long units)
+{
+  if (!inSimplePageSequence_)
+    pageFormat_.pageWidth = units;
+}
+
+void RtfFOTBuilder::setPageHeight(long units)
+{
+  if (!inSimplePageSequence_)
+    pageFormat_.pageHeight = units;
+}
+
+void RtfFOTBuilder::setLeftMargin(long units)
+{
+  if (!inSimplePageSequence_)
+    pageFormat_.leftMargin = units;
+}
+
+void RtfFOTBuilder::setRightMargin(long units)
+{
+  if (!inSimplePageSequence_)
+    pageFormat_.rightMargin = units;
+}
+
+void RtfFOTBuilder::setTopMargin(long units)
+{
+  if (!inSimplePageSequence_)
+    pageFormat_.topMargin = units;
+}
+
+void RtfFOTBuilder::setBottomMargin(long units)
+{
+  if (!inSimplePageSequence_)
+    pageFormat_.bottomMargin = units;
+}
+
+void RtfFOTBuilder::setHeaderMargin(long units)
+{
+  if (!inSimplePageSequence_)
+    pageFormat_.headerMargin = units;
+}
+
+void RtfFOTBuilder::setFooterMargin(long units)
+{
+  if (!inSimplePageSequence_)
+    pageFormat_.footerMargin = units;
+}
+
+void RtfFOTBuilder::setPageNumberRestart(bool b)
+{
+  if (!inSimplePageSequence_)
+    pageFormat_.pageNumberRestart = b;
+}
+
+void RtfFOTBuilder::setPageNumberFormat(const StringC &str)
+{
+  if (inSimplePageSequence_)
+    return;
+  pageFormat_.pageNumberFormat = "dec";
+  if (str.size() == 1) {
+    switch (str[0]) {
+    case 'A':
+      pageFormat_.pageNumberFormat = "ucltr";
+      break;
+    case 'a':
+      pageFormat_.pageNumberFormat = "lcltr";
+      break;
+    case 'I':
+      pageFormat_.pageNumberFormat = "ucrm";
+      break;
+    case 'i':
+      pageFormat_.pageNumberFormat = "lcrm";
+      break;
+    }
+  }
+}
+
+void RtfFOTBuilder::setPageNColumns(long n)
+{
+  if (!inSimplePageSequence_)
+    pageFormat_.nColumns = n > 0 ? n : 1;
+}
+
+void RtfFOTBuilder::setPageColumnSep(Length n)
+{
+  if (!inSimplePageSequence_)
+    pageFormat_.columnSep = n >= 0 ? n : 0;
+}
+
+void RtfFOTBuilder::setPageBalanceColumns(bool b)
+{
+  if (!inSimplePageSequence_)
+    pageFormat_.balance = b;
+}
+
+void RtfFOTBuilder::setSpan(long n)
+{
+  specFormat_.span = n > 1;
+}
+
+void RtfFOTBuilder::startSimplePageSequenceSerial()
+{
+  inSimplePageSequence_++;
+  start();
+  if (doBalance_) {
+    os() << "\\sect\\sbknone";
+    doBalance_ = 0;
+  }
+  if (hadSection_)
+    os() << "\\sect";
+  else
+    hadSection_ = 1;
+  if (pageFormat_.headerMargin < hfPreSpace)
+    pageFormat_.headerMargin = hfPreSpace;
+  if (pageFormat_.footerMargin < hfPostSpace)
+    pageFormat_.footerMargin = hfPostSpace;
+  // Word 97 seems to get very confused by top or bottom margins less than this.
+  static const int minVMargin = 12*20;
+  if (pageFormat_.topMargin < minVMargin)
+    pageFormat_.topMargin = minVMargin;
+  if (pageFormat_.bottomMargin < minVMargin)
+    pageFormat_.bottomMargin = minVMargin;
+  os() << "\\sectd\\plain";
+  if (pageFormat_.pageWidth > pageFormat_.pageHeight)
+    os() << "\\lndscpsxn";
+  os() << "\\pgwsxn" << pageFormat_.pageWidth
+       << "\\pghsxn" << pageFormat_.pageHeight
+       << "\\marglsxn" << pageFormat_.leftMargin
+       << "\\margrsxn" << pageFormat_.rightMargin
+       << "\\margtsxn" << pageFormat_.topMargin
+       << "\\margbsxn" << pageFormat_.bottomMargin
+       << "\\headery" << 0
+       << "\\footery" << 0
+       << "\\pgn" << pageFormat_.pageNumberFormat;
+  if (pageFormat_.pageNumberRestart)
+    os() << "\\pgnrestart";
+  displaySize_ = pageFormat_.pageWidth - pageFormat_.leftMargin - pageFormat_.rightMargin;
+  currentCols_ = 1;
+  if (pageFormat_.nColumns > 1) {
+    displaySize_ -= pageFormat_.columnSep * (pageFormat_.nColumns - 1);
+    displaySize_ /= pageFormat_.nColumns;
+  }
+  if (pageFormat_.balance)
+    doBalance_ = 1;
+  displaySizeChanged();
+  outputFormat_ = OutputFormat();
+  doBreak_ = breakNone;
+  suppressBookmarks_ = 1;
+  accumSpace_ = 0;
+}
+
+void RtfFOTBuilder::endSimplePageSequenceSerial()
+{
+  if (inlineState_ != inlineFirst) {
+    if (hyphenateSuppressed_) {
+      os() << "\\hyphpar0";
+      hyphenateSuppressed_ = 0;
+    }
+    os() << "\\par";
+  }
+  inlineState_ = inlineFirst;
+  continuePar_ = 0;
+  end();
+  --inSimplePageSequence_;
+  if (!inSimplePageSequence_)
+    pageFormat_ = pageFormatStack_.back();
+  doBreak_ = breakNone;
+}
+
+void RtfFOTBuilder::startSimplePageSequenceHeaderFooter(unsigned)
+{
+  inlineState_ = inlineMiddle;
+  saveOutputFormat_ = outputFormat_;
+  outputFormat_ = OutputFormat();
+  osp_ = &hfos_;
+}
+
+void RtfFOTBuilder::endSimplePageSequenceHeaderFooter(unsigned i)
+{
+  outputFormat_ = saveOutputFormat_;
+  hfos_.extractString(hfPart_[i]);
+  osp_ = &tempos_;
+}
+
+void RtfFOTBuilder::endAllSimplePageSequenceHeaderFooter()
+{
+  bool titlePage = 0;
+  for (int i = 0; i < nHF; i += nHF/6) {
+    if (hfPart_[i | frontHF | firstHF] != hfPart_[i | frontHF | otherHF]
+        || hfPart_[i | backHF | firstHF] != hfPart_[i | backHF | otherHF]) {
+      titlePage = 1;
+      break;
+    }
+  }
+  if (titlePage) {
+    os() << "\\titlepg";
+    outputHeaderFooter("f", frontHF|firstHF);
+  }
+  outputHeaderFooter("l", backHF|otherHF);
+  outputHeaderFooter("r", frontHF|otherHF);
+  for (size_t i = 0; i < nHF; i++)
+    hfPart_[i].resize(0);
+  inlineState_ = inlineFirst;
+  continuePar_ = 0;
+  suppressBookmarks_ = 0;
+}
+
+void RtfFOTBuilder::outputHeaderFooter(const char *suffix, unsigned flags)
+{
+  os() << "{\\header" << suffix
+       << "\\pard\\sl"
+       << -(hfPreSpace + hfPostSpace)
+       << "\\sb" << (pageFormat_.headerMargin - hfPreSpace)
+       << "\\sa" << (pageFormat_.topMargin  - hfPostSpace - pageFormat_.headerMargin)
+       << "\\plain\\tqc\\tx"
+       << (pageFormat_.pageWidth - pageFormat_.leftMargin - pageFormat_.rightMargin)/2
+       << "\\tqr\\tx"
+       << (pageFormat_.pageWidth - pageFormat_.leftMargin - pageFormat_.rightMargin)
+       << ' '
+       << '{'
+       << hfPart_[flags | headerHF | leftHF]
+       << '}'
+       << "\\tab "
+       << '{'
+       << hfPart_[flags | headerHF | centerHF]
+       << '}'
+       << "\\tab "
+       << '{'
+       << hfPart_[flags | headerHF | rightHF]
+       << '}'
+       << "\\par}"
+       << "{\\footer" << suffix
+       << "\\pard\\sl"
+       << -(hfPreSpace + hfPostSpace)
+       << "\\sb" << (pageFormat_.bottomMargin - hfPreSpace - pageFormat_.footerMargin)
+       << "\\sa" << (pageFormat_.footerMargin - hfPostSpace)
+       << "\\plain\\tqc\\tx"
+       << (pageFormat_.pageWidth - pageFormat_.leftMargin - pageFormat_.rightMargin)/2
+       << "\\tqr\\tx"
+       << (pageFormat_.pageWidth - pageFormat_.leftMargin - pageFormat_.rightMargin)
+       << ' '
+       << '{'
+       << hfPart_[flags | footerHF | leftHF]
+       << '}'
+       << "\\tab "
+       << '{'
+       << hfPart_[flags | footerHF | centerHF]
+       << '}'
+       << "\\tab "
+       << '{'
+       << hfPart_[flags | footerHF | rightHF]
+       << '}'
+       << "\\par}";
+}
+
+void RtfFOTBuilder::pageNumber()
+{
+  inlinePrepare();
+  syncCharFormat();
+  os() << "\\chpgn ";
+}
+
+void RtfFOTBuilder::startScore(Symbol type)
+{
+  switch (type) {
+  case symbolAfter:
+    if (specFormat_.lineDouble)
+      specFormat_.underline = underlineDouble;
+    else if (!specFormat_.scoreSpaces)
+      specFormat_.underline = underlineWords;
+    else
+      specFormat_.underline = underlineSingle;
+    break;
+  case symbolThrough:
+    specFormat_.isStrikethrough = 1;
+    break;
+  default:
+    break;
+  }
+  start();
+}
+
+void RtfFOTBuilder::idrefButton(unsigned long groveIndex, const Char *s, size_t n)
+{
+  os() << "{\\field";
+  os() << "{\\*\\fldinst   ";  // doesn't work without the trailing spaces!
+  os() << (rtfVersion_ >= word97 ? "HYPERLINK  \\\\l " : "GOTOBUTTON ");
+  outputBookmarkName(groveIndex, s, n);
+  if (rtfVersion_ >= word97)
+    os() << "}{\\fldrslt";
+  os() << ' ';
+}
+
+void RtfFOTBuilder::startLink(const Address &addr)
+{
+  start();
+  if (linkDepth_++ == 0) {
+    if (inlineState_ == inlineMiddle)
+      doStartLink(addr);
+    else {
+      pendingLink_ = addr;
+      havePendingLink_ = 1;
+    }
+  }
+}
+
+void RtfFOTBuilder::doStartLink(const Address &addr)
+{
+  switch (addr.type) {
+  case Address::resolvedNode:
+    {
+      GroveString id; 
+      if (addr.node->getId(id) == accessOK)
+       idrefButton(addr.node->groveIndex(), id.data(), id.size());
+      else {
+       unsigned long n;
+       if (addr.node->elementIndex(n) == accessOK) {
+         os() << "{\\field";
+         os() << "{\\*\\fldinst   ";  // doesn't work without the trailing spaces!
+         os() << (rtfVersion_ >= word97 ? "HYPERLINK  \\\\l " : "GOTOBUTTON ");
+         unsigned long g = addr.node->groveIndex();
+         outputBookmarkName(g, n);
+         os() << ' ';
+         if (rtfVersion_ >= word97)
+           os() << "}{\\fldrslt ";
+         elementsRefed_.add(g, n);
+       }
+       else
+         os() << "{{";
+      }
+      break;
+    }
+  case Address::idref:
+    {
+      const StringC &id = addr.params[0];
+      size_t i = 0;
+      for (; i < id.size(); i++) {
+       // If they use multiple IDREFs, they'll only get
+       // the first.
+       if (id[i] == ' ')
+         break;
+      }
+      idrefButton(addr.node->groveIndex(), id.data(), i);
+      break;
+    }
+  default:
+    os() << "{{";
+    break;
+  }
+  saveOutputFormat_ = outputFormat_;
+} 
+
+void RtfFOTBuilder::endLink()
+{
+  if (--linkDepth_ == 0) {
+    if (havePendingLink_)
+      havePendingLink_ = 0;
+    else {
+      os() << (rtfVersion_ >= word97 ? "}}" : "}{\\fldrslt }}");
+      outputFormat_ = saveOutputFormat_;
+    }
+  }
+  end();
+}
+
+void RtfFOTBuilder::rule(const RuleNIC &nic)
+{
+  switch (nic.orientation) {
+  case symbolHorizontal:
+    {
+      long lineOffset;
+      long lineLength;
+      if (nic.hasLength && (lineLength = computeLengthSpec(nic.length)) >= 0) {
+       switch (specFormat_.displayAlignment) {
+       default:
+       case 'l':
+         lineOffset = specFormat_.leftIndent;
+         break;
+       case 'c':
+         lineOffset = (displaySize_ + specFormat_.leftIndent - specFormat_.rightIndent
+                       - lineLength)/2;
+         break;
+       case 'r':
+         lineOffset = displaySize_ - specFormat_.rightIndent - lineLength;
+         break;
+       }
+      }
+      else {
+       lineOffset = specFormat_.leftIndent;
+       lineLength = displaySize_ - specFormat_.leftIndent - specFormat_.rightIndent;
+      }
+      startDisplay(nic);
+      // We can't allow spaceBefore on this paragraph, because the y position
+      // is measured from the start of the space before, but this space will
+      // disappear on a page break.
+      newPar(0);
+      os() << "\\sl-1{\\*\\do\\dobxcolumn\\dobypara\\dodhgt0\\dpline\\dpptx0\\dppty0"
+           << "\\dpptx" << lineLength
+          << "\\dppty0"
+          << "\\dpx" << lineOffset
+          << "\\dpy0"
+          << "\\dpxsize" << lineLength
+          << "\\dpysize0";
+      if (specFormat_.color) {
+       unsigned n = colorTable_[specFormat_.color - 1];
+       os() << "\\dplinecor" << (n >> 16)
+            << "\\dplinecog" << ((n >> 8) & 0xff)
+            << "\\dplinecob" << (n & 0xff);
+      }
+      os() << "\\dplinew" << specFormat_.lineThickness;
+      os() << "}";
+      endDisplay();
+    }
+    break;
+  case symbolVertical:
+    startDisplay(nic);
+    newPar();
+    if (nic.hasLength) {
+      long lineLength = computeLengthSpec(nic.length);
+      if (lineLength > 0)
+       os() << "\\sl-" << lineLength;
+      // FIXME handle other display alignments
+    }
+    endDisplay();
+    break;
+  case symbolEscapement:
+    // if we don't have a length, can handle this with a leader tab.
+    // If we do have a length, perhaps underline a blank space.
+    inlinePrepare();
+    break;
+  case symbolLineProgression:
+    inlinePrepare();
+    break;
+  default:
+    break;
+  }
+  atomic();
+}
+
+void RtfFOTBuilder::externalGraphic(const ExternalGraphicNIC &nic)
+{
+  if (nic.isDisplay) {
+    startDisplay(nic);
+    newPar();
+    if (specFormat_.displayAlignment != 'l')
+      os() << "\\q" << specFormat_.displayAlignment;
+    flushFields();
+  }
+  else
+    inlinePrepare();
+  if (!embedObject(nic))
+    includePicture(nic);
+  if (nic.isDisplay)
+    endDisplay();
+  atomic();
+}
+
+bool RtfFOTBuilder::includePicture(const ExternalGraphicNIC &nic)
+{
+  StringC filename;
+  if (systemIdFilename(nic.entitySystemId, filename)) {
+    os() << "{\\field\\flddirty{\\*\\fldinst INCLUDEPICTURE \"";
+    // FIXME non-ascii characters
+    for (size_t i = 0; i < filename.size(); i++) {
+      if (filename[i] == '\\')
+       os() << "\\\\\\\\";
+      else
+       os() << char(filename[i]);
+    }
+    os() << "\" }{\\fldrslt }}";
+    return 1;
+  }
+  return 0;
+}
+
+#ifdef WIN32
+
+bool RtfFOTBuilder::embedObject(const ExternalGraphicNIC &nic)
+{
+  if (nic.notationSystemId.size() == 0)
+    return 0;
+  StringC clsid;
+  if (!systemIdNotation(nic.notationSystemId, "CLSID", clsid))
+    return 0;
+  StringC filename;
+  if (systemIdFilename(nic.entitySystemId, filename)) {
+    os() << INSERTION_CHAR << 'o';
+    outputWord(os(), oleObject_.size());
+    oleObject_.push_back(filename);
+    oleObject_.push_back(clsid);
+  }
+  return 1;
+}
+
+#else /* not WIN32 */
+
+bool RtfFOTBuilder::embedObject(const ExternalGraphicNIC &)
+{
+  return 0;
+}
+
+#endif /* not WIN32 */
+
+bool RtfFOTBuilder::systemIdFilename(const StringC &systemId, StringC &filename)
+{
+  int res = systemIdFilename1(systemId, filename);
+  if (res < 0) {
+    mgr_->message(RtfMessages::systemIdNotFilename, StringMessageArg(systemId));
+    return 0;
+  }
+  return res;
+}
+
+// Return -1 if an error should be generated
+// FIXME in some cases should copy the entity into a file in the same
+// directory as the output file.
+
+int RtfFOTBuilder::systemIdFilename1(const StringC &systemId, StringC &filename)
+{
+  if (systemId.size() == 0)
+    return -1;
+  Owner<InputSource> in(entityManager_->open(systemId,
+                                            *systemCharset_,
+                                            InputSourceOrigin::make(),
+                                            0,
+                                            *mgr_));
+  if (!in)
+    return 0;
+  Xchar c = in->get(*mgr_);
+  StorageObjectLocation soLoc;
+  ParsedSystemId parsedBuf;
+  if (c == InputSource::eE && in->accessError()) {
+    if (!entityManager_->parseSystemId(systemId, *systemCharset_, 0, 0, *mgr_, parsedBuf))
+      return 0;
+    if (parsedBuf.size() != 1 || parsedBuf[0].baseId.size())
+      return 0;
+    soLoc.storageObjectSpec = &parsedBuf[0];
+    soLoc.actualStorageId = parsedBuf[0].specId;
+  }
+  else {
+    const Location &loc = in->currentLocation();
+    if (loc.origin().isNull())
+      return -1;
+    const InputSourceOrigin *tem = loc.origin()->asInputSourceOrigin();
+    if (!tem)
+      return -1;
+    const ParsedSystemId *psi
+      = ExtendEntityManager::externalInfoParsedSystemId(tem->externalInfo());
+    if (!psi || psi->size() != 1)
+      return -1;
+    if (!ExtendEntityManager::externalize(tem->externalInfo(), 0, soLoc))
+      return -1;
+  }
+  if (strcmp(soLoc.storageObjectSpec->storageManager->type(), "OSFILE") != 0)
+    return -1;
+  filename = soLoc.actualStorageId;
+  return 1;
+}
+
+bool RtfFOTBuilder::systemIdNotation(const StringC &systemId,
+                                    const char *notation,
+                                    StringC &id)
+{
+  ParsedSystemId parsedBuf; 
+  if (!entityManager_->parseSystemId(systemId, *systemCharset_, 0, 0, *mgr_, parsedBuf))
+    return 0;
+  if (parsedBuf.size() != 1)
+    return 0;
+  if (strcmp(parsedBuf[0].storageManager->type(), notation) != 0)
+    return 0;
+  id = parsedBuf[0].specId;
+  return 1;
+}
+
+void RtfFOTBuilder::startTable(const TableNIC &nic)
+{
+  startDisplay(nic);
+  start();
+  if (tableLevel_++) {
+    mgr_->message(RtfMessages::nestedTable);
+    return;
+  }
+  if (nic.widthType == TableNIC::widthExplicit)
+    tableWidth_ = computeLengthSpec(nic.width);
+  else
+    tableWidth_ = (displaySize_
+                   - specFormat_.leftIndent
+                  - specFormat_.rightIndent);
+  tableDisplaySize_ = displaySize_;
+  tableLeftIndent_ = specFormat_.leftIndent;
+  tableRightIndent_ = specFormat_.rightIndent;
+  tableAlignment_ = specFormat_.displayAlignment;
+  switch (tableAlignment_) {
+  case 'r':
+    if (tableRightIndent_ != 0) {
+      tableAlignment_ = 'l';
+      tableLeftIndent_ = tableDisplaySize_ - tableWidth_ - tableRightIndent_;
+    }
+    break;
+  case 'c':
+    if (tableLeftIndent_ != 0 || tableRightIndent_ != 0) {
+      tableAlignment_ = 'l';
+      tableLeftIndent_ = (tableDisplaySize_ - tableWidth_ + tableLeftIndent_ - tableRightIndent_)/2;
+    }
+    break;
+  default:
+    break;
+  }
+}
+
+void RtfFOTBuilder::endTable()
+{
+  if (--tableLevel_ == 0) {
+    if (cells_.size())
+      outputTable();
+    if (inlineState_ == inlineTable) {
+      outputFormat_ = OutputFormat();
+      os() << "\\pard\\plain\\sl-1";
+      inlineState_ = inlineStart;
+    }
+    displaySize_ = tableDisplaySize_;
+  }
+  end();
+  endDisplay();
+}
+
+// FIXME How should borders between table-parts be handled?
+// This treats them like outside borders, which probably isn't right.
+
+void RtfFOTBuilder::startTablePartSerial(const TablePartNIC &nic)
+{
+  startDisplay(nic);
+  start();
+}
+
+void RtfFOTBuilder::endTablePartSerial()
+{
+  if (tableLevel_ == 1 && cells_.size()) {
+    outputTable();
+    nHeaderRows_ = 0;
+  }
+  end();
+  endDisplay();
+}
+
+void RtfFOTBuilder::startTablePartHeader()
+{
+  if (tableLevel_ == 1)
+    inTableHeader_ = 1;
+}
+
+void RtfFOTBuilder::endTablePartHeader()
+{
+  if (tableLevel_ == 1)
+    inTableHeader_ = 0;
+}
+
+void RtfFOTBuilder::startTablePartFooter()
+{
+}
+
+void RtfFOTBuilder::endTablePartFooter()
+{
+}
+
+void RtfFOTBuilder::tableColumn(const TableColumnNIC &nic)
+{
+  if (tableLevel_ == 1 && nic.nColumnsSpanned == 1) {
+    if (nic.columnIndex >= columns_.size())
+      columns_.resize(nic.columnIndex + 1);
+    columns_[nic.columnIndex].hasWidth = nic.hasWidth;
+    if (nic.hasWidth)
+      columns_[nic.columnIndex].width = nic.width;
+  }
+  atomic();
+}
+
+void RtfFOTBuilder::outputTable()
+{
+  for (size_t i = 0; i < cells_.size(); i++) {
+    size_t j;
+    bool lastIsDummy = 0;
+    // last cell should be a dummy cell
+    for (j = 0; j < cells_[i].size(); j += cells_[i][j].span)
+      lastIsDummy = !cells_[i][j].present;
+    if (lastIsDummy)
+      j--;
+    if (j > columns_.size())
+      columns_.resize(j);
+  }
+  for (size_t i = 0; i < cells_.size(); i++) {
+    size_t oldSize = cells_[i].size();
+    if (oldSize != columns_.size()) {
+      cells_[i].resize(columns_.size());
+      if (oldSize > 0
+         && oldSize < cells_[i].size()
+         && !cells_[i][oldSize - 1].present) {
+       for (size_t j = oldSize; j < cells_[i].size(); j++)
+         cells_[i][j] = cells_[i][oldSize - 1];
+      }
+    }
+  }
+
+  // Deal the best we can with vertical spanning
+  for (size_t i = 0; i < cells_.size(); i++) {
+    for (size_t j = 0; j < cells_[i].size(); j += cells_[i][j].span) {
+      if (cells_[i][j].vspan > 1) {
+       if (i + cells_[i][j].vspan > cells_.size())
+         cells_[i][j].vspan = cells_.size() - i;
+       for (size_t k = 1; k < cells_[i][j].vspan; k++) {
+         if (cells_[i + k][j].present) {
+           cells_[i][j].vspan = k;
+           break;
+         }
+         cells_[i + k][j].vspan = 0;
+         cells_[i + k][j].present = 1;
+         cells_[i + k][j].span = cells_[i][j].span;
+         cells_[i + k][j].border[leftBorder] = cells_[i][j].border[leftBorder];
+         cells_[i + k][j].border[rightBorder] = cells_[i][j].border[rightBorder];
+       }
+       cells_[i + cells_[i][j].vspan - 1][j].border[bottomBorder]
+           = cells_[i][j].border[bottomBorder];
+       cells_[i][j].border[bottomBorder].flags = 0;
+      }
+    }
+  }
+      
+  Vector<long> columnWidths(columns_.size());
+  int nExplicitWidth = 0;
+  int totalExplicitWidth = 0;
+  double totalTableUnits = 0;
+  displaySize_ = tableDisplaySize_;
+  for (size_t i = 0; i < columns_.size(); i++)
+    if (columns_[i].hasWidth) {
+      columnWidths[i] = computeLengthSpec(columns_[i].width);
+      nExplicitWidth++;
+      totalExplicitWidth += columnWidths[i];
+      totalTableUnits += columns_[i].width.tableUnitFactor;
+    }
+  double tableUnitWidth = 0.0;
+  totalTableUnits += columns_.size() - nExplicitWidth;
+  if (totalTableUnits)
+    tableUnitWidth
+      = ((tableWidth_ - totalExplicitWidth)/totalTableUnits);
+  for (size_t i = 0; i < columns_.size(); i++)
+    if (!columns_[i].hasWidth)
+      columnWidths[i] = long(tableUnitWidth);
+    else if (columns_[i].width.tableUnitFactor > 0.0)
+      columnWidths[i] += long(columns_[i].width.tableUnitFactor * tableUnitWidth);
+  if (cells_.size() > 0) {
+    for (size_t i = 0; i < cells_[0].size(); i += cells_[0][i].span)
+      resolveOutsideBorder(cells_[0][i].border[topBorder], tableBorder_[topBorder]);
+    for (size_t i = 0; i < cells_.back().size(); i += cells_.back()[i].span)
+       resolveOutsideBorder(cells_.back()[i].border[bottomBorder], tableBorder_[bottomBorder]);
+  }
+  for (size_t i = 0; i < cells_.size(); i++) {
+    // Resolve the column borders
+    if (cells_[i].size()) {
+      resolveOutsideBorder(cells_[i][0].border[leftBorder], tableBorder_[leftBorder]);
+      size_t prev = 0;
+      size_t j;
+      for (j = cells_[i][0].span; j < cells_[i].size(); j += cells_[i][j].span) {
+       resolveBorder(cells_[i][prev].border[rightBorder],
+                     cells_[i][j].border[leftBorder]);
+       prev = j;
+      }
+      if (j == columns_.size())
+       resolveOutsideBorder(cells_[i][prev].border[rightBorder], tableBorder_[rightBorder]);
+    }
+    // Resolve the borders adjacent to the next row
+    if (i + 1 < cells_.size()) {
+      size_t j2 = 0;
+      for (size_t j1 = 0; j1 < cells_[i].size(); j1 += cells_[i][j1].span) {
+       while (j2 < j1 && j2 < cells_[i + 1].size())
+         j2 += cells_[i + 1][j2].span;
+       if (j1 == j2
+           && j2 < cells_[i + 1].size()
+           && cells_[i][j1].span == cells_[i + 1][j2].span)
+         resolveBorder(cells_[i][j1].border[bottomBorder], cells_[i + 1][j2].border[topBorder]);
+      }
+    }
+    os() << "\\trowd";
+    if (tableAlignment_ == 'l' && tableLeftIndent_ != 0)
+      os() << "\\trleft" << tableLeftIndent_;
+    else
+      os() << "\\trq" << char(tableAlignment_);
+    if (keep_)
+      os() << "\\trkeep";
+    if (i < nHeaderRows_)
+      os() << "\\trhdr";
+#if 0
+    // Including this causes Word to leave out rules seemingly at random
+    else if (i > 0) {
+      // This is necessary to get borders on table-breaks.
+      // Putting it on the first row confuses Word.
+      const Border &brdr = tableBorder_[bottomBorder];
+      if ((brdr.flags & RtfFOTBuilder::Border::isPresent)
+       && !(brdr.flags & RtfFOTBuilder::Border::omitAtBreak)) {
+       os() << "\\trbrdrb";
+       outputTableBorder(brdr);
+      }
+    }
+#endif
+    os() << ' ';
+    long pos = tableLeftIndent_;
+    for (unsigned j = 0; j < cells_[i].size(); j += cells_[i][j].span) {
+      if (cells_[i][j].vspan == 0)
+       os() << "\\clvmrg";
+      else {
+       if (cells_[i][j].vspan > 1)
+         os() << "\\clvmgf";
+       os() << "\\clvertal" << cells_[i][j].valign;
+      }
+      for (int k = 0; k < 4; k++) {
+       const Border &brdr = cells_[i][j].border[k];
+       if (brdr.flags & RtfFOTBuilder::Border::isPresent) {
+         os() << "\\clbrdr" << "tblr"[k];
+         outputTableBorder(brdr);
+       }
+      }
+      if (cells_[i][j].hasBackground && cells_[i][j].backgroundColor)
+       os() << "\\clshdng10000\\clcfpat" << cells_[i][j].backgroundColor;
+      for (int k = 0; k < cells_[i][j].span; k++)
+       pos += columnWidths[j + k];
+      os() << "\\cellx" << pos;
+    }
+    os() << ' ';
+    for (unsigned j = 0; j < cells_[i].size(); j += cells_[i][j].span) {
+      if (cells_[i][j].content.size() == 0) {
+       if (j == 0)
+         os() << "\\intbl";
+      }
+      else {
+       os() << cells_[i][j].content;
+       if (keep_)
+         os() << "\\keepn";
+      }
+      os() << "\\cell ";
+    }
+    os() << "\\row ";
+  }
+  columns_.resize(0);
+  cells_.resize(0);
+}
+
+void RtfFOTBuilder::outputTableBorder(const Border &brdr)
+{
+  if (brdr.thickness > 75)
+    os() << "\\brdrth\\brdrw" << long(brdr.thickness)/2;
+  else if (brdr.flags & Border::isDouble)
+    os() << "\\brdrdb\\brdrw" << long(brdr.thickness);
+  else
+    os() << "\\brdrs\\brdrw" << long(brdr.thickness);
+  if (brdr.color)
+     os() << "\\brdrcf" << long(brdr.color);
+}
+
+void RtfFOTBuilder::startTableRow()
+{
+  if (tableLevel_ != 1) {
+    start();
+    return;
+  }
+  if (inlineState_ == inlineStart) {
+    if (accumSpace_)
+      os() << "\\sa" << accumSpace_;
+    if (keepWithNext_)
+      os() << "\\keepn";
+    os() << "\\par";
+  }
+  // FIXME if state is inlineTable and there's some accumSpace_, must add blank row
+  keepWithNext_ = 0;
+  accumSpace_ = 0;
+  cells_.resize(cells_.size() + 1);
+  start();
+}
+
+void RtfFOTBuilder::endTableRow()
+{
+  if (tableLevel_ != 1) {
+    end();
+    return;
+  }
+  if (inTableHeader_) {
+    Vector<Cell> headerRow;
+    cells_.back().swap(headerRow);
+    for (size_t i = cells_.size() - 1; i > nHeaderRows_; i--)
+      cells_[i - 1].swap(cells_[i]);
+    headerRow.swap(cells_[nHeaderRows_++]);
+  }
+  end();
+  inlineState_ = inlineTable;
+}
+
+void RtfFOTBuilder::startTableCell(const TableCellNIC &nic)
+{
+  if (tableLevel_ != 1) {
+    start();
+    return;
+  }
+  if (nic.columnIndex >= cells_.back().size())
+    cells_.back().resize(nic.columnIndex + 1);
+  cellIndex_ = nic.columnIndex;
+  cells_.back()[cellIndex_].present = !nic.missing;
+  cells_.back()[cellIndex_].span = nic.nColumnsSpanned;
+  cells_.back()[cellIndex_].vspan = nic.nRowsSpanned;
+  cells_.back()[cellIndex_].hasBackground = specFormat_.cellBackground;
+  if (specFormat_.cellBackground)
+    cells_.back()[cellIndex_].backgroundColor = specFormat_.backgroundColor;
+  cells_.back()[cellIndex_].valign = specFormat_.cellVerticalAlignment;
+  // Make a guess at the display-size.
+  bool hasWidth = 1;
+  long newDisplaySize = 0;
+  displaySize_ = tableDisplaySize_;
+  for (unsigned i = cellIndex_; i < cellIndex_ + nic.nColumnsSpanned; i++) {
+    if (i >= columns_.size() || !columns_[i].hasWidth) {
+      hasWidth = 0;
+      break;
+    }
+    newDisplaySize += computeLengthSpec(columns_[i].width);
+  }
+  if (!hasWidth)
+    newDisplaySize
+      = (tableWidth_*nic.nColumnsSpanned)
+        /(columns_.size() ? columns_.size() : 2);
+  osp_ = &cellos_;
+  inlineState_ = inlineFirst;
+  continuePar_ = 0;
+  addLeftIndent_  = specFormat_.cellLeftMargin;
+  addRightIndent_ = specFormat_.cellRightMargin;
+  accumSpace_ = specFormat_.cellTopMargin;
+  displaySize_ = newDisplaySize;
+  displaySizeChanged();
+  start();
+  os() << "\\plain ";
+  outputFormat_ = OutputFormat();
+}
+
+void RtfFOTBuilder::endTableCell()
+{
+  if (tableLevel_ != 1) {
+    end();
+    return;
+  }
+  accumSpace_ += specFormat_.cellBottomMargin;
+  if (accumSpace_ > 0) {
+    if (inlineState_ == inlineFirst)
+      os() << "\\pard\\intbl\\sl-" << accumSpace_ << "\\par";
+    else
+      os() << "\\sa" << accumSpace_;
+  }
+  else if (inlineState_ == inlineFirst)
+    os() << "\\intbl";
+  accumSpace_ = 0;
+  cellos_.extractString(cells_.back()[cellIndex_].content);
+  end();
+  osp_ = &tempos_;
+  accumSpace_ = 0;
+  addLeftIndent_ = 0;
+  addRightIndent_ = 0;
+  keepWithNext_ = 0;
+}
+
+void RtfFOTBuilder::tableBeforeRowBorder()
+{
+  if (tableLevel_ == 1)
+    storeBorder(tableBorder_[topBorder]);
+}
+
+void RtfFOTBuilder::tableAfterRowBorder()
+{
+  if (tableLevel_ == 1)
+    storeBorder(tableBorder_[bottomBorder]);
+}
+
+void RtfFOTBuilder::tableBeforeColumnBorder()
+{
+  if (tableLevel_ == 1)
+    storeBorder(tableBorder_[leftBorder]);
+}
+
+void RtfFOTBuilder::tableAfterColumnBorder()
+{
+  if (tableLevel_ == 1)
+    storeBorder(tableBorder_[rightBorder]);
+}
+
+void RtfFOTBuilder::tableCellBeforeRowBorder()
+{
+  if (tableLevel_ == 1)
+    storeBorder(cells_.back()[cellIndex_].border[topBorder]);
+}
+
+void RtfFOTBuilder::tableCellAfterRowBorder()
+{
+  if (tableLevel_ == 1)
+    storeBorder(cells_.back()[cellIndex_].border[bottomBorder]);
+}
+
+void RtfFOTBuilder::tableCellBeforeColumnBorder()
+{
+  if (tableLevel_ == 1)
+    storeBorder(cells_.back()[cellIndex_].border[leftBorder]);
+}
+
+void RtfFOTBuilder::tableCellAfterColumnBorder()
+{
+  if (tableLevel_ == 1)
+    storeBorder(cells_.back()[cellIndex_].border[rightBorder]);
+}
+
+void RtfFOTBuilder::storeBorder(Border &b)
+{
+  b.flags = 0;
+  if (specFormat_.borderPresent) {
+    b.flags |= Border::isPresent;
+    b.thickness = specFormat_.lineThickness;
+    b.color = specFormat_.color;
+    if (specFormat_.lineDouble)
+      b.flags |= Border::isDouble;
+  }
+  if (specFormat_.borderOmitAtBreak)
+    b.flags |= Border::omitAtBreak;
+  b.priority = specFormat_.borderPriority;
+  atomic();
+}
+
+void RtfFOTBuilder::resolveBorder(Border &b1, Border &b2)
+{
+  if (b1.priority != b2.priority) {
+    if (b1.priority > b2.priority)
+      b2 = b1;
+    else
+      b1 = b2;
+  }
+  else if ((b1.flags ^ b2.flags) & Border::isPresent) {
+    if (b1.flags & Border::isPresent)
+      b2 = b1;
+    else
+      b1 = b2;
+  }
+}
+
+void RtfFOTBuilder::resolveOutsideBorder(Border &cellBorder, const Border &tableBorder)
+{
+  // The standard doesn't say this, but otherwise table-border: #t wouldn't work.
+  if (tableBorder.priority > cellBorder.priority
+      || (tableBorder.priority == cellBorder.priority
+          && (tableBorder.flags & Border::isPresent)))
+    cellBorder = tableBorder;
+}
+
+void RtfFOTBuilder::setCellBeforeRowMargin(Length n)
+{
+  specFormat_.cellTopMargin = n;
+}
+
+void RtfFOTBuilder::setCellAfterRowMargin(Length n)
+{
+  specFormat_.cellBottomMargin = n;
+}
+
+void RtfFOTBuilder::setCellBeforeColumnMargin(Length n)
+{
+  specFormat_.cellLeftMargin = n;
+}
+
+void RtfFOTBuilder::setCellAfterColumnMargin(Length n)
+{
+  specFormat_.cellRightMargin = n;
+}
+
+void RtfFOTBuilder::setCellBackground(bool b)
+{
+  specFormat_.cellBackground = b;
+}
+
+void RtfFOTBuilder::setCellRowAlignment(Symbol align)
+{
+  switch (align) {
+  case symbolStart:
+    specFormat_.cellVerticalAlignment = 't';
+    break;
+  case symbolCenter:
+    specFormat_.cellVerticalAlignment = 'c';
+    break;
+  case symbolEnd:
+    specFormat_.cellVerticalAlignment = 'b';
+    break;
+  default:
+    break;
+  }
+}
+
+void RtfFOTBuilder::enterMathMode()
+{
+  if (mathLevel_++ == 0) {
+    mathSaveOutputFormat_ = outputFormat_;
+    os() << "{\\field{\\*\\fldinst  EQ ";
+  }
+}
+
+void RtfFOTBuilder::exitMathMode()
+{
+  if (--mathLevel_ == 0) {
+    os() << "}{\\fldrslt}}";
+    outputFormat_ = mathSaveOutputFormat_;
+  }
+}
+
+void RtfFOTBuilder::setSubscriptDepth(Length n)
+{
+  specFormat_.subscriptDepth = points(n);
+}
+
+
+void RtfFOTBuilder::setSuperscriptHeight(Length n)
+{
+  specFormat_.superscriptHeight = points(n);
+}
+
+void RtfFOTBuilder::setUnderMarkDepth(Length n)
+{
+  specFormat_.underMarkDepth = points(n);
+}
+
+
+void RtfFOTBuilder::setOverMarkHeight(Length n)
+{
+  specFormat_.overMarkHeight = points(n);
+}
+
+void RtfFOTBuilder::startSubscript()
+{
+  start();
+  inlinePrepare();
+  enterMathMode();
+  os() << "\\\\s\\\\do" << specFormat_.subscriptDepth << '(';
+}
+
+void RtfFOTBuilder::endSubscript()
+{
+  os() << ")";
+  exitMathMode();
+  end();
+}
+
+void RtfFOTBuilder::startSuperscript()
+{
+  start();
+  inlinePrepare();
+  enterMathMode();
+  os() << "\\\\s\\\\up" << specFormat_.superscriptHeight << '(';
+}
+
+void RtfFOTBuilder::endSuperscript()
+{
+  os() << ")";
+  exitMathMode();
+  end();
+}
+
+void RtfFOTBuilder::startMathSequence()
+{
+  start();
+  inlinePrepare();
+  enterMathMode();
+}
+
+void RtfFOTBuilder::endMathSequence()
+{
+  exitMathMode();
+  end();
+}
+
+void RtfFOTBuilder::startFractionSerial()
+{
+  start();
+  inlinePrepare();
+  enterMathMode();
+  os() << "\\\\f";
+}
+
+void RtfFOTBuilder::endFractionSerial()
+{
+  exitMathMode();
+  end();
+}
+
+void RtfFOTBuilder::startFractionNumerator()
+{
+  os() << '(';
+}
+
+void RtfFOTBuilder::endFractionNumerator()
+{
+}
+
+void RtfFOTBuilder::startFractionDenominator()
+{
+  os() << eqArgSep_;
+}
+
+void RtfFOTBuilder::endFractionDenominator()
+{
+  os() << ')';
+}
+
+void RtfFOTBuilder::startRadicalSerial()
+{
+  start();
+  inlinePrepare();
+  enterMathMode();
+  startReorderFlowObject();
+}
+
+void RtfFOTBuilder::endRadicalSerial()
+{
+  Vector<String<char> > &v = reorderStack_.head()->streams;
+  *reorderStack_.head()->saveOsp << "\\\\r(" << v[1] << eqArgSep_ << v[0] << ')';
+  endReorderFlowObject();
+  end();
+  exitMathMode();
+}
+void RtfFOTBuilder::startRadicalDegree()
+{
+  endReorderFlowObjectPort();
+}
+
+void RtfFOTBuilder::endRadicalDegree()
+{
+  endReorderFlowObjectPort();
+}
+
+void RtfFOTBuilder::startFenceSerial()
+{
+  start();
+  inlinePrepare();
+  enterMathMode();
+  startReorderFlowObject();
+}
+
+void RtfFOTBuilder::endFenceSerial()
+{
+  Vector<String<char> > &v = reorderStack_.head()->streams;
+  *reorderStack_.head()->saveOsp 
+    << "\\\\b\\\\lc\\\\" << v[1] << "\\\\rc\\\\" << v[2] <<'(' << v[0] << ')';
+  endReorderFlowObject();
+  end();
+  exitMathMode();
+}
+
+void RtfFOTBuilder::startFenceOpen()
+{
+  endReorderFlowObjectPort();
+  mathSpecial_ = mathFence;
+}
+
+void RtfFOTBuilder::endFenceOpen()
+{
+  endReorderFlowObjectPort();
+}
+
+void RtfFOTBuilder::startFenceClose()
+{
+}
+void RtfFOTBuilder::endFenceClose()
+{
+  endReorderFlowObjectPort();
+  mathSpecial_ = mathNormal;
+}
+
+void RtfFOTBuilder::setMathDisplayMode(Symbol sym)
+{
+  switch (sym) {
+  case symbolDisplay:
+    specFormat_.mathInline = 0;
+    break;
+  case symbolInline:
+    specFormat_.mathInline = 1;
+    break;
+  default:
+    break;
+  }
+}
+
+void RtfFOTBuilder::startMathOperatorSerial()
+{
+  start();
+  inlinePrepare();
+  enterMathMode();
+  os() << "\\\\i";
+  if (specFormat_.mathInline)
+    os() << "\\\\in";
+  startReorderFlowObject();
+}
+
+void RtfFOTBuilder::endMathOperatorSerial()
+{
+  Vector<String<char> > &v = reorderStack_.head()->streams;
+  // FIXME handle sum, product, integral specially
+  *reorderStack_.head()->saveOsp 
+    << v[1]
+    << '(' << v[2] << eqArgSep_ << v[3] << eqArgSep_ << v[0] << ')';
+  endReorderFlowObject();
+  end();
+  exitMathMode();
+}
+
+void RtfFOTBuilder::startMathOperatorOperator()
+{
+  endReorderFlowObjectPort();
+  mathSpecial_ = mathIntegral;
+}
+
+void RtfFOTBuilder::endMathOperatorOperator()
+{
+  mathSpecial_ = mathNormal;
+  endReorderFlowObjectPort();
+}
+
+void RtfFOTBuilder::startMathOperatorLowerLimit()
+{
+}
+
+void RtfFOTBuilder::endMathOperatorLowerLimit()
+{
+  endReorderFlowObjectPort();
+}
+
+void RtfFOTBuilder::startMathOperatorUpperLimit()
+{
+}
+
+void RtfFOTBuilder::endMathOperatorUpperLimit()
+{
+  endReorderFlowObjectPort();
+}
+
+void RtfFOTBuilder::startMarkSerial()
+{
+  start();
+  inlinePrepare();
+  enterMathMode();
+  startReorderFlowObject();
+}
+
+void RtfFOTBuilder::endMarkSerial()
+{
+  Vector<String<char> > &v = reorderStack_.head()->streams;
+  OutputByteStream &o = *reorderStack_.head()->saveOsp;
+  o << "\\\\o(" << v[0];
+  if (v[1].size() > 2)
+    o << eqArgSep_ << "\\\\s\\\\up" << specFormat_.overMarkHeight 
+      << '(' << v[1] << ')';
+  if (v[2].size() > 2)
+    o << eqArgSep_ << "\\\\s\\\\do" << specFormat_.underMarkDepth
+      << '(' << v[2] << ')';
+  o << ')';
+  endReorderFlowObject();
+  end();
+  exitMathMode();
+}
+
+void RtfFOTBuilder::startMarkOver()
+{
+  endReorderFlowObjectPort();
+}
+
+void RtfFOTBuilder::endMarkOver()
+{
+  endReorderFlowObjectPort();
+}
+
+void RtfFOTBuilder::startMarkUnder()
+{
+}
+
+void RtfFOTBuilder::endMarkUnder()
+{
+  endReorderFlowObjectPort();
+}
+
+void RtfFOTBuilder::startScriptSerial()
+{
+  start();
+  inlinePrepare();
+  enterMathMode();
+  startReorderFlowObject();
+}
+
+void RtfFOTBuilder::endScriptSerial()
+{
+  endReorderFlowObjectPort();
+  Vector<String<char> > &v = reorderStack_.head()->streams;
+  ASSERT(v.size() == 7);
+  OutputByteStream &o = *reorderStack_.head()->saveOsp;
+  const String<char> &preSup = v[1];
+  const String<char> &preSub = v[2];
+  const String<char> &postSup = v[3];
+  const String<char> &postSub = v[4];
+  const String<char> &midSup = v[5];
+  const String<char> &midSub = v[6];
+  o << "\\\\o(";
+  if (preSup.size() > 2)
+    o << "\\\\s\\\\up" << specFormat_.superscriptHeight << '(' << preSup << ')';
+  o << eqArgSep_;
+  if (preSub.size() > 2)
+    o << "\\\\s\\\\do" << specFormat_.subscriptDepth << '(' << preSub << ')';
+  o << ')';
+  o << "\\\\o(";
+  o << v[0];
+  if (midSup.size() > 2)
+    o << eqArgSep_ << "\\\\s\\\\up" << specFormat_.overMarkHeight
+      << '(' << midSup << ')';
+  if (midSub.size() > 2)
+    o << eqArgSep_ << "\\\\s\\\\do" << specFormat_.underMarkDepth
+      << '(' << midSub << ')';
+  o << ')';
+  o << "\\\\o(";
+  if (postSup.size() > 2)
+    o << "\\\\s\\\\up" << specFormat_.superscriptHeight << '(' << postSup << ')';
+  o << eqArgSep_;
+  if (postSub.size() > 2)
+    o << "\\\\s\\\\do" << specFormat_.subscriptDepth << '(' << postSub << ')';
+  o << ')';
+  endReorderFlowObject();
+  end();
+  exitMathMode();
+}
+
+void RtfFOTBuilder::startScriptPreSup()
+{
+  endReorderFlowObjectPort();
+}
+
+void RtfFOTBuilder::startScriptPreSub()
+{
+  endReorderFlowObjectPort();
+}
+
+void RtfFOTBuilder::startScriptPostSup()
+{
+  endReorderFlowObjectPort();
+}
+
+void RtfFOTBuilder::startScriptPostSub()
+{
+  endReorderFlowObjectPort();
+}
+
+void RtfFOTBuilder::startScriptMidSup()
+{
+  endReorderFlowObjectPort();
+}
+
+void RtfFOTBuilder::startScriptMidSub()
+{
+  endReorderFlowObjectPort();
+}
+
+void RtfFOTBuilder::startReorderFlowObject()
+{
+  reorderStack_.insert(new ReorderFlowObject);
+  ReorderFlowObject &r = *reorderStack_.head();
+  r.saveOsp = osp_;
+  r.saveOutputFormat = outputFormat_;
+  osp_ = &r.buf;
+  os() << '{';
+}
+
+void RtfFOTBuilder::endReorderFlowObjectPort()
+{
+  os() << '}';
+  ReorderFlowObject &r = *reorderStack_.head();
+  r.streams.resize(r.streams.size() + 1);
+  r.buf.extractString(r.streams.back());
+  os() << '{';
+  outputFormat_ = r.saveOutputFormat;
+}
+
+void RtfFOTBuilder::endReorderFlowObject()
+{
+  osp_ = reorderStack_.head()->saveOsp;
+  delete reorderStack_.get();
+}
+
+void RtfFOTBuilder::setGridPositionCellType(Symbol sym)
+{
+  switch (sym) {
+  case symbolRowMajor:
+    specFormat_.gridPosType = gridPosRowMajor;
+    break;
+  case symbolColumnMajor:
+    specFormat_.gridPosType = gridPosColumnMajor;
+    break;
+  case symbolExplicit:
+    specFormat_.gridPosType = gridPosExplicit;
+    break;
+  default:
+    break;
+  }
+}
+
+void RtfFOTBuilder::setGridColumnAlignment(Symbol sym)
+{
+  switch (sym) {
+  case symbolStart:
+    specFormat_.gridColumnAlignment = 'l';
+    break;
+  case symbolCenter:
+    specFormat_.gridColumnAlignment = 'c';
+    break;
+  case symbolEnd:
+    specFormat_.gridColumnAlignment = 'r';
+    break;
+  default:
+    break;
+  }
+}
+
+void RtfFOTBuilder::setGridRowSep(Length n)
+{
+  specFormat_.gridRowSep = points(n);
+}
+
+void RtfFOTBuilder::setGridColumnSep(Length n)
+{
+  specFormat_.gridColumnSep = points(n);
+}
+
+void RtfFOTBuilder::startGrid(const GridNIC &nic)
+{
+  start();
+  inlinePrepare();
+  enterMathMode();
+  gridStack_.insert(new Grid);
+  Grid &g = *gridStack_.head();
+  g.saveOsp = osp_;
+  g.saveOutputFormat = outputFormat_;
+  g.posType = specFormat_.gridPosType;
+  g.nColumns = nic.nColumns;
+  if (!g.nColumns)
+    g.nColumns = 1;
+  g.nRows = nic.nRows;
+  if (!g.nRows)
+    g.nRows = 1;
+  osp_ = &g.buf;
+}
+
+void RtfFOTBuilder::endGrid()
+{
+  osp_ = gridStack_.head()->saveOsp;
+  Grid &g = *gridStack_.head();
+  for (size_t i = 0; i < g.cells.size(); i++) {
+    if (g.cells[i].size() > g.nColumns)
+      g.nColumns = g.cells[i].size();
+  }
+  if (g.cells.size() > g.nRows)
+    g.nRows = g.cells.size();
+  os() << "\\\\a"
+       << "\\\\hs" << specFormat_.gridColumnSep
+       << "\\\\vs" << specFormat_.gridRowSep
+       << "\\\\a" << specFormat_.gridColumnAlignment
+       << "\\\\co" << g.nColumns << '(';
+  for (size_t i = 0; i < g.cells.size(); i++) {
+    size_t j = 0;
+    for (; j < g.cells[i].size(); j++) {
+      if (i || j)
+        os() << eqArgSep_;
+      os() << g.cells[i][j];
+    }
+    if (!j)
+      j++;
+    for (; j < g.nColumns; j++)
+      os() << eqArgSep_;
+  }
+  os() << ')';
+  delete gridStack_.get();
+  end();
+  exitMathMode();
+}
+
+void RtfFOTBuilder::startGridCell(const GridCellNIC &nic)
+{
+  if (!gridStack_.empty()) {
+    os() << '{';
+    Grid &g = *gridStack_.head();
+    g.curCellPtr = 0;
+    switch (g.posType) {
+    case gridPosExplicit:
+      if (nic.rowNumber > 0 && nic.columnNumber > 0) {
+       if (nic.columnNumber > g.cells.size())
+         g.cells.resize(nic.columnNumber);
+       Vector<String<char> > &column = g.cells[nic.columnNumber - 1];
+       if (nic.rowNumber > column.size())
+         column.resize(nic.rowNumber);
+       g.curCellPtr = &column[nic.rowNumber - 1];
+      }
+      break;
+    case gridPosRowMajor:
+      if (g.cells.size() == 0
+         || g.cells.back().size() >= g.nColumns)
+       g.cells.resize(g.cells.size() + 1);
+      g.cells.back().resize(g.cells.back().size() + 1);
+      g.curCellPtr = &g.cells.back().back();
+      break;
+    case gridPosColumnMajor:
+      if (g.cells.size() < g.nRows)
+       g.cells.resize(g.nRows);
+      if (g.cells[g.nRows - 1].size() == g.cells[0].size()) {
+        g.cells[0].resize(g.cells[0].size() + 1);
+       g.curCellPtr = &g.cells[0].back();
+      }
+      else {
+       for (size_t i = 1;; i++) {
+         ASSERT(i < g.cells.size());
+         if (g.cells[i].size() < g.cells[0].size()) {
+           g.cells[i].resize(g.cells[i].size() + 1);
+           g.curCellPtr = &g.cells[i].back();
+           break;
+         }
+       }
+      }
+      break;
+    default:
+      CANNOT_HAPPEN();
+    }
+  }
+  start();
+}
+
+void RtfFOTBuilder::endGridCell()
+{
+  if (!gridStack_.empty()) {
+    os() << '}';
+    Grid &g = *gridStack_.head();
+    if (g.curCellPtr)
+      g.buf.extractString(*g.curCellPtr);
+    else {
+      String<char> tem;
+      g.buf.extractString(tem);
+    }
+    outputFormat_ = g.saveOutputFormat;
+  }
+  end();
+}
+
+
+void RtfFOTBuilder::outputBookmarkName(unsigned long groveIndex, const Char *s, size_t n)
+{
+  os() << "ID";
+  if (groveIndex)
+    os() << groveIndex;
+  os() << '_';
+  for (; n > 0; n--, s++) {
+    Char c = *s;
+    switch (c) {
+    case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7':
+    case '8': case '9':
+    case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h':
+    case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p':
+    case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x':
+    case 'y': case 'z':
+    case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H':
+    case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P':
+    case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
+    case 'Y': case 'Z':
+      os() << char(c);
+      break;
+    default:
+      os() << '_' << (unsigned long)c << '_';
+      break;
+    }
+  }
+}
+
+void RtfFOTBuilder::outputBookmarkName(unsigned long groveIndex, unsigned long n)
+{
+  os() << (rtfVersion_ >= word97 ? "_" : "E_");
+  if (groveIndex)
+    os() << groveIndex << '_';
+  os() << n;
+}
+
+void RtfFOTBuilder::flushPendingElements()
+{
+  for (size_t i = 0; i < pendingElements_.size(); i++) {
+    const NodePtr &node = pendingElements_[i];
+    GroveString id;
+    if (node->getId(id) == accessOK) {
+      unsigned long g = node->groveIndex();
+      os() << "{\\*\\bkmkstart ";
+      outputBookmarkName(g, id.data(), id.size());
+      os() << '}';
+      os() << "{\\*\\bkmkend ";
+      outputBookmarkName(g, id.data(), id.size());
+      os() << '}';
+    }
+    else {
+      unsigned long n;
+      if (node->elementIndex(n) == accessOK) {
+       os() << INSERTION_CHAR << 'b';
+       outputWord(os(), node->groveIndex());
+       outputWord(os(), n);
+      }
+    }
+  }
+  nPendingElementsNonEmpty_ = 0;
+  pendingElements_.resize(0);
+  pendingElementLevels_.resize(0);
+}
+
+void RtfFOTBuilder::startNode(const NodePtr &node, const StringC &mode)
+{
+  nodeLevel_++;
+  if (mode.size() == 0) {
+    pendingElements_.push_back(node);
+    pendingElementLevels_.push_back(nodeLevel_);
+  }
+}
+
+void RtfFOTBuilder::endNode()
+{
+  // The idea is not to put out a bookmark if there were
+  // no flow objects associated with the node.
+  // The flow objects might have been labeled, in which case
+  // we will get a startNode for the node later.
+  if (pendingElements_.size() > 0 && pendingElementLevels_.back() == nodeLevel_
+      && nPendingElementsNonEmpty_ < pendingElements_.size()) {
+    pendingElementLevels_.resize(pendingElements_.size() - 1);
+    pendingElements_.resize(pendingElements_.size() - 1);
+  }
+  nodeLevel_--;
+}
+
+void RtfFOTBuilder::currentNodePageNumber(const NodePtr &node)
+{
+  inlinePrepare();
+  syncCharFormat();
+  GroveString id;
+  unsigned long n;
+  if (node->getId(id) == accessOK) {
+    os() << "{\\field\\flddirty{\\*\\fldinst PAGEREF ";
+    outputBookmarkName(node->groveIndex(), id.data(), id.size());
+    os() << "}{\\fldrslt 000}}";
+  }
+  else if (node->elementIndex(n) == accessOK) {
+    os() << "{\\field\\flddirty{\\*\\fldinst PAGEREF ";
+    unsigned long groveIndex = node->groveIndex();
+    outputBookmarkName(groveIndex, n);
+    elementsRefed_.add(groveIndex, n);
+    os() << "}{\\fldrslt 000}}";
+  }
+}
+
+void RtfFOTBuilder::start()
+{
+  nPendingElementsNonEmpty_ = pendingElements_.size();
+  specFormatStack_.push_back(specFormat_);
+  if (!inSimplePageSequence_)
+    pageFormatStack_.push_back(pageFormat_);
+}
+
+void RtfFOTBuilder::end()
+{
+  specFormatStack_.resize(specFormatStack_.size() - 1);
+  specFormat_ = specFormatStack_.back();
+  if (!inSimplePageSequence_) {
+    pageFormatStack_.resize(pageFormatStack_.size() - 1);
+    pageFormat_ = pageFormatStack_.back();
+  }
+}
+
+void RtfFOTBuilder::atomic()
+{
+  nPendingElementsNonEmpty_ = pendingElements_.size();
+  specFormat_ = specFormatStack_.back();
+}
+
+RtfFOTBuilder::CommonFormat::CommonFormat()
+: isBold(0), isItalic(0), fontSize(24), fontFamily(0),
+  language(0), country(0),
+  color(0), charBackgroundColor(0),
+  underline(noUnderline), isStrikethrough(0), positionPointShift(0),
+  kern(0), isSmallCaps(0),
+  charBorder(0)
+{
+}
+
+RtfFOTBuilder::OutputFormat::OutputFormat()
+: charset(0), lang(DEFAULT_LANG), langCharsets(0x1f)
+{
+}
+
+RtfFOTBuilder::Format::Format()
+: fieldWidth(0), fieldAlign(symbolStart), displayAlignment('l'),
+  inputWhitespaceTreatment(symbolPreserve), expandTabs(8),
+  lineThickness(20), lineDouble(0), backgroundColor(0),
+  boxHasBorder(1), boxHasBackground(0),
+  borderPresent(1), borderPriority(0), borderOmitAtBreak(0),
+  cellLeftMargin(0), cellRightMargin(0), cellTopMargin(0), cellBottomMargin(0),
+  cellVerticalAlignment('t'),
+  lineSpacingSpec(240), cellBackground(0), scoreSpaces(1), hyphenate(0),
+  gridPosType(gridPosRowMajor), gridColumnAlignment('c'),
+  gridRowSep(2), gridColumnSep(2),
+  mathInline(0), mathPosture(0), superscriptHeight(5), subscriptDepth(3),
+  overMarkHeight(10), underMarkDepth(10), span(0)
+{
+}
+
+RtfFOTBuilder::ParaFormat::ParaFormat()
+: leftIndent(0), rightIndent(0), firstLineIndent(0), quadding('l'),
+  lineSpacing(240), lines(symbolWrap), lineSpacingAtLeast(0),
+  widowOrphanControl(widowControl|orphanControl), headingLevel(0)
+{
+}
+
+RtfFOTBuilder::PageFormat::PageFormat()
+: leftMargin(0), rightMargin(0),
+  topMargin(0), bottomMargin(0),
+  headerMargin(0), footerMargin(0),
+  pageHeight(72*20*11), pageWidth(72*10*17),
+  pageNumberFormat("dec"), pageNumberRestart(0),
+  nColumns(1), columnSep(72*10), balance(0)
+{
+}
+
+RtfFOTBuilder::FontFamilyCharsets::FontFamilyCharsets()
+{
+  for (int i = 0; i < nWinCharsets; i++)
+    rtfFontNumber[i] = -1;
+}
+
+ElementSet::ElementSet()
+{
+}
+
+void ElementSet::add(unsigned long groveIndex, unsigned long n)
+{
+  if (groveIndex >= v_.size())
+    v_.resize(groveIndex + 1);
+  Vector<char> &elems = v_[groveIndex];
+  if (n >= elems.size()) {
+    for (size_t k = 1 + (n - elems.size()); k > 0; --k)
+      elems.push_back(0);
+  }
+  elems[n] = 1;
+}
+
+bool ElementSet::contains(unsigned long groveIndex, unsigned long n) const
+{
+  return groveIndex < v_.size() && n < v_[groveIndex].size() && v_[groveIndex][n] != 0;
+}
+
+// This was mostly automatically generated using GetLocaleInfo().
+
+unsigned RtfFOTBuilder::convertLanguage(unsigned language, unsigned country,
+                                       unsigned &langCharsets)
+{
+  if (language == 0) {
+    langCharsets = 0x1f;
+    return DEFAULT_LANG;
+  }
+  switch (language) {
+  case SP_LETTER2('B', 'G'):
+    langCharsets = 0x4;
+    return 0x402;
+  case SP_LETTER2('C', 'A'):
+    langCharsets = 0x3;
+    return 0x403;
+  case SP_LETTER2('C', 'S'):
+    langCharsets = 0x13;
+    return 0x405;
+  case SP_LETTER2('D', 'A'):
+    langCharsets = 0x13;
+    return 0x406;
+  case SP_LETTER2('D', 'E'):
+    langCharsets = 0x13;
+    switch (country) {
+    case SP_LETTER2('D', 'E'):
+      return 0x407;
+    case SP_LETTER2('C', 'H'):
+      return 0x807;
+    case SP_LETTER2('A', 'T'):
+      return 0xc07;
+    case SP_LETTER2('L', 'U'):
+      return 0x1007;
+    case SP_LETTER2('L', 'I'):
+      return 0x1407;
+    }
+    return 0x407;
+  case SP_LETTER2('E', 'L'):
+    langCharsets = 0x8;
+    return 0x408;
+  case SP_LETTER2('E', 'N'):
+    langCharsets = 0x1f;
+    switch (country) {
+    case SP_LETTER2('U', 'S'):
+      return 0x409;
+    case SP_LETTER2('G', 'B'):
+      return 0x809;
+    case SP_LETTER2('A', 'U'):
+      return 0xc09;
+    case SP_LETTER2('C', 'A'):
+      return 0x1009;
+    case SP_LETTER2('N', 'Z'):
+      return 0x1409;
+    case SP_LETTER2('I', 'E'):
+      return 0x1809;
+    case SP_LETTER2('Z', 'A'):
+      return 0x1c09;
+    case SP_LETTER2('J', 'M'):
+      return 0x2009;
+    case SP_LETTER2('C', 'B'):
+      return 0x2409;
+    case SP_LETTER2('B', 'Z'):
+      return 0x2809;
+    case SP_LETTER2('T', 'T'):
+      return 0x2c09;
+    }
+    return 0x409;
+  case SP_LETTER2('E', 'S'):
+    langCharsets = 0x13;
+    switch (country) {
+    case SP_LETTER2('E', 'S'):
+      return 0x40a;
+    case SP_LETTER2('M', 'X'):
+      return 0x80a;
+    case SP_LETTER2('G', 'T'):
+      return 0x100a;
+    case SP_LETTER2('C', 'R'):
+      return 0x140a;
+    case SP_LETTER2('P', 'A'):
+      return 0x180a;
+    case SP_LETTER2('D', 'O'):
+      return 0x1c0a;
+    case SP_LETTER2('V', 'E'):
+      return 0x200a;
+    case SP_LETTER2('C', 'O'):
+      return 0x240a;
+    case SP_LETTER2('P', 'E'):
+      return 0x280a;
+    case SP_LETTER2('A', 'R'):
+      return 0x2c0a;
+    case SP_LETTER2('E', 'C'):
+      return 0x300a;
+    case SP_LETTER2('C', 'L'):
+      return 0x340a;
+    case SP_LETTER2('U', 'Y'):
+      return 0x380a;
+    case SP_LETTER2('P', 'Y'):
+      return 0x3c0a;
+    case SP_LETTER2('B', 'O'):
+      return 0x400a;
+    case SP_LETTER2('S', 'V'):
+      return 0x440a;
+    case SP_LETTER2('H', 'N'):
+      return 0x480a;
+    case SP_LETTER2('N', 'I'):
+      return 0x4c0a;
+    case SP_LETTER2('P', 'R'):
+      return 0x500a;
+    }
+    return 0x40a;
+  case SP_LETTER2('F', 'I'):
+    langCharsets = 0x13;
+    return 0x40b;
+  case SP_LETTER2('F', 'R'):
+    langCharsets = 0x13;
+    switch (country) {
+    case SP_LETTER2('F', 'R'):
+      return 0x40c;
+    case SP_LETTER2('B', 'E'):
+      return 0x80c;
+    case SP_LETTER2('C', 'A'):
+      return 0xc0c;
+    case SP_LETTER2('C', 'H'):
+      return 0x100c;
+    case SP_LETTER2('L', 'U'):
+      return 0x140c;
+    }
+    return 0x40c;
+  case SP_LETTER2('H', 'U'):
+    langCharsets = 0x12;
+    return 0x40e;
+  case SP_LETTER2('I', 'S'):
+    langCharsets = 0x3;
+    return 0x40f;
+  case SP_LETTER2('I', 'T'):
+    langCharsets = 0x13;
+    switch (country) {
+    case SP_LETTER2('I', 'T'):
+      return 0x410;
+    case SP_LETTER2('C', 'H'):
+      return 0x810;
+    }
+    return 0x410;
+  case SP_LETTER2('N', 'L'):
+    langCharsets = 0x13;
+    switch (country) {
+    case SP_LETTER2('N', 'L'):
+      return 0x413;
+    case SP_LETTER2('B', 'E'):
+      return 0x813;
+    }
+    return 0x413;
+  case SP_LETTER2('N', 'O'):
+    langCharsets = 0x13;
+    return 0x414;
+  case SP_LETTER2('P', 'L'):
+    langCharsets = 0x12;
+    return 0x415;
+  case SP_LETTER2('P', 'T'):
+    langCharsets = 0x13;
+    switch (country) {
+    case SP_LETTER2('B', 'R'):
+      return 0x416;
+    case SP_LETTER2('P', 'T'):
+      return 0x816;
+    }
+    return 0x416;
+  case SP_LETTER2('R', 'O'):
+    langCharsets = 0x12;
+    return 0x418;
+  case SP_LETTER2('R', 'U'):
+    langCharsets = 0x4;
+    return 0x419;
+  case SP_LETTER2('H', 'R'):
+    langCharsets = 0x12;
+    // FIXME are langCharsets different here?
+    switch (country) {
+    case SP_LETTER2('H', 'R'):
+      return 0x41a;
+    case SP_LETTER2('S', 'P'):
+      return 0x81a;
+    }
+    return 0x41a;
+  case SP_LETTER2('S', 'K'):
+    langCharsets = 0x12;
+    return 0x41b;
+  case SP_LETTER2('S', 'Q'):
+    langCharsets = 0x12;
+    return 0x41c;
+  case SP_LETTER2('S', 'V'):
+    langCharsets = 0x13;
+    switch (country) {
+    case SP_LETTER2('S', 'E'):
+      return 0x41d;
+    case SP_LETTER2('F', 'I'):
+      return 0x81d;
+    }
+    return 0x41d;
+  case SP_LETTER2('T', 'R'):
+    langCharsets = 0x12;
+    return 0x41f;
+  case SP_LETTER2('I', 'D'):
+    langCharsets = 0x13;
+    return 0x421;
+  case SP_LETTER2('U', 'K'):
+    langCharsets = 0x4;
+    return 0x422;
+  case SP_LETTER2('B', 'E'):
+    langCharsets = 0x4;
+    return 0x423;
+  case SP_LETTER2('S', 'L'):
+    langCharsets = 0x12;
+    return 0x424;
+  case SP_LETTER2('E', 'T'):
+    langCharsets = 0x12;
+    return 0x425;
+  case SP_LETTER2('L', 'V'):
+    langCharsets = 0x12;
+    return 0x426;
+  case SP_LETTER2('L', 'T'):
+    langCharsets = 0x12;
+    return 0x427;
+  case SP_LETTER2('V', 'I'):
+    langCharsets = 0x13;
+    return 0x42a;
+  case SP_LETTER2('E', 'U'):
+    langCharsets = 0x13;
+    return 0x42d;
+  case SP_LETTER2('A', 'F'):
+    langCharsets = 0x1f;
+    return 0x436;
+  case SP_LETTER2('F', 'O'):
+    langCharsets = 0x13;
+    return 0x438;
+  case SP_LETTER2('J', 'A'):
+    langCharsets = (1 << jisCharset);
+    return 0x411;
+  }
+  langCharsets = 0x1f;
+  return DEFAULT_LANG;
+}
+
+const RtfFOTBuilder::WinCharset
+RtfFOTBuilder::winCharsets[RtfFOTBuilder::nWinCharsets] = {
+  // CP 1252
+  { 0, "", {
+    0x0000, 0x0000, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021,
+    0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
+    0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x0000, 0x0000, 0x0178,
+    0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+    0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+    0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+    0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+    0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+    0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+    0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+    0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+    0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+    0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+    0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+    0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff }
+  },
+  // CP 1250
+  { 238, " CE", {
+    0x0000, 0x0000, 0x201a, 0x0000, 0x201e, 0x2026, 0x2020, 0x2021,
+    0x0000, 0x2030, 0x0160, 0x2039, 0x015a, 0x0164, 0x017d, 0x0179,
+    0x0000, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
+    0x0000, 0x2122, 0x0161, 0x203a, 0x015b, 0x0165, 0x017e, 0x017a,
+    0x00a0, 0x02c7, 0x02d8, 0x0141, 0x00a4, 0x0104, 0x00a6, 0x00a7,
+    0x00a8, 0x00a9, 0x015e, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x017b,
+    0x00b0, 0x00b1, 0x02db, 0x0142, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+    0x00b8, 0x0105, 0x015f, 0x00bb, 0x013d, 0x02dd, 0x013e, 0x017c,
+    0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7,
+    0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e,
+    0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7,
+    0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df,
+    0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7,
+    0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f,
+    0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7,
+    0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9 }
+  },
+  // CP 1251
+  { 204, " CYR", {
+    0x0402, 0x0403, 0x201a, 0x0453, 0x201e, 0x2026, 0x2020, 0x2021,
+    0x0000, 0x2030, 0x0409, 0x2039, 0x040a, 0x040c, 0x040b, 0x040f,
+    0x0452, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
+    0x0000, 0x2122, 0x0459, 0x203a, 0x045a, 0x045c, 0x045b, 0x045f,
+    0x00a0, 0x040e, 0x045e, 0x0408, 0x00a4, 0x0490, 0x00a6, 0x00a7,
+    0x0401, 0x00a9, 0x0404, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0407,
+    0x00b0, 0x00b1, 0x0406, 0x0456, 0x0491, 0x00b5, 0x00b6, 0x00b7,
+    0x0451, 0x2116, 0x0454, 0x00bb, 0x0458, 0x0405, 0x0455, 0x0457,
+    0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
+    0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f,
+    0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
+    0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f,
+    0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
+    0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f,
+    0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
+    0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f }
+  },
+  // CP 1253
+  { 161, " Greek", {
+    0x0000, 0x0000, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021,
+    0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
+    0x0000, 0x2122, 0x0000, 0x203a, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x00a0, 0x0385, 0x0386, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+    0x00a8, 0x00a9, 0x0000, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x2015,
+    0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x00b5, 0x00b6, 0x00b7,
+    0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f,
+    0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
+    0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f,
+    0x03a0, 0x03a1, 0x0000, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7,
+    0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af,
+    0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7,
+    0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf,
+    0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7,
+    0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x0000 }
+  },
+  // CP 1254
+  { 162, " TUR", {
+    0x0000, 0x0000, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021,
+    0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
+    0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x0000, 0x0000, 0x0178,
+    0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+    0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+    0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+    0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+    0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+    0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+    0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+    0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df,
+    0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+    0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+    0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+    0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff }
+  },
+  // Shift JIS Katakana
+  { 128, "", {
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0xff61, 0xff62, 0xff63, 0xff64, 0xff65, 0xff66, 0xff67,
+    0xff68, 0xff69, 0xff6a, 0xff6b, 0xff6c, 0xff6d, 0xff6e, 0xff6f,
+    0xff70, 0xff71, 0xff72, 0xff73, 0xff74, 0xff75, 0xff76, 0xff77,
+    0xff78, 0xff79, 0xff7a, 0xff7b, 0xff7c, 0xff7d, 0xff7e, 0xff7f,
+    0xff80, 0xff81, 0xff82, 0xff83, 0xff84, 0xff85, 0xff86, 0xff87,
+    0xff88, 0xff89, 0xff8a, 0xff8b, 0xff8c, 0xff8d, 0xff8e, 0xff8f,
+    0xff90, 0xff91, 0xff92, 0xff93, 0xff94, 0xff95, 0xff96, 0xff97,
+    0xff98, 0xff99, 0xff9a, 0xff9b, 0xff9c, 0xff9d, 0xff9e, 0xff9f }
+  },
+  // This is the Symbol charset which is treated specially.
+  // It must be last in this table.
+  { 2, "" }
+};
+
+const RtfFOTBuilder::SymbolFont
+RtfFOTBuilder::symbolFonts[RtfFOTBuilder::nSymbolFonts] = {
+  { "Symbol", {
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0020, 0x0021, 0x2200, 0x0023, 0x2203, 0x0025, 0x0026, 0x220B,
+    0x0028, 0x0029, 0x2217, 0x002B, 0x002C, 0x2212, 0x002E, 0x002F,
+    0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+    0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+    0x2245, 0x0391, 0x0392, 0x03A7, 0x2206, 0x0395, 0x03A6, 0x0393,
+    0x0397, 0x0399, 0x03D1, 0x039A, 0x039B, 0x039C, 0x039D, 0x039F,
+    0x03A0, 0x0398, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03C2, 0x2126,
+    0x039E, 0x03A8, 0x0396, 0x005B, 0x2234, 0x005D, 0x22A5, 0x005F,
+    0x203E, 0x03B1, 0x03B2, 0x03C7, 0x03B4, 0x03B5, 0x03C6, 0x03B3,
+    0x03B7, 0x03B9, 0x03D5, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BF,
+    0x03C0, 0x03B8, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03D6, 0x03C9,
+    0x03BE, 0x03C8, 0x03B6, 0x007B, 0x007C, 0x007D, 0x223C, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x03D2, 0x2032, 0x2264, 0x2215, 0x221E, 0x0192, 0x2663,
+    0x2666, 0x2665, 0x2660, 0x2194, 0x2190, 0x2191, 0x2192, 0x2193,
+    0x00B0, 0x00B1, 0x2033, 0x2265, 0x00D7, 0x221D, 0x2202, 0x2022,
+    0x00F7, 0x2260, 0x2261, 0x2248, 0x2026, 0x0000, 0x0000, 0x21B5,
+    0x2135, 0x2111, 0x211C, 0x2118, 0x2297, 0x2295, 0x2205, 0x2229,
+    0x222A, 0x2283, 0x2287, 0x2284, 0x2282, 0x2286, 0x2208, 0x2209,
+    0x2220, 0x2207, 0x00AE, 0x00A9, 0x2122, 0x220F, 0x221A, 0x22C5,
+    0x00AC, 0x2227, 0x2228, 0x21D4, 0x21D0, 0x21D1, 0x21D2, 0x21D3,
+    0x25CA, 0x2329, 0x00AE, 0x00A9, 0x2122, 0x2211, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x232A, 0x222B, 0x2320, 0x0000, 0x2321, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }
+  },
+  // I created this table by hand.  It's sometimes not obvious what
+  // the appropriate mapping is.
+  { "Wingdings", {
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x2702, 0x2701, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x260e, 0x2706, 0x2709, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2328,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2707, 0x270d,
+    0x0000, 0x270c, 0x0000, 0x0000, 0x0000, 0x261c, 0x261e, 0x261d,
+    0x261f, 0x0000, 0x263a, 0x0000, 0x2639, 0x0000, 0x2620, 0x0000,
+    0x0000, 0x2708, 0x263c, 0x0000, 0x2744, 0x0000, 0x271e, 0x0000,
+    0x2720, 0x2721, 0x262a, 0x262f, 0x0950, 0x2638, 0x2648, 0x2649,
+    0x264a, 0x264b, 0x264c, 0x264d, 0x264e, 0x264f, 0x2650, 0x2651,
+    0x2652, 0x2653, 0x0000, 0x0000, 0x25cf, 0x274d, 0x25a0, 0x25a1,
+    0x0000, 0x2751, 0x2752, 0x0000, 0x0000, 0x25c6, 0x2756, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x2780, 0x2781, 0x2782, 0x2783, 0x2784, 0x2785, 0x2786,
+    0x2787, 0x2788, 0x2789, 0x0000, 0x278a, 0x278b, 0x278c, 0x278d,
+    0x278e, 0x278f, 0x2790, 0x2791, 0x2792, 0x2793, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x25cb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x25aa,
+    0x0000, 0x0000, 0x2726, 0x2605, 0x2736, 0x0000, 0x2739, 0x0000,
+    0x0000, 0x0000, 0x2727, 0x0000, 0x0000, 0x272a, 0x2730, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x232b, 0x2326, 0x0000,
+    0x27a2, 0x0000, 0x0000, 0x0000, 0x27b2, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x25ab, 0x2718, 0x2714, 0x2612, 0x2611, 0x0000 }
+  },
+  { "ZapfDingbats", {
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x2701, 0x2702, 0x2703, 0x2704, 0x260E, 0x2706, 0x2707,
+    0x2708, 0x2709, 0x261B, 0x261E, 0x270C, 0x270D, 0x270E, 0x270F,
+    0x2710, 0x2711, 0x2712, 0x2713, 0x2714, 0x2715, 0x2716, 0x2717,
+    0x2718, 0x2719, 0x271A, 0x271B, 0x271C, 0x271D, 0x271E, 0x271F,
+    0x2720, 0x2721, 0x2722, 0x2723, 0x2724, 0x2725, 0x2726, 0x2727,
+    0x2605, 0x2729, 0x272A, 0x272B, 0x272C, 0x272D, 0x272E, 0x272F,
+    0x2730, 0x2731, 0x2732, 0x2733, 0x2734, 0x2735, 0x2736, 0x2737,
+    0x2738, 0x2739, 0x273A, 0x273B, 0x273C, 0x273D, 0x273E, 0x273F,
+    0x2740, 0x2741, 0x2742, 0x2743, 0x2744, 0x2745, 0x2746, 0x2747,
+    0x2748, 0x2749, 0x274A, 0x274B, 0x0000, 0x274D, 0x25A0, 0x274F,
+    0x2750, 0x2751, 0x2752, 0x25B2, 0x25BC, 0x25C6, 0x2756, 0x0000,
+    0x2758, 0x2759, 0x275A, 0x275B, 0x275C, 0x275D, 0x275E, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x2761, 0x2762, 0x2763, 0x2764, 0x2765, 0x2766, 0x2767,
+    0x2663, 0x2666, 0x2665, 0x2660, 0x2460, 0x2461, 0x2462, 0x2463,
+    0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x2776, 0x2777,
+    0x2778, 0x2779, 0x277A, 0x277B, 0x277C, 0x277D, 0x277E, 0x277F,
+    0x2780, 0x2781, 0x2782, 0x2783, 0x2784, 0x2785, 0x2786, 0x2787,
+    0x2788, 0x2789, 0x278A, 0x278B, 0x278C, 0x278D, 0x278E, 0x278F,
+    0x2790, 0x2791, 0x2792, 0x2793, 0x2794, 0x2192, 0x2194, 0x2195,
+    0x2798, 0x2799, 0x279A, 0x279B, 0x279C, 0x279D, 0x279E, 0x279F,
+    0x27A0, 0x27A1, 0x27A2, 0x27A3, 0x27A4, 0x27A5, 0x27A6, 0x27A7,
+    0x27A8, 0x27A9, 0x27AA, 0x27AB, 0x27AC, 0x27AD, 0x27AE, 0x27AF,
+    0x0000, 0x27B1, 0x27B2, 0x27B3, 0x27B4, 0x27B5, 0x27B6, 0x27B7,
+    0x27B8, 0x27B9, 0x27BA, 0x27BB, 0x27BC, 0x27BD, 0x27BE, 0x0000 }
+    },
+};
+  
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#include "RtfFOTBuilder_inst.cxx"
diff --git a/jade/RtfFOTBuilder.h b/jade/RtfFOTBuilder.h
new file mode 100644 (file)
index 0000000..44e2872
--- /dev/null
@@ -0,0 +1,30 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef RtfFOTBuilder_INCLUDED
+#define RtfFOTBuilder_INCLUDED 1
+
+#include "OutputByteStream.h"
+#include "FOTBuilder.h"
+#include "Ptr.h"
+#include "ExtendEntityManager.h"
+#include "CharsetInfo.h"
+#include "Message.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+FOTBuilder *
+makeRtfFOTBuilder(OutputByteStream *,
+                 const Vector<StringC> &options,
+                 const Ptr<ExtendEntityManager> &,
+                 const CharsetInfo &, Messenger *,
+                 const FOTBuilder::Extension *&);
+
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not RtfFOTBuilder_INCLUDED */
diff --git a/jade/RtfFOTBuilder_inst.m4 b/jade/RtfFOTBuilder_inst.m4
new file mode 100644 (file)
index 0000000..daffa72
--- /dev/null
@@ -0,0 +1,38 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#include "config.h"
+
+#ifdef SP_MANUAL_INST
+
+#define SP_DEFINE_TEMPLATES
+#include "Vector.h"
+#include "HashTable.h"
+#include "IList.h"
+#undef SP_DEFINE_TEMPLATES
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+__instantiate(Vector<RtfFOTBuilder::ParaFormat>)
+__instantiate(Vector<RtfFOTBuilder::PageFormat>)
+__instantiate(Vector<RtfFOTBuilder::DisplayInfo>)
+__instantiate(Vector<RtfFOTBuilder::Format>)
+__instantiate(Vector<RtfFOTBuilder::Cell>)
+__instantiate(Vector<Vector<RtfFOTBuilder::Cell> >)
+__instantiate(Vector<RtfFOTBuilder::Column>)
+__instantiate(Vector<NodePtr>)
+__instantiate(Vector<long>)
+__instantiate(Vector<RtfFOTBuilder::FontFamilyCharsets>)
+__instantiate(`HashTableIter<StringC,int>')
+__instantiate(IList<RtfFOTBuilder::ReorderFlowObject>)
+__instantiate(IList<RtfFOTBuilder::Grid>)
+__instantiate(Vector<Vector<String<char> > >)
+__instantiate(Vector<Vector<char> >)
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* SP_MANUAL_INST */
diff --git a/jade/RtfMessages.msg b/jade/RtfMessages.msg
new file mode 100644 (file)
index 0000000..12e1fca
--- /dev/null
@@ -0,0 +1,8 @@
+# Copyright (c) 1996 James Clark
+# See the file COPYING for copying permission
+
+=4000
+
+E0+nestedTable++nested tables are not allowed in RTF
+E1+systemIdNotFilename++could not convert system identifier %1 to a single filename
+E2+cannotEmbedFilename++could not embed %1 with clsid %2
diff --git a/jade/RtfOle.cxx b/jade/RtfOle.cxx
new file mode 100644 (file)
index 0000000..3027434
--- /dev/null
@@ -0,0 +1,279 @@
+// Copyright (c) 1997 James Clark
+// See the file copying.txt for copying permission.
+
+#include "config.h"
+#define STRICT
+#include <windows.h>
+#include "RtfOle.h"
+#include "StringC.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class OleUninitializer {
+public:
+  OleUninitializer() : enabled_(0) { }
+  ~OleUninitializer() {
+    if (enabled_)
+      ::OleUninitialize();
+  }
+  void enable() { enabled_ = 1; }
+  bool enabled() const { return enabled_; }
+private:
+  bool enabled_;
+};
+
+static OleUninitializer oleUninit;
+
+struct ComException {
+  ComException(HRESULT hRes, const char *fn, const char *ifn = 0)
+    : hResult(hRes), functionName(fn), interfaceName(ifn) { }
+  HRESULT hResult;
+  const char *functionName;
+  const char *interfaceName;
+};
+
+inline
+void checkCom(HRESULT hRes, const char *functionName, const char *ifn = 0)
+{
+  if (FAILED(hRes))
+    throw ComException(hRes, functionName, ifn);
+}
+
+#define COMFUNC(func, args) checkCom(func args, #func)
+#define COMMETH(obj, iface, meth, args) checkCom((obj)->meth args, #meth, #iface)
+
+static const char hexdigits[] = "0123456789ABCDEF";
+
+class MyOleStream : public OLESTREAM {
+public:
+  MyOleStream(OutputByteStream &os): os_(&os), col_(0) {
+    static OLESTREAMVTBL vtbl = { get, put };
+    lpstbl = &vtbl;
+  }
+  unsigned long write(const char *p, unsigned long n) {
+    for (size_t i = 0; i < n; i++) {
+      if (col_++ % 64 == 0)
+        *os_ << "\n";
+      *os_ << hexdigits[(p[i] >> 4) & 0xf] << hexdigits[p[i] & 0xf];
+    }
+    return n;
+  }
+private:
+  static DWORD CALLBACK get(LPOLESTREAM, void *, DWORD)
+  {
+    return 0;
+  }
+  static DWORD CALLBACK put(LPOLESTREAM stm, const void *p, DWORD n)
+  {
+    return ((MyOleStream *)stm)->write((const char *)p, n);
+  }
+  unsigned col_;
+  OutputByteStream *os_;
+};
+
+template<class T>
+class ComPtr {
+public:
+  ComPtr() : p_(0) { }
+  ComPtr(const ComPtr<T> &cp) : p_(cp) { if (p_) p_->AddRef(); }
+  ~ComPtr() { if (p_) p_->Release(); }
+  void operator=(const ComPtr<T> &cp) {
+    if (cp.p_)
+      cp.p_->AddRef();
+    if (p_)
+      p_->Release();
+    p_ = cp.p_;
+  }
+  operator T *() const { return p_; }
+  T *operator->() const { return p_; }
+  // Legal only when p_ is 0.
+  T **operator&() { return &p_; }
+private:
+  T *p_;
+};
+
+template<class T>
+class GlobalPtr {
+public:
+  GlobalPtr(HGLOBAL h) : h_(h), p_((T *)GlobalLock(h)) { }
+  ~GlobalPtr() { if (p_) GlobalUnlock(h_); }
+  operator T *() const { return p_; }
+  T *operator->() const { return p_; }
+private:
+  GlobalPtr(const GlobalPtr<T> &);
+  void operator=(const GlobalPtr<T> &);
+  T *p_;
+  HGLOBAL h_;
+};
+
+class StorageMedium : public STGMEDIUM {
+public:
+  StorageMedium() { pUnkForRelease = 0; tymed = TYMED_NULL; }
+  ~StorageMedium() { ReleaseStgMedium(this); }
+private:
+  StorageMedium(const StorageMedium &);
+  void operator=(const StorageMedium &);
+};
+
+static
+const wchar_t *makeAbsolute(const wchar_t *filename, StringC &buf);
+
+int outputObject(const wchar_t *filename,
+                const wchar_t *clsidString,
+                OutputByteStream &os)
+{
+  try {
+    if (!oleUninit.enabled()) {
+      COMFUNC(OleInitialize, (NULL));
+      oleUninit.enable();
+    }
+    StringC buf;
+    filename = makeAbsolute(filename, buf);
+
+    FORMATETC fmt;
+    fmt.cfFormat = CF_METAFILEPICT;
+    fmt.ptd = 0;
+    fmt.dwAspect = DVASPECT_CONTENT;
+    fmt.lindex = -1;
+    fmt.tymed = TYMED_MFPICT;
+    ComPtr<IStorage> pStorage;
+#if 0
+    ComPtr<ILockBytes> pBytes;
+    COMFUNC(CreateILockBytesOnHGlobal, (0, 1, &pBytes));
+    COMFUNC(StgCreateDocfileOnILockBytes,(pBytes, STGM_CREATE|STGM_TRANSACTED|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, 0, &pStorage));
+#else
+    COMFUNC(StgCreateDocfile,(NULL,STGM_DELETEONRELEASE|STGM_CREATE|STGM_TRANSACTED|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, 0, &pStorage));
+#endif
+    ComPtr<IPersistStorage> pPersist;
+    CLSID clsid;
+    if (clsidString && *clsidString)
+      COMFUNC(CLSIDFromString, ((wchar_t *)clsidString, &clsid));
+    else
+      COMFUNC(GetClassFile, (filename, &clsid));
+    COMFUNC(CoCreateInstance,
+            (clsid,
+             NULL,
+            CLSCTX_SERVER,
+            IID_IPersistStorage,
+            (void **)&pPersist));
+    COMMETH(pPersist, IPersistStorage, InitNew, (pStorage));
+    ComPtr<IPersistFile> pPersistF;
+    COMMETH(pPersist, IUnknown, QueryInterface, (IID_IPersistFile, (void **)&pPersistF));
+    COMMETH(pPersistF, IPersistFile, Load, (filename, STGM_READ|STGM_SHARE_DENY_WRITE));
+    COMFUNC(OleSave, (pPersist, pStorage, 1));
+    COMMETH(pPersist, IPersistStorage, SaveCompleted, (pStorage));
+#if 0
+    COMFUNC(OleCreateLinkToFile,
+      (filename,
+      IID_IPersistStorage,
+      OLERENDER_FORMAT,
+      &fmt,
+      NULL, // pClientSite
+      pStorage,
+      (void **)&pPersist));
+    COMFUNC(OleSave, (pPersist, pStorage, 0));
+#endif
+    os << "{\\object\\objemb";
+    os << "{\\*\\objdata";
+    MyOleStream stm(os);
+    COMFUNC(OleConvertIStorageToOLESTREAM, (pStorage, &stm));
+    os << "}";
+
+    ComPtr<IDataObject> pData;
+    COMMETH(pPersist, IUnknown, QueryInterface, (IID_IDataObject, (void **)&pData));
+    StorageMedium med;
+    COMMETH(pData, IDataObject, GetData, (&fmt, &med));
+    if (med.tymed != TYMED_MFPICT) {
+      return 0;
+    }
+    GlobalPtr<METAFILEPICT> pMeta(med.hMetaFilePict);
+    os << "{\\result";
+    os << "{\\pict\\wmetafile" << pMeta->mm
+      << "\\picw" << pMeta->xExt
+      << "\\pich" << pMeta->yExt
+      ;
+    UINT n = GetMetaFileBitsEx(pMeta->hMF, 0, 0);
+    if (n == 0) {
+      return 0;
+    }
+    char *s = new char[n];
+    n = GetMetaFileBitsEx(pMeta->hMF, n, s);
+    if (n == 0) {
+      return 0;
+    }
+    for (size_t i = 0; i < n; i++) {
+      if (i % 64 == 0)
+       os << "\n";
+      os << hexdigits[(s[i] >> 4) & 0xf] << hexdigits[s[i] & 0xf];
+    }
+    delete [] s;
+    os << "}"; // pict
+    os << "}"; // result
+    os << "}"; // object
+  }    
+  catch (const ComException &) {
+    return 0;
+  }
+  return 1;
+}
+
+static
+void multiByteToWideChar(const char *mb, StringC &w)
+{
+  int n = ::MultiByteToWideChar(CP_ACP, 0, mb, -1, 0, 0);
+  w.resize(n);
+  ::MultiByteToWideChar(CP_ACP, 0, mb, -1, &w[0], n);
+}
+
+static
+void wideCharToMultiByte(const wchar_t *w, String<char> &mb)
+{
+  int n = ::WideCharToMultiByte(CP_ACP, 0, w, -1, 0, 0, 0, 0);
+  mb.resize(n);
+  ::WideCharToMultiByte(CP_ACP, 0, w, -1, &mb[0], n, 0, 0);
+}
+
+static
+const wchar_t *makeAbsolute(const wchar_t *filename, StringC &fbuf)
+{
+  {
+    fbuf.resize(128);
+    Char *tem;
+    int n = GetFullPathNameW(filename, fbuf.size(), &fbuf[0], &tem);
+    if (n > fbuf.size()) {
+      fbuf.resize(n);
+      n = GetFullPathNameW(filename, fbuf.size(), &fbuf[0], &tem);
+    }
+    if (n) {
+      fbuf.resize(n + 1);
+      return fbuf.data();
+    }
+  }
+  {
+    String<char> mb;
+    wideCharToMultiByte(filename, mb);
+    mb += 0;
+    String<char> buf;
+    buf.resize(128);
+    char *tem;
+    int n = GetFullPathNameA(mb.data(), buf.size(), &buf[0], &tem);
+    if (n > buf.size()) {
+      buf.resize(n);
+      n = GetFullPathNameA(mb.data(), buf.size(), &buf[0], &tem);
+    }
+    if (n) {
+      buf.resize(n + 1);
+      multiByteToWideChar(buf.data(), fbuf);
+      fbuf += 0;
+      return fbuf.data();
+    }
+  }
+  return filename;
+}
+
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
diff --git a/jade/RtfOle.h b/jade/RtfOle.h
new file mode 100644 (file)
index 0000000..c5a9973
--- /dev/null
@@ -0,0 +1,22 @@
+// Copyright (c) 1997 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef RtfOle_INCLUDED
+#define RtfOle_INCLUDED 1
+
+#include "dsssl_ns.h"
+#include "OutputByteStream.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+int outputObject(const wchar_t *filename,
+                const wchar_t *clsidString,
+                OutputByteStream &os);
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not RtfOle_INCLUDED */
diff --git a/jade/SgmlFOTBuilder.cxx b/jade/SgmlFOTBuilder.cxx
new file mode 100644 (file)
index 0000000..c6b6b81
--- /dev/null
@@ -0,0 +1,2329 @@
+// Copyright (c) 1996, 1997 James Clark
+// See the file copying.txt for copying permission.
+
+// Possible improvements:
+// Don't serialize ports
+// Extension flow objects
+// Merge text chunks
+// Handle input-whitespace-treatment/tabs
+// Table processing
+// When element has an ID, output both ID anchor and numeric anchor
+
+#include "config.h"
+#include "SgmlFOTBuilder.h"
+#include "macros.h"
+#include "dsssl_ns.h"
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class SgmlFOTBuilder : public SerialFOTBuilder {
+public:
+  SgmlFOTBuilder(OutputCharStream *);
+  ~SgmlFOTBuilder();
+  void setFontSize(Length);
+  void setFontFamilyName(const StringC &);
+  void setFontWeight(Symbol);
+  void setFontPosture(Symbol);
+  void setStartIndent(const LengthSpec &);
+  void setEndIndent(const LengthSpec &);
+  void setFirstLineStartIndent(const LengthSpec &);
+  void setLastLineEndIndent(const LengthSpec &);
+  void setLineSpacing(const LengthSpec &);
+  void setFieldWidth(const LengthSpec &);
+  void setPositionPointShift(const LengthSpec &);
+  void setStartMargin(const LengthSpec &);
+  void setEndMargin(const LengthSpec &);
+  void setSidelineSep(const LengthSpec &);
+  void setAsisWrapIndent(const LengthSpec &);
+  void setLineNumberSep(const LengthSpec &);
+  void setLastLineJustifyLimit(const LengthSpec &);
+  void setJustifyGlyphSpaceMaxAdd(const LengthSpec &);
+  void setJustifyGlyphSpaceMaxRemove(const LengthSpec &);
+  void setTableCornerRadius(const LengthSpec &);
+  void setBoxCornerRadius(const LengthSpec &);
+  void setMarginaliaSep(const LengthSpec &);
+  void setMinPreLineSpacing(const OptLengthSpec &);
+  void setMinPostLineSpacing(const OptLengthSpec &);
+  void setMinLeading(const OptLengthSpec &);
+  void setLines(Symbol);
+  void setQuadding(Symbol);
+  void setDisplayAlignment(Symbol sym);
+  void setFieldAlign(Symbol);
+  void setLineJoin(Symbol);
+  void setLineCap(Symbol);
+  void setLineNumberSide(Symbol);
+  void setKernMode(Symbol);
+  void setInputWhitespaceTreatment(Symbol);
+  void setFillingDirection(Symbol);
+  void setWritingMode(Symbol);
+  void setLastLineQuadding(Symbol);
+  void setMathDisplayMode(Symbol);
+  void setScriptPreAlign(Symbol);
+  void setScriptPostAlign(Symbol);
+  void setScriptMidSupAlign(Symbol);
+  void setScriptMidSubAlign(Symbol);
+  void setNumeratorAlign(Symbol);
+  void setDenominatorAlign(Symbol);
+  void setGridPositionCellType(Symbol);
+  void setGridColumnAlignment(Symbol);
+  void setGridRowAlignment(Symbol);
+  void setBoxType(Symbol);
+  void setGlyphAlignmentMode(Symbol);
+  void setBoxBorderAlignment(Symbol);
+  void setCellRowAlignment(Symbol);
+  void setBorderAlignment(Symbol);
+  void setSidelineSide(Symbol);
+  void setHyphenationKeep(Symbol);
+  void setFontStructure(Symbol);
+  void setFontProportionateWidth(Symbol);
+  void setCellCrossed(Symbol);
+  void setMarginaliaSide(Symbol);
+  void setColor(const DeviceRGBColor &);
+  void setBackgroundColor(const DeviceRGBColor &);
+  void setBackgroundColor();
+  void setPageWidth(Length);
+  void setPageHeight(Length);
+  void setLeftMargin(Length);
+  void setRightMargin(Length);
+  void setTopMargin(Length);
+  void setBottomMargin(Length);
+  void setHeaderMargin(Length);
+  void setFooterMargin(Length);
+  void setLineThickness(Length);
+  void setCellBeforeRowMargin(Length);
+  void setCellAfterRowMargin(Length);
+  void setCellBeforeColumnMargin(Length);
+  void setCellAfterColumnMargin(Length);
+  void setLineSep(Length);
+  void setBoxSizeBefore(Length);
+  void setBoxSizeAfter(Length);
+  void setLayer(long);
+  void setBackgroundLayer(long);
+  void setBorderPriority(long);
+  void setLineRepeat(long);
+  void setSpan(long);
+  void setMinLeaderRepeat(long);
+  void setHyphenationRemainCharCount(long);
+  void setHyphenationPushCharCount(long);
+  void setWidowCount(long);
+  void setOrphanCount(long);
+  void setExpandTabs(long);
+  void setHyphenationLadderCount(long);
+  void setLanguage(Letter2);
+  void setCountry(Letter2);
+  void setBackgroundTile(PublicId);
+  void setLineBreakingMethod(PublicId);
+  void setLineCompositionMethod(PublicId);
+  void setImplicitBidiMethod(PublicId);
+  void setGlyphSubstMethod(PublicId);
+  void setGlyphReorderMethod(PublicId);
+  void setHyphenationMethod(PublicId);
+  void setTableAutoWidthMethod(PublicId);
+  void setFontName(PublicId);
+  void setBorderPresent(bool);
+  void setInhibitLineBreaks(bool);
+  void setHyphenate(bool);
+  void setKern(bool);
+  void setLigature(bool);
+  void setScoreSpaces(bool);
+  void setFloatOutMarginalia(bool);
+  void setFloatOutSidelines(bool);
+  void setFloatOutLineNumbers(bool);
+  void setCellBackground(bool);
+  void setSpanWeak(bool);
+  void setIgnoreRecordEnd(bool);
+  void setNumberedLines(bool);
+  void setHangingPunct(bool);
+  void setBoxOpenEnd(bool);
+  void setTruncateLeader(bool);
+  void setAlignLeader(bool);
+  void setTablePartOmitMiddleHeader(bool);
+  void setTablePartOmitMiddleFooter(bool);
+  void setBorderOmitAtBreak(bool);
+  void setPrincipalModeSimultaneous(bool);
+  void setMarginaliaKeepWithPrevious(bool);
+  void setGridEquidistantRows(bool);
+  void setGridEquidistantColumns(bool);
+  void setEscapementSpaceBefore(const InlineSpace &);
+  void setEscapementSpaceAfter(const InlineSpace &);
+  void setGlyphSubstTable(const Vector<ConstPtr<GlyphSubstTable> > &tables);
+
+  void paragraphBreak(const ParagraphNIC &);
+  void characters(const Char *, size_t);
+  void charactersFromNode(const NodePtr &nd, const Char *s, size_t n);
+  void character(const CharacterNIC &);
+  void externalGraphic(const ExternalGraphicNIC &);
+  void rule(const RuleNIC &);
+  void alignmentPoint();
+
+  void startSimplePageSequenceSerial();
+  void endSimplePageSequenceSerial();
+  void pageNumber();
+  void startSimplePageSequenceHeaderFooter(unsigned);
+  void endSimplePageSequenceHeaderFooter(unsigned);
+  void endAllSimplePageSequenceHeaderFooter();
+  void startScroll();
+  void endScroll();
+  void startLink(const Address &);
+  void endLink();
+  void startMarginalia();
+  void endMarginalia();
+  void startMultiModeSerial(const MultiMode *);
+  void endMultiModeSerial();
+  void startMultiModeMode(const MultiMode &);
+  void endMultiModeMode();
+  void startScore(Char);
+  void startScore(const LengthSpec &);
+  void startScore(Symbol);
+  void endScore();
+  void startLeader(const LeaderNIC &);
+  void endLeader();
+  void startSideline();
+  void endSideline();
+  void startBox(const BoxNIC &);
+  void endBox();
+  void startParagraph(const ParagraphNIC &);
+  void endParagraph();
+  void startSequence();
+  void endSequence();
+  void startLineField(const LineFieldNIC &);
+  void endLineField();
+  void startDisplayGroup(const DisplayGroupNIC &);
+  void endDisplayGroup();
+
+  void startTable(const TableNIC &);
+  void endTable();
+  void tableBeforeRowBorder();
+  void tableAfterRowBorder();
+  void tableBeforeColumnBorder();
+  void tableAfterColumnBorder();
+  void tableColumn(const TableColumnNIC &);
+  void startTablePartSerial(const TablePartNIC &);
+  void endTablePartSerial();
+  void startTablePartHeader();
+  void endTablePartHeader();
+  void startTablePartFooter();
+  void endTablePartFooter();
+  void startTableRow();
+  void endTableRow();
+  void startTableCell(const TableCellNIC &);
+  void endTableCell();
+  void tableCellBeforeRowBorder();
+  void tableCellAfterRowBorder();
+  void tableCellBeforeColumnBorder();
+  void tableCellAfterColumnBorder();
+  void startMathSequence();
+  void endMathSequence();
+  void startFractionSerial();
+  void endFractionSerial();
+  void startFractionNumerator();
+  void endFractionNumerator();
+  void startFractionDenominator();
+  void endFractionDenominator();
+  void fractionBar();
+  void startUnmath();
+  void endUnmath();
+  void startSuperscript();
+  void endSuperscript();
+  void startSubscript();
+  void endSubscript();
+  void startScriptSerial();
+  void endScriptSerial();
+  void startScriptPreSup();
+  void endScriptPreSup();
+  void startScriptPreSub();
+  void endScriptPreSub();
+  void startScriptPostSup();
+  void endScriptPostSup();
+  void startScriptPostSub();
+  void endScriptPostSub();
+  void startScriptMidSup();
+  void endScriptMidSup();
+  void startScriptMidSub();
+  void endScriptMidSub();
+  void startMarkSerial();
+  void endMarkSerial();
+  void startMarkOver();
+  void endMarkOver();
+  void startMarkUnder();
+  void endMarkUnder();
+  void startFenceSerial();
+  void endFenceSerial();
+  void startFenceOpen();
+  void endFenceOpen();
+  void startFenceClose();
+  void endFenceClose();
+  void startRadicalSerial();
+  void endRadicalSerial();
+  void startRadicalDegree();
+  void endRadicalDegree();
+  void radicalRadical(const CharacterNIC &);
+  void radicalRadicalDefaulted();
+  void startMathOperatorSerial();
+  void endMathOperatorSerial();
+  void startMathOperatorOperator();
+  void endMathOperatorOperator();
+  void startMathOperatorLowerLimit();
+  void endMathOperatorLowerLimit();
+  void startMathOperatorUpperLimit();
+  void endMathOperatorUpperLimit();
+  void startGrid(const GridNIC &);
+  void endGrid();
+  void startGridCell(const GridCellNIC &);
+  void endGridCell();
+  void startNode(const NodePtr &, const StringC &);
+  void endNode();
+  void currentNodePageNumber(const NodePtr &);
+  struct Data {
+    Data(const StringC &str) : ptr(str.data()), size(str.size()) { }
+    Data(const Char *p, size_t n) : ptr(p), size(n) { }
+    const Char *ptr;
+    size_t size;
+  };
+  struct Units {
+    Units(long i) : n(i) { }
+    long n;
+  };
+private:
+  OutputCharStream &os() { return *curOs_; }
+  void outputIcs();
+  void startSimpleFlowObj(const char *name);
+  void simpleFlowObj(const char *name);
+  void startPortFlow(const char *name);
+  void endFlow(const char *name);
+  void characterNIC(const CharacterNIC &nic);
+  void displayNIC(const DisplayNIC &nic);
+  void inlineNIC(const InlineNIC &nic);
+  void boolC(const char *, bool);
+  void lengthC(const char *, Length);
+  void lengthSpecC(const char *, const LengthSpec &);
+  void optLengthSpecC(const char *, const OptLengthSpec &);
+  void symbolC(const char *name, Symbol sym);
+  void integerC(const char *, long);
+  void publicIdC(const char *, PublicId);
+  void inlineSpaceC(const char *name, const InlineSpace &);
+  void displaySpaceNIC(const char *name, const DisplaySpace &);
+  void flushPendingElements();
+  void outputElementName(unsigned long groveIndex, const Char *, size_t);
+  void outputElementName(const NodePtr &node);
+  static bool nodeIsElement(const NodePtr &node) {
+    GroveString gi;
+    return node->getGi(gi) == accessOK;
+  }
+
+  Owner<OutputCharStream> os_;
+  StrOutputCharStream ics_;
+  StrOutputCharStream hfs_;
+  OutputCharStream *curOs_;
+  Vector<PackedBoolean> multiModeHasPrincipalMode_;
+  Vector<PackedBoolean> glyphSubstTableDefined_;
+
+  Vector<NodePtr> pendingElements_;
+  Vector<unsigned> pendingElementLevels_;
+  unsigned nPendingElementsNonEmpty_;
+  unsigned nodeLevel_;
+  bool suppressAnchors_;
+  StringC hf_[nHF];
+};
+
+const char RE = '\r';
+const char quot = '"';
+const char *const trueString = "true";
+const char *const falseString = "false";
+// May change this to "null"
+const char *const nullString = "false";
+
+typedef SgmlFOTBuilder::Units Units;
+
+inline
+OutputCharStream &operator<<(OutputCharStream &os, 
+#ifdef GROVE_NAMESPACE
+                            GROVE_NAMESPACE::
+#endif
+                            GroveString &str)
+{
+  return os.write(str.data(), str.size());
+}
+
+inline
+OutputCharStream &operator<<(OutputCharStream &os, long n)
+{
+  if (n < 0)
+    return os << '-' << (unsigned long)-n;
+  else
+    return os << (unsigned long)n;
+}
+
+inline
+const char *boolString(bool b)
+{
+  return b ? trueString : falseString;
+}
+
+inline
+OutputCharStream &operator<<(OutputCharStream &os, FOTBuilder::Symbol sym)
+{
+  switch (sym) {
+  case FOTBuilder::symbolFalse:
+    os << falseString;
+    break;
+  case FOTBuilder::symbolTrue:
+    os << trueString;
+    break;
+  default:
+    os << FOTBuilder::symbolName(sym);
+    break;
+  }
+  return os;
+}
+
+inline
+OutputCharStream &operator<<(OutputCharStream &os, double d)
+{
+  char buf[128];
+  sprintf(buf, "%g", d);
+  return os << buf;
+}
+
+OutputCharStream &operator<<(OutputCharStream &os, Units u)
+{
+  char buf[32];
+  sprintf(buf, "%03d", u.n);
+  int len = strlen(buf);
+  int i = 0;
+  for (; i < 3 && buf[len - i - 1] == '0'; i++)
+    ;
+  if (i == 3) {
+    i = len - 3;
+    if (i == 0)
+      buf[i++] = '0';
+  }
+  else {
+    int j = len + 1 - i;
+    for (; i < 3; i++)
+      buf[len - i] = buf[len - i - 1];
+    buf[len - 3] = '.';
+    i = j;
+  }
+  strcpy(buf + i, "pt");
+  return os << buf;
+}
+
+inline
+OutputCharStream &operator<<(OutputCharStream &os,
+                            const FOTBuilder::LengthSpec &ls)
+{
+  if (ls.displaySizeFactor != 0.0) {
+    // 100+20%
+    if (ls.length) {
+      os << Units(ls.length);
+      if (ls.displaySizeFactor >= 0.0)
+       os << '+';
+    }
+    char buf[128];
+    sprintf(buf, "%.2f%%", ls.displaySizeFactor * 100.0);
+  }
+  else
+    os << Units(ls.length);
+  return os;
+}
+
+OutputCharStream &operator<<(OutputCharStream &os,
+                            const FOTBuilder::TableLengthSpec &ls)
+{
+  if (ls.displaySizeFactor != 0.0 || ls.tableUnitFactor != 0.0) {
+    // 100+20%
+    bool needSign = 0;
+    if (ls.length) {
+      os << Units(ls.length);
+      needSign = 1;
+    }
+    char buf[128];
+    if (ls.displaySizeFactor != 0.0) {
+      if (needSign && ls.displaySizeFactor >= 0.0)
+       os << '+';
+      sprintf(buf, "%.2f%%", ls.displaySizeFactor * 100.0);
+      needSign = 1;
+      os << buf;
+    }
+    if (ls.tableUnitFactor != 0.0) {
+      if (needSign && ls.tableUnitFactor >= 0.0)
+       os << '+';
+      sprintf(buf, "%.2f*", ls.tableUnitFactor);
+      os << buf;
+    }
+  }
+  else
+    os << Units(ls.length);
+  return os;
+}
+
+OutputCharStream &operator<<(OutputCharStream &os,
+                            SgmlFOTBuilder::Data data)
+{
+  const Char *s = data.ptr;
+  size_t n = data.size;
+  for (; n > 0; n--, s++) {
+    switch (*s) {
+    case '&':
+      os << "&amp;";
+      break;
+    case '<':
+      os << "&lt;";
+      break;
+    case '>':
+      os << "&gt;";
+      break;
+    case '"':
+      os << "&quot;";
+      break;
+    default:
+      if (*s < 0x80)
+       os.put(*s);
+      else
+       os << "&#" << (unsigned long)*s << ';';
+      break;
+    }
+  }
+  return os;
+}
+
+inline
+OutputCharStream &operator<<(OutputCharStream &os,
+                            const FOTBuilder::GlyphId &gid)
+{
+  if (gid.publicId) {
+    os << gid.publicId;
+    if (gid.suffix)
+      os << "::" << gid.suffix;
+  }
+  else
+    os << falseString;
+  return os;
+}
+
+FOTBuilder *makeSgmlFOTBuilder(OutputCharStream *os)
+{
+  return new SgmlFOTBuilder(os);
+}
+
+static
+void outputNumericCharRef(OutputCharStream &os, Char c)
+{
+  os << "&#" << (unsigned long)c << ';';
+}
+
+SgmlFOTBuilder::SgmlFOTBuilder(OutputCharStream *os)
+: os_(os),
+  curOs_(os),
+  nodeLevel_(0),
+  nPendingElementsNonEmpty_(0),
+  suppressAnchors_(0)
+{
+  os->setEscaper(outputNumericCharRef);
+  *os_ << "<?xml version=\"1.0\"?>" << RE;
+#if 0
+  *os_ << "<!DOCTYPE fot PUBLIC \"-//James Clark//DTD DSSSL Flow Object Tree//EN\">"
+       << RE;
+#endif
+  *os_ << "<fot>" << RE;
+}
+
+SgmlFOTBuilder::~SgmlFOTBuilder()
+{
+  os() << "</fot>" << RE;
+}
+
+void SgmlFOTBuilder::characters(const Char *s, size_t n)
+{
+  if (n == 0)
+    return;
+  flushPendingElements();
+  os() << "<text>" << Data(s, n) << "</text>" << RE;
+}
+
+void SgmlFOTBuilder::charactersFromNode(const NodePtr &nd, const Char *s, size_t n)
+{
+  GroveString name;
+  GroveString text;
+  NodePtr entity;
+  if (n == 1
+      && *s == 0xFFFD
+      && nd->getEntityName(name) == accessOK
+      && nd->getEntity(entity) == accessOK
+      && entity->getText(text) == accessOK)
+    os() << "<sdata name=" << quot << Data(name.data(), name.size()) << quot
+         << " text=" << quot << Data(text.data(), text.size()) << quot
+        << "/>" << RE;
+  else
+    SgmlFOTBuilder::characters(s, n);
+}
+
+void SgmlFOTBuilder::characterNIC(const CharacterNIC &nic)
+{
+  if (nic.specifiedC) {
+    if (nic.specifiedC & (1 << CharacterNIC::cChar))
+      os() << " char=" << quot << "&#" << (unsigned long)nic.ch << ";" << quot;
+    if (nic.specifiedC & (1 << CharacterNIC::cGlyphId))
+      os() << " glyph-id=" << quot << nic.glyphId << quot;
+    if (nic.specifiedC & (1 << CharacterNIC::cIsDropAfterLineBreak))
+      os() << " drop-after-line-break=" << quot << boolString(nic.isDropAfterLineBreak) << quot;
+    if (nic.specifiedC & (1 << CharacterNIC::cIsDropUnlessBeforeLineBreak))
+      os() << " drop-unless-before-line-break=" << quot << boolString(nic.isDropUnlessBeforeLineBreak) << quot;
+    if (nic.specifiedC & (1 << CharacterNIC::cIsPunct))
+      os() << " punct=" << quot << boolString(nic.isPunct) << quot;
+    if (nic.specifiedC & (1 << CharacterNIC::cIsInputWhitespace))
+      os() << " input-whitespace=" << quot << boolString(nic.isInputWhitespace) << quot;
+    if (nic.specifiedC & (1 << CharacterNIC::cIsInputTab))
+      os() << " input-tab=" << quot << boolString(nic.isInputTab) << quot;
+    if (nic.specifiedC & (1 << CharacterNIC::cIsRecordEnd))
+      os() << " record-end=" << quot << boolString(nic.isRecordEnd) << quot;
+    if (nic.specifiedC & (1 << CharacterNIC::cIsSpace))
+      os() << " space=" << quot << boolString(nic.isSpace) << quot;
+    if (nic.specifiedC & (1 << CharacterNIC::cScript)) {
+      if (nic.script)
+       os() << " script=" << quot << nic.script << quot;
+      else
+       os() << " script=" << quot << falseString << quot;
+    }
+    if (nic.specifiedC & (1 << CharacterNIC::cMathClass))
+      os() << " math-class=" << quot << nic.mathClass << quot;
+    if (nic.specifiedC & (1 << CharacterNIC::cMathFontPosture))
+      os() << " math-font-posture=" << quot << nic.mathFontPosture << quot;
+    if (nic.specifiedC & (1 << CharacterNIC::cBreakBeforePriority)) 
+      os() << " break-before-priority=" << quot << nic.breakBeforePriority << quot;
+    if (nic.specifiedC & (1 << CharacterNIC::cBreakAfterPriority))
+      os() << " break-after-priority=" << quot << nic.breakAfterPriority << quot;
+  }
+  if (nic.stretchFactor != 1.0)
+    os() << " stretch-factor=" << quot << nic.stretchFactor << quot;
+}
+
+void SgmlFOTBuilder::character(const CharacterNIC &nic)
+{
+  flushPendingElements();
+  os() << "<character";
+  characterNIC(nic);
+  outputIcs();
+  os() << RE << "/>";
+}
+
+void SgmlFOTBuilder::outputIcs()
+{
+  StringC str;
+  ics_.extractString(str);
+  os() << str;
+}
+
+void SgmlFOTBuilder::setFontSize(Length n)
+{
+  lengthC("font-size", n);
+}
+
+void SgmlFOTBuilder::setFontFamilyName(const StringC &str)
+{
+  ics_ << " font-family-name=" << quot << str << quot;
+}
+
+void SgmlFOTBuilder::setFontWeight(Symbol weight)
+{
+  symbolC("font-weight", weight);
+}
+
+void SgmlFOTBuilder::setFontPosture(Symbol posture)
+{
+  symbolC("font-posture", posture);
+}
+
+void SgmlFOTBuilder::setStartIndent(const LengthSpec &ls)
+{
+  lengthSpecC("start-indent", ls);
+}
+
+void SgmlFOTBuilder::setEndIndent(const LengthSpec &ls)
+{
+  lengthSpecC("end-indent", ls);
+}
+
+void SgmlFOTBuilder::setFirstLineStartIndent(const LengthSpec &ls)
+{
+  lengthSpecC("first-line-start-indent", ls);
+}
+
+void SgmlFOTBuilder::setLastLineEndIndent(const LengthSpec &ls)
+{
+  lengthSpecC("last-line-end-indent", ls);
+}
+
+void SgmlFOTBuilder::setLineSpacing(const LengthSpec &ls)
+{
+  lengthSpecC("line-spacing", ls);
+}
+
+void SgmlFOTBuilder::setFieldWidth(const LengthSpec &ls)
+{
+  lengthSpecC("field-width", ls);
+}
+
+void SgmlFOTBuilder::setPositionPointShift(const LengthSpec &ls)
+{
+  lengthSpecC("position-point-shift", ls);
+}
+
+void SgmlFOTBuilder::setStartMargin(const LengthSpec &ls)
+{
+  lengthSpecC("start-margin", ls);
+}
+
+void SgmlFOTBuilder::setEndMargin(const LengthSpec &ls)
+{
+  lengthSpecC("end-margin", ls);
+}
+
+void SgmlFOTBuilder::setSidelineSep(const LengthSpec &ls)
+{
+  lengthSpecC("sideline-sep", ls);
+}
+
+void SgmlFOTBuilder::setAsisWrapIndent(const LengthSpec &ls)
+{
+  lengthSpecC("asis-wrap-indent", ls);
+}
+
+void SgmlFOTBuilder::setLineNumberSep(const LengthSpec &ls)
+{
+  lengthSpecC("line-number-sep", ls);
+}
+
+void SgmlFOTBuilder::setLastLineJustifyLimit(const LengthSpec &ls)
+{
+  lengthSpecC("last-line-justify-limit", ls);
+}
+
+void SgmlFOTBuilder::setJustifyGlyphSpaceMaxAdd(const LengthSpec &ls)
+{
+  lengthSpecC("justify-glyph-space-max-add", ls);
+}
+
+void SgmlFOTBuilder::setJustifyGlyphSpaceMaxRemove(const LengthSpec &ls)
+{
+  lengthSpecC("justify-glyph-space-max-remove", ls);
+}
+
+void SgmlFOTBuilder::setTableCornerRadius(const LengthSpec &ls)
+{
+  lengthSpecC("table-corner-radius", ls);
+}
+
+void SgmlFOTBuilder::setBoxCornerRadius(const LengthSpec &ls)
+{
+  lengthSpecC("box-corner-radius", ls);
+}
+
+void SgmlFOTBuilder::setMarginaliaSep(const LengthSpec &ls)
+{
+  lengthSpecC("marginalia-sep", ls);
+}
+
+void SgmlFOTBuilder::lengthSpecC(const char *s, const LengthSpec &ls)
+{
+  ics_ << ' ' << s << '=' << quot << ls << quot;
+}
+
+void SgmlFOTBuilder::setMinPreLineSpacing(const OptLengthSpec &ols)
+{
+  optLengthSpecC("min-pre-line-spacing", ols);
+}
+
+void SgmlFOTBuilder::setMinPostLineSpacing(const OptLengthSpec &ols)
+{
+  optLengthSpecC("min-post-line-spacing", ols);
+}
+
+void SgmlFOTBuilder::setMinLeading(const OptLengthSpec &ols)
+{
+  optLengthSpecC("min-leading", ols);
+}
+
+void SgmlFOTBuilder::optLengthSpecC(const char *s, const OptLengthSpec &ols)
+{
+  if (ols.hasLength)
+    lengthSpecC(s, ols.length);
+  else
+    ics_ << ' ' << s << quot << falseString << quot;
+}
+
+void SgmlFOTBuilder::setLines(Symbol sym)
+{
+  symbolC("lines", sym);
+}
+
+void SgmlFOTBuilder::setQuadding(Symbol sym)
+{
+  symbolC("quadding", sym);
+}
+
+void SgmlFOTBuilder::setDisplayAlignment(Symbol sym)
+{
+  symbolC("display-alignment", sym);
+}
+
+void SgmlFOTBuilder::setFieldAlign(Symbol sym)
+{
+  symbolC("field-align", sym);
+}
+
+void SgmlFOTBuilder::setLineJoin(Symbol sym)
+{
+  symbolC("line-join", sym);
+}
+
+void SgmlFOTBuilder::setLineCap(Symbol sym)
+{
+  symbolC("line-cap", sym);
+}
+
+void SgmlFOTBuilder::setLineNumberSide(Symbol sym)
+{
+  symbolC("line-number-side", sym);
+}
+
+void SgmlFOTBuilder::setKernMode(Symbol sym)
+{
+  symbolC("kern-mode", sym);
+}
+
+void SgmlFOTBuilder::setInputWhitespaceTreatment(Symbol sym)
+{
+  symbolC("input-whitespace-treatment", sym);
+}
+
+void SgmlFOTBuilder::setFillingDirection(Symbol sym)
+{
+  symbolC("filling-direction", sym);
+}
+
+void SgmlFOTBuilder::setWritingMode(Symbol sym)
+{
+  symbolC("writing-mode", sym);
+}
+
+void SgmlFOTBuilder::setLastLineQuadding(Symbol sym)
+{
+  symbolC("last-line-quadding", sym);
+}
+
+void SgmlFOTBuilder::setMathDisplayMode(Symbol sym)
+{
+  symbolC("math-display-mode", sym);
+}
+
+void SgmlFOTBuilder::setScriptPreAlign(Symbol sym)
+{
+  symbolC("script-pre-align", sym);
+}
+
+void SgmlFOTBuilder::setScriptPostAlign(Symbol sym)
+{
+  symbolC("script-post-align", sym);
+}
+
+void SgmlFOTBuilder::setScriptMidSupAlign(Symbol sym)
+{
+  symbolC("script-mid-sup-align", sym);
+}
+
+void SgmlFOTBuilder::setScriptMidSubAlign(Symbol sym)
+{
+  symbolC("script-mid-sub-align", sym);
+}
+
+void SgmlFOTBuilder::setNumeratorAlign(Symbol sym)
+{
+  symbolC("numerator-align", sym);
+}
+
+void SgmlFOTBuilder::setDenominatorAlign(Symbol sym)
+{
+  symbolC("denominator-align", sym);
+}
+
+void SgmlFOTBuilder::setGridPositionCellType(Symbol sym)
+{
+  symbolC("grid-position-cell-type", sym);
+}
+
+void SgmlFOTBuilder::setGridColumnAlignment(Symbol sym)
+{
+  symbolC("grid-column-alignment", sym);
+}
+
+void SgmlFOTBuilder::setGridRowAlignment(Symbol sym)
+{
+  symbolC("grid-row-alignment", sym);
+}
+
+void SgmlFOTBuilder::setBoxType(Symbol sym)
+{
+  symbolC("box-type", sym);
+}
+
+void SgmlFOTBuilder::setGlyphAlignmentMode(Symbol sym)
+{
+  symbolC("glyph-alignment-mode", sym);
+}
+
+void SgmlFOTBuilder::setBoxBorderAlignment(Symbol sym)
+{
+  symbolC("box-border-alignment", sym);
+}
+
+void SgmlFOTBuilder::setCellRowAlignment(Symbol sym)
+{
+  symbolC("cell-row-alignment", sym);
+}
+
+void SgmlFOTBuilder::setBorderAlignment(Symbol sym)
+{
+  symbolC("border-alignment", sym);
+}
+
+void SgmlFOTBuilder::setSidelineSide(Symbol sym)
+{
+  symbolC("sideline-side", sym);
+}
+
+void SgmlFOTBuilder::setHyphenationKeep(Symbol sym)
+{
+  symbolC("hyphenation-keep", sym);
+}
+
+void SgmlFOTBuilder::setFontStructure(Symbol sym)
+{
+  symbolC("font-structure", sym);
+}
+
+void SgmlFOTBuilder::setFontProportionateWidth(Symbol sym)
+{
+  symbolC("font-proportionate-width", sym);
+}
+
+void SgmlFOTBuilder::setCellCrossed(Symbol sym)
+{
+  symbolC("cell-crossed", sym);
+}
+
+void SgmlFOTBuilder::setMarginaliaSide(Symbol sym)
+{
+  symbolC("marginalia-side", sym);
+}
+
+void SgmlFOTBuilder::symbolC(const char *name, Symbol sym)
+{
+  ics_ << ' ' << name << '=' << quot << sym << quot;
+}
+
+inline
+void hex2(OutputCharStream &os, unsigned char c)
+{
+  static const char hexDigits[] = "0123456789ABCDEF";
+  os << hexDigits[c >> 4] << hexDigits[c & 0xF];
+}
+
+inline
+OutputCharStream &operator<<(OutputCharStream &os, const FOTBuilder::DeviceRGBColor &color)
+{
+  os << '#';
+  hex2(os, color.red);
+  hex2(os, color.green);
+  hex2(os, color.blue);
+  return os;
+}
+
+void SgmlFOTBuilder::setColor(const DeviceRGBColor &color)
+{
+  ics_ << " color=" << quot << color << quot;
+}
+
+void SgmlFOTBuilder::setBackgroundColor()
+{
+  ics_ << " background-color=" << quot << falseString << quot;
+}
+
+void SgmlFOTBuilder::setBackgroundColor(const DeviceRGBColor &color)
+{
+  ics_ << " background-color=" << quot << color << quot;
+}
+
+void SgmlFOTBuilder::setPageWidth(Length units)
+{
+  lengthC("page-width", units);
+}
+
+void SgmlFOTBuilder::setPageHeight(Length units)
+{
+  lengthC("page-height", units);
+}
+
+void SgmlFOTBuilder::setLeftMargin(Length units)
+{
+  lengthC("left-margin", units);
+}
+
+void SgmlFOTBuilder::setRightMargin(Length units)
+{
+  lengthC("right-margin", units);
+}
+
+void SgmlFOTBuilder::setTopMargin(Length units)
+{
+  lengthC("top-margin", units);
+}
+
+void SgmlFOTBuilder::setBottomMargin(Length units)
+{
+  lengthC("bottom-margin", units);
+}
+
+void SgmlFOTBuilder::setHeaderMargin(Length units)
+{
+  lengthC("header-margin", units);
+}
+
+void SgmlFOTBuilder::setFooterMargin(Length units)
+{
+  lengthC("footer-margin", units);
+}
+
+void SgmlFOTBuilder::setLineThickness(Length units)
+{
+  lengthC("line-thickness", units);
+}
+
+void SgmlFOTBuilder::setCellBeforeRowMargin(Length units)
+{
+  lengthC("cell-before-row-margin", units);
+}
+
+void SgmlFOTBuilder::setCellAfterRowMargin(Length units)
+{
+  lengthC("cell-after-row-margin", units);
+}
+
+void SgmlFOTBuilder::setCellBeforeColumnMargin(Length units)
+{
+  lengthC("cell-before-column-margin", units);
+}
+
+void SgmlFOTBuilder::setCellAfterColumnMargin(Length units)
+{
+  lengthC("cell-after-column-margin", units);
+}
+
+void SgmlFOTBuilder::setLineSep(Length units)
+{
+  lengthC("line-sep", units);
+}
+
+void SgmlFOTBuilder::setBoxSizeBefore(Length units)
+{
+  lengthC("box-size-before", units);
+}
+
+void SgmlFOTBuilder::setBoxSizeAfter(Length units)
+{
+  lengthC("box-size-after", units);
+}
+
+void SgmlFOTBuilder::lengthC(const char *s, Length units)
+{
+  ics_ << ' ' << s << '=' << quot << Units(units) << quot;
+}
+
+void SgmlFOTBuilder::setLayer(long n)
+{
+  integerC("layer", n);
+}
+
+void SgmlFOTBuilder::setBackgroundLayer(long n)
+{
+  integerC("background-layer", n);
+}
+
+void SgmlFOTBuilder::setBorderPriority(long n)
+{
+  integerC("border-priority", n);
+}
+
+void SgmlFOTBuilder::setLineRepeat(long n)
+{
+  integerC("line-repeat", n);
+}
+
+void SgmlFOTBuilder::setSpan(long n)
+{
+  integerC("span", n);
+}
+
+void SgmlFOTBuilder::setMinLeaderRepeat(long n)
+{
+  integerC("min-leader-repeat", n);
+}
+
+void SgmlFOTBuilder::setHyphenationRemainCharCount(long n)
+{
+  integerC("hyphenation-remain-char-count", n);
+}
+
+void SgmlFOTBuilder::setHyphenationPushCharCount(long n)
+{
+  integerC("hyphenation-push-char-count", n);
+}
+
+void SgmlFOTBuilder::setWidowCount(long n)
+{
+  integerC("widow-count", n);
+}
+
+void SgmlFOTBuilder::setOrphanCount(long n)
+{
+  integerC("orphan-count", n);
+}
+
+void SgmlFOTBuilder::integerC(const char *s, long n)
+{
+  ics_ << ' ' << s << '=' << quot << n << quot;
+}
+
+void SgmlFOTBuilder::setExpandTabs(long n)
+{
+  integerC("expand-tabs", n);
+}
+
+void SgmlFOTBuilder::setHyphenationLadderCount(long n)
+{
+  integerC("hyphenation-ladder-count", n);
+}
+
+void SgmlFOTBuilder::setCountry(Letter2 code)
+{
+  ics_ << " country=" << quot;
+  if (code)
+    ics_ << char((code >> 8) & 0xff) << char(code & 0xff);
+  else
+    ics_ << falseString;
+  ics_ << quot;
+}
+
+void SgmlFOTBuilder::setLanguage(Letter2 code)
+{
+  ics_ << " language=" << quot;
+  if (code)
+    ics_ << char((code >> 8) & 0xff) << char(code & 0xff);
+  else
+    ics_ << falseString;
+  ics_ << quot;
+}
+
+void SgmlFOTBuilder::setBackgroundTile(PublicId pubid)
+{
+  publicIdC("background-tile", pubid);
+}
+
+void SgmlFOTBuilder::setLineBreakingMethod(PublicId pubid)
+{
+  publicIdC("line-breaking-method", pubid);
+}
+
+void SgmlFOTBuilder::setLineCompositionMethod(PublicId pubid)
+{
+  publicIdC("line-composition-method", pubid);
+}
+
+void SgmlFOTBuilder::setImplicitBidiMethod(PublicId pubid)
+{
+  publicIdC("implicit-bidi-method", pubid);
+}
+
+void SgmlFOTBuilder::setGlyphSubstMethod(PublicId pubid)
+{
+  publicIdC("glyph-subst-method", pubid);
+}
+
+void SgmlFOTBuilder::setGlyphReorderMethod(PublicId pubid)
+{
+  publicIdC("glyph-reorder-method", pubid);
+}
+
+void SgmlFOTBuilder::setHyphenationMethod(PublicId pubid)
+{
+  publicIdC("hyphenation-method", pubid);
+}
+
+void SgmlFOTBuilder::setTableAutoWidthMethod(PublicId pubid)
+{
+  publicIdC("table-auto-width-method", pubid);
+}
+
+void SgmlFOTBuilder::setFontName(PublicId pubid)
+{
+  publicIdC("font-name", pubid);
+}
+
+void SgmlFOTBuilder::publicIdC(const char *s, PublicId pubid)
+{
+  ics_ << ' ' << s << '=' << quot;
+  if (pubid)
+    ics_ << pubid;
+  else
+    ics_ << falseString;
+  ics_ << quot;
+}
+
+void SgmlFOTBuilder::setBorderPresent(bool b)
+{
+  boolC("border-present", b);
+}
+
+void SgmlFOTBuilder::setInhibitLineBreaks(bool b)
+{
+  boolC("border-present", b);
+}
+
+void SgmlFOTBuilder::setHyphenate(bool b)
+{
+  boolC("hyphenate", b);
+}
+
+void SgmlFOTBuilder::setKern(bool b)
+{
+  boolC("kern", b);
+}
+
+void SgmlFOTBuilder::setLigature(bool b)
+{
+  boolC("ligature", b);
+}
+
+void SgmlFOTBuilder::setScoreSpaces(bool b)
+{
+  boolC("score-spaces", b);
+}
+
+void SgmlFOTBuilder::setFloatOutMarginalia(bool b)
+{
+  boolC("float-out-marginalia", b);
+}
+
+void SgmlFOTBuilder::setFloatOutSidelines(bool b)
+{
+  boolC("float-out-sidelines", b);
+}
+
+void SgmlFOTBuilder::setFloatOutLineNumbers(bool b)
+{
+  boolC("float-out-line-numbers", b);
+}
+
+void SgmlFOTBuilder::setCellBackground(bool b)
+{
+  boolC("cell-background", b);
+}
+
+void SgmlFOTBuilder::setSpanWeak(bool b)
+{
+  boolC("span-weak", b);
+}
+
+void SgmlFOTBuilder::setIgnoreRecordEnd(bool b)
+{
+  boolC("ignore-record-end", b);
+}
+
+void SgmlFOTBuilder::setNumberedLines(bool b)
+{
+  boolC("numbered-lines", b);
+}
+
+void SgmlFOTBuilder::setHangingPunct(bool b)
+{
+  boolC("hanging-punct", b);
+}
+
+void SgmlFOTBuilder::setBoxOpenEnd(bool b)
+{
+  boolC("box-open-end", b);
+}
+
+void SgmlFOTBuilder::setTruncateLeader(bool b)
+{
+  boolC("truncate-leader", b);
+}
+
+void SgmlFOTBuilder::setAlignLeader(bool b)
+{
+  boolC("align-leader", b);
+}
+
+void SgmlFOTBuilder::setTablePartOmitMiddleHeader(bool b)
+{
+  boolC("table-part-omit-middle-header", b);
+}
+
+void SgmlFOTBuilder::setTablePartOmitMiddleFooter(bool b)
+{
+  boolC("table-part-omit-middle-footer", b);
+}
+
+void SgmlFOTBuilder::setBorderOmitAtBreak(bool b)
+{
+  boolC("border-omit-at-break", b);
+}
+
+void SgmlFOTBuilder::setPrincipalModeSimultaneous(bool b)
+{
+  boolC("principal-mode-simultaneous", b);
+}
+
+void SgmlFOTBuilder::setMarginaliaKeepWithPrevious(bool b)
+{
+  boolC("marginalia-keep-with-previous", b);
+}
+
+void SgmlFOTBuilder::setGridEquidistantRows(bool b)
+{
+  boolC("grid-equidistant-rows", b);
+}
+
+void SgmlFOTBuilder::setGridEquidistantColumns(bool b)
+{
+  boolC("grid-equidistant-columns", b);
+}
+
+void SgmlFOTBuilder::boolC(const char *s, bool b)
+{
+  ics_ << ' ' << s << '=' << quot << boolString(b) << quot;
+}
+
+void SgmlFOTBuilder::setEscapementSpaceBefore(const InlineSpace &is)
+{
+  inlineSpaceC("escapement-space-before", is);
+}
+
+void SgmlFOTBuilder::setEscapementSpaceAfter(const InlineSpace &is)
+{
+  inlineSpaceC("escapement-space-after", is);
+}
+
+void SgmlFOTBuilder::setGlyphSubstTable(const Vector<ConstPtr<GlyphSubstTable> > &tables)
+{
+  if (tables.size() == 0) {
+    ics_ << " glyph-subst-table=" << quot << quot;
+    return;
+  }
+  static const char idPrefix[] = "gst";
+  ics_ << " glyph-subst-table=" << quot;
+  for (size_t i = 0; i < tables.size(); i++) {
+    unsigned long n = tables[i]->uniqueId;
+    if (n >= glyphSubstTableDefined_.size()) {
+      for (size_t j = glyphSubstTableDefined_.size(); j < n + 1; j++)
+       glyphSubstTableDefined_.push_back(0);
+    }
+    if (!glyphSubstTableDefined_[n]) {
+      glyphSubstTableDefined_[n] = 1;
+      os() << "<define-glyph-subst-table id=" << quot << idPrefix << n << quot << '>' << RE;
+      const Vector<GlyphId> &pairs = tables[i]->pairs;
+      for (size_t i = 0; i < pairs.size(); i += 2)
+       os() << "<glyph-subst old=" << quot << pairs[i] << quot
+            << " new=" << quot << pairs[i + 1] << quot << "/>" << RE;
+      os() << "</define-glyph-subst-table>";
+    }
+    if (i > 0)
+      ics_ << ' ';
+    ics_ << idPrefix << n;
+  }
+  ics_ << quot;
+}
+
+void SgmlFOTBuilder::inlineSpaceC(const char *s, const InlineSpace &is)
+{
+  if (is.nominal || is.min || is.max) {
+    ics_ << ' ' << s << '=' << quot << is.nominal;
+    if (is.min.length != is.nominal.length
+        || is.min.displaySizeFactor != is.nominal.displaySizeFactor
+       || is.max.length != is.nominal.length
+        || is.max.displaySizeFactor != is.nominal.displaySizeFactor)
+      ics_ << ',' << is.min << ',' << is.max;
+  }
+}
+
+void SgmlFOTBuilder::displayNIC(const DisplayNIC &nic)
+{
+  if (nic.keepWithPrevious)
+    os() << " keep-with-previous=" << quot << trueString << quot;
+  if (nic.keepWithNext)
+    os() << " keep-with-next=" << quot << trueString << quot;
+  if (nic.mayViolateKeepBefore)
+    os() << " may-violate-keep-before=" << quot << trueString << quot;
+  if (nic.mayViolateKeepAfter)
+    os() << " may-violate-keep-after=" << quot << trueString << quot;
+  if (nic.positionPreference != symbolFalse)
+    os() << " position-preference=" << quot << nic.positionPreference << quot;
+  if (nic.keep != symbolFalse)
+    os() << " keep=" << quot << nic.keep << quot;
+  if (nic.breakBefore != symbolFalse)
+    os() << " break-before=" << quot << nic.breakBefore << quot;
+  if (nic.breakAfter != symbolFalse)
+    os() << " break-after=" << quot << nic.breakAfter << quot;
+  displaySpaceNIC("space-before", nic.spaceBefore);
+  displaySpaceNIC("space-after", nic.spaceAfter);
+}
+
+void SgmlFOTBuilder::displaySpaceNIC(const char *s, const DisplaySpace &ds)
+{
+  if (ds.nominal || ds.min || ds.max) {
+    os() << ' ' << s << '=' << quot << ds.nominal;
+    if (ds.min.length != ds.nominal.length
+        || ds.min.displaySizeFactor != ds.nominal.displaySizeFactor
+        || ds.max.length != ds.nominal.length
+        || ds.max.displaySizeFactor != ds.nominal.displaySizeFactor)
+      os() << ',' << ds.min << ',' << ds.max;
+    os() << quot;
+  }
+  if (ds.force)
+    os() << ' ' << s << "-priority=" << quot << "force" << quot;
+  else if (ds.priority)
+    os() << ' ' << s << "-priority=" << quot << ds.priority << quot;
+  if (!ds.conditional)
+    os() << ' ' << s << "-conditional=" << quot << falseString << quot;
+}
+
+void SgmlFOTBuilder::inlineNIC(const InlineNIC &nic)
+{
+  if (nic.breakBeforePriority)
+    os() << " break-before-priority=" << quot << nic.breakBeforePriority << quot;
+  if (nic.breakAfterPriority)
+    os() << " break-after-priority=" << quot << nic.breakAfterPriority << quot;
+}
+
+void SgmlFOTBuilder::startParagraph(const ParagraphNIC &nic)
+{
+  os() << "<paragraph";
+  displayNIC(nic);
+  outputIcs();
+  os() << ">" << RE;
+}
+
+void SgmlFOTBuilder::endParagraph()
+{
+  endFlow("paragraph");
+}
+
+void SgmlFOTBuilder::paragraphBreak(const ParagraphNIC &nic)
+{
+  os() << "<paragraph-break";
+  displayNIC(nic);
+  outputIcs();
+  os() << "/>" << RE;
+}
+
+void SgmlFOTBuilder::startDisplayGroup(const DisplayGroupNIC &nic)
+{
+  os() << "<display-group";
+  if (nic.hasCoalesceId)
+    os() << " coalesce-id=" << quot << Data(nic.coalesceId) << quot;
+  displayNIC(nic);
+  outputIcs();
+  os() << ">" << RE;
+}
+
+void SgmlFOTBuilder::endDisplayGroup()
+{
+  endFlow("display-group");
+}
+
+void SgmlFOTBuilder::simpleFlowObj(const char *name)
+{
+  os() << '<' << name;
+  outputIcs();
+  os() << "/>" << RE;
+}
+
+void SgmlFOTBuilder::startSimpleFlowObj(const char *name)
+{
+  os() << '<' << name;
+  outputIcs();
+  os() << ">" << RE;
+}
+
+void SgmlFOTBuilder::startPortFlow(const char *name)
+{
+  os() << "<" << name << ">" << RE;
+}
+
+void SgmlFOTBuilder::endFlow(const char *name)
+{
+  os() << "</" << name << ">" << RE;
+}
+
+void SgmlFOTBuilder::startSequence()
+{
+  startSimpleFlowObj("sequence");
+}
+void SgmlFOTBuilder::endSequence()
+{
+  endFlow("sequence");
+}
+
+void SgmlFOTBuilder::startLineField(const LineFieldNIC &)
+{
+  flushPendingElements();
+  startSimpleFlowObj("line-field");
+}
+void SgmlFOTBuilder::endLineField()
+{
+  endFlow("line-field");
+}
+
+void SgmlFOTBuilder::startScroll()
+{
+  startSimpleFlowObj("scroll");
+}
+
+void SgmlFOTBuilder::endScroll()
+{
+  endFlow("scroll");
+}
+
+void SgmlFOTBuilder::startLink(const Address &addr)
+{
+  os() << "<link";
+  outputIcs();
+  switch (addr.type) {
+  case Address::sgmlDocument:
+    // FIXME
+    break;
+  case Address::resolvedNode:
+    if (!nodeIsElement(addr.node))
+      break;
+    os() << " destination=" << quot;
+    outputElementName(addr.node);
+    os() << quot;
+    break;
+  case Address::idref:
+    os() << " destination=" << quot;
+    outputElementName(addr.node->groveIndex(), addr.params[0].data(), addr.params[0].size());
+    os() << quot;
+    break;
+  case Address::entity:
+    // FIXME
+    break;
+  default:
+    break;
+  }
+  os() << '>' << RE;
+}
+
+void SgmlFOTBuilder::endLink()
+{
+  endFlow("link");
+}
+
+void SgmlFOTBuilder::startMarginalia()
+{
+  startSimpleFlowObj("marginalia");
+}
+
+void SgmlFOTBuilder::endMarginalia()
+{
+  endFlow("marginalia");
+}
+
+void SgmlFOTBuilder::startMultiModeSerial(const MultiMode *principalMode)
+{
+  startSimpleFlowObj("multi-mode");
+  if (principalMode) {
+    os() << "<multi-mode.mode";
+    if (principalMode->hasDesc)
+      os() << " desc=" << quot << Data(principalMode->desc) << quot;
+    os() << '>' << RE;
+  }
+  multiModeHasPrincipalMode_.push_back(principalMode != 0);
+}
+
+void SgmlFOTBuilder::endMultiModeSerial()
+{
+  if (multiModeHasPrincipalMode_.back())
+    endFlow("multi-mode.mode");
+  multiModeHasPrincipalMode_.resize(multiModeHasPrincipalMode_.size() - 1);
+  endFlow("multi-mode");
+}
+
+void SgmlFOTBuilder::startMultiModeMode(const MultiMode &mode)
+{
+  if (multiModeHasPrincipalMode_.back()) {
+    endFlow("multi-mode.mode");
+    multiModeHasPrincipalMode_.back() = 0;
+  }
+  os() << "<multi-mode.mode name=" << quot << Data(mode.name) << quot;
+  if (mode.hasDesc)
+    os() << " desc=" << quot << Data(mode.desc) << quot;
+  os () << '>' << RE;
+}
+
+void SgmlFOTBuilder::endMultiModeMode()
+{
+  endFlow("multi-mode.mode");
+}
+
+void SgmlFOTBuilder::startScore(Symbol type)
+{
+  const char *s = symbolName(type);
+  if (s) {
+    os() << "<score type=" << quot << s << quot;
+    outputIcs();
+    os() << '>' << RE;
+  }
+}
+
+void SgmlFOTBuilder::startScore(const LengthSpec &ls)
+{
+  os() << "<score type=" << quot << ls << quot;
+  outputIcs();
+  os() << '>' << RE;
+}
+
+void SgmlFOTBuilder::startScore(Char c)
+{
+  os() << "<score type=\"char\" char=" << quot;
+  os().put(c);
+  os() << quot;
+  outputIcs();
+  os() << '>' << RE;
+}
+
+void SgmlFOTBuilder::endScore()
+{
+  endFlow("score");
+}
+
+void SgmlFOTBuilder::startSimplePageSequenceSerial()
+{
+  startSimpleFlowObj("simple-page-sequence");
+  suppressAnchors_ = 1;
+  curOs_ = &hfs_;
+}
+void SgmlFOTBuilder::endSimplePageSequenceSerial()
+{
+  endFlow("simple-page-sequence");
+}
+
+void SgmlFOTBuilder::startSimplePageSequenceHeaderFooter(unsigned flags)
+{
+}
+
+void SgmlFOTBuilder::endSimplePageSequenceHeaderFooter(unsigned flags)
+{
+  hfs_.extractString(hf_[flags]);
+}
+
+void SgmlFOTBuilder::endAllSimplePageSequenceHeaderFooter()
+{
+  curOs_ = os_.pointer();
+  suppressAnchors_ = 0;
+  for (int i = 0; i < nHF; i += nHF/6) {
+    int front;
+    if (hf_[i + (firstHF|frontHF)] != hf_[i + (firstHF|backHF)]
+        || hf_[i + (otherHF|frontHF)] != hf_[i + (otherHF|backHF)])
+      front = frontHF;
+    else
+      front = 0;
+    int first;
+    if (hf_[i + (firstHF|frontHF)] != hf_[i + (otherHF|frontHF)]
+        || hf_[i + (firstHF|backHF)] != hf_[i + (otherHF|backHF)])
+      first = firstHF;
+    else
+      first = 0;
+    for (int j = 0; j <= front; j += frontHF) {
+      for (int k = 0; k <= first; k += firstHF) {
+       const StringC &str = hf_[i + j + k];
+       if (str.size() != 0) {
+         const char *side;
+         if (i & centerHF)
+           side = "center";
+         else if (i & rightHF)
+           side = "right";
+         else
+           side = "left";
+         const char *hf = (i & headerHF) ? "header" : "footer";
+         os() << "<simple-page-sequence." << side << '-' << hf;
+         if (front)
+           os() << " front=" << quot << boolString(j != 0) << quot;
+         if (first)
+           os() << " first=" << quot << boolString(k != 0) << quot;
+         os() << '>' << RE;
+         os() << str << "</simple-page-sequence." << side << '-' << hf << '>' << RE;
+       }
+      }
+    }
+  }
+
+}
+
+void SgmlFOTBuilder::pageNumber()
+{
+  os() << "<page-number/>" << RE;
+}
+
+void SgmlFOTBuilder::startMathSequence()
+{
+  startSimpleFlowObj("math-sequence");
+}
+
+void SgmlFOTBuilder::endMathSequence()
+{
+  endFlow("math-sequence");
+}
+
+void SgmlFOTBuilder::startFractionSerial()
+{
+  startSimpleFlowObj("fraction");
+}
+
+void SgmlFOTBuilder::endFractionSerial()
+{
+  endFlow("fraction");
+}
+
+void SgmlFOTBuilder::startFractionNumerator()
+{
+  startPortFlow("fraction.numerator");
+}
+
+void SgmlFOTBuilder::endFractionNumerator()
+{
+  endFlow("fraction.numerator");
+}
+
+void SgmlFOTBuilder::startFractionDenominator()
+{
+  startPortFlow("fraction.denominator");
+}
+
+void SgmlFOTBuilder::endFractionDenominator()
+{
+  endFlow("fraction.denominator");
+}
+
+void SgmlFOTBuilder::fractionBar()
+{
+  simpleFlowObj("fraction.fraction-bar");
+}
+
+void SgmlFOTBuilder::startUnmath()
+{
+  startSimpleFlowObj("unmath");
+}
+
+void SgmlFOTBuilder::endUnmath()
+{
+  endFlow("unmath");
+}
+
+void SgmlFOTBuilder::startSuperscript()
+{
+  startSimpleFlowObj("superscript");
+}
+
+void SgmlFOTBuilder::endSuperscript()
+{
+  endFlow("superscript");
+}
+
+void SgmlFOTBuilder::startSubscript()
+{
+  startSimpleFlowObj("subscript");
+}
+
+void SgmlFOTBuilder::endSubscript()
+{
+  endFlow("subscript");
+}
+
+void SgmlFOTBuilder::startScriptSerial()
+{
+  startSimpleFlowObj("script");
+  startPortFlow("script.principal");
+}
+
+void SgmlFOTBuilder::endScriptSerial()
+{
+  endFlow("script");
+}
+
+void SgmlFOTBuilder::startScriptPreSup()
+{
+  endFlow("script.principal");
+  startPortFlow("script.pre-sup");
+}
+
+void SgmlFOTBuilder::endScriptPreSup()
+{
+  endFlow("script.pre-sup");
+}
+
+void SgmlFOTBuilder::startScriptPreSub()
+{
+  startPortFlow("script.pre-sub");
+}
+
+void SgmlFOTBuilder::endScriptPreSub()
+{
+  endFlow("script.pre-sub");
+}
+
+void SgmlFOTBuilder::startScriptPostSup()
+{
+  startPortFlow("script.post-sup");
+}
+
+void SgmlFOTBuilder::endScriptPostSup()
+{
+  endFlow("script.post-sup");
+}
+
+void SgmlFOTBuilder::startScriptPostSub()
+{
+  startPortFlow("script.post-sub");
+}
+
+void SgmlFOTBuilder::endScriptPostSub()
+{
+  endFlow("script.post-sub");
+}
+
+void SgmlFOTBuilder::startScriptMidSup()
+{
+  startPortFlow("script.mid-sup");
+}
+
+void SgmlFOTBuilder::endScriptMidSup()
+{
+  endFlow("script.mid-sup");
+}
+
+void SgmlFOTBuilder::startScriptMidSub()
+{
+  startPortFlow("script.mid-sub");
+}
+
+void SgmlFOTBuilder::endScriptMidSub()
+{
+  endFlow("script.mid-sub");
+}
+
+void SgmlFOTBuilder::startMarkSerial()
+{
+  startSimpleFlowObj("mark");
+  startPortFlow("mark.principal");
+}
+
+void SgmlFOTBuilder::endMarkSerial()
+{
+  endFlow("mark");
+}
+
+void SgmlFOTBuilder::startMarkOver()
+{
+  endFlow("mark.principal");
+  startPortFlow("mark.over-mark");
+}
+
+void SgmlFOTBuilder::endMarkOver()
+{
+  endFlow("mark.over-mark");
+}
+
+void SgmlFOTBuilder::startMarkUnder()
+{
+  startPortFlow("mark.under-mark");
+}
+
+void SgmlFOTBuilder::endMarkUnder()
+{
+  endFlow("mark.under-mark");
+}
+
+void SgmlFOTBuilder::startFenceSerial()
+{
+  startSimpleFlowObj("fence");
+  startPortFlow("fence.principal");
+}
+
+void SgmlFOTBuilder::endFenceSerial()
+{
+  endFlow("fence");
+}
+
+void SgmlFOTBuilder::startFenceOpen()
+{
+  endFlow("fence.principal");
+  startPortFlow("fence.open");
+}
+
+void SgmlFOTBuilder::endFenceOpen()
+{
+  endFlow("fence.open");
+}
+
+void SgmlFOTBuilder::startFenceClose()
+{
+  startPortFlow("fence.close");
+}
+
+void SgmlFOTBuilder::endFenceClose()
+{
+  endFlow("fence.close");
+}
+
+void SgmlFOTBuilder::startRadicalSerial()
+{
+  startSimpleFlowObj("radical");
+}
+
+void SgmlFOTBuilder::endRadicalSerial()
+{
+  endFlow("radical");
+}
+
+void SgmlFOTBuilder::startRadicalDegree()
+{
+  endFlow("radical.principal");
+  startPortFlow("radical.degree");
+}
+
+void SgmlFOTBuilder::endRadicalDegree()
+{
+  endFlow("radical.degree");
+}
+
+void SgmlFOTBuilder::radicalRadical(const CharacterNIC &nic)
+{
+  os() << "<radical.radical";
+  characterNIC(nic);
+  outputIcs();
+  os() << "/>" << RE;
+  startPortFlow("radical.principal");
+}
+
+void SgmlFOTBuilder::radicalRadicalDefaulted()
+{
+  startPortFlow("radical.principal");
+}
+
+void SgmlFOTBuilder::startMathOperatorSerial()
+{
+  startSimpleFlowObj("math-operator");
+  startPortFlow("math-operator.principal");
+}
+
+void SgmlFOTBuilder::endMathOperatorSerial()
+{
+  endFlow("math-operator");
+}
+
+void SgmlFOTBuilder::startMathOperatorOperator()
+{
+  endFlow("math-operator.principal");
+  startPortFlow("math-operator.operator");
+}
+
+void SgmlFOTBuilder::endMathOperatorOperator()
+{
+  endFlow("math-operator.operator");
+}
+
+void SgmlFOTBuilder::startMathOperatorLowerLimit()
+{
+  startPortFlow("math-operator.lower-limit");
+}
+
+void SgmlFOTBuilder::endMathOperatorLowerLimit()
+{
+  endFlow("math-operator.lower-limit");
+}
+
+void SgmlFOTBuilder::startMathOperatorUpperLimit()
+{
+  startPortFlow("math-operator.upper-limit");
+}
+
+void SgmlFOTBuilder::endMathOperatorUpperLimit()
+{
+  endFlow("math-operator.upper-limit");
+}
+
+void SgmlFOTBuilder::startGrid(const GridNIC &nic)
+{
+  os() << "<grid";
+  if (nic.nColumns)
+    os() << " grid-n-columns=" << quot << (unsigned long)nic.nColumns << quot;
+  if (nic.nRows)
+    os() << " grid-n-rows=" << quot << (unsigned long)nic.nRows << quot;
+  outputIcs();
+  os() << '>' << RE;
+}
+
+void SgmlFOTBuilder::endGrid()
+{
+  endFlow("grid");
+}
+
+void SgmlFOTBuilder::startGridCell(const GridCellNIC &nic)
+{
+  os() << "<grid-cell";
+  if (nic.columnNumber)
+    os() << " column-number=" << quot << (unsigned long)nic.columnNumber << quot;
+  if (nic.rowNumber)
+    os() << " row-number=" << quot << (unsigned long)nic.rowNumber << quot;
+  outputIcs();
+  os() << '>' << RE;
+}
+
+void SgmlFOTBuilder::endGridCell()
+{
+  endFlow("grid-cell");
+}
+
+void SgmlFOTBuilder::externalGraphic(const ExternalGraphicNIC &nic)
+{
+  flushPendingElements();
+  os() << "<external-graphic entity-system-id="
+       << quot << Data(nic.entitySystemId) << quot
+       << " notation-system-id="
+       << quot << Data(nic.notationSystemId) << quot;
+  if (nic.scaleType != symbolFalse)
+    os() << " scale=" << quot << nic.scaleType << quot;
+  else
+    os() << " scale-x=" << quot << nic.scale[0] << quot
+         << " scale-y=" << quot << nic.scale[1] << quot;
+  if (nic.hasMaxWidth)
+    os() << " max-width=" << quot << nic.maxWidth << quot;
+  if (nic.hasMaxHeight)
+    os() << " max-height=" << quot << nic.maxHeight << quot;
+  if (nic.isDisplay) {
+    os() << " display=" << quot << trueString << quot;
+    displayNIC(nic);
+  }
+  else {
+    if (nic.escapementDirection != symbolFalse)
+      os() << " escapement-direction=" << quot << nic.escapementDirection << quot;
+    if (nic.positionPointX)
+      os() << " position-point-x=" << quot << nic.positionPointX << quot;
+    if (nic.positionPointY)
+      os() << " position-point-y=" << quot << nic.positionPointY << quot;
+    inlineNIC(nic);
+  }
+  outputIcs();
+  os() << "/>" << RE;
+}
+
+void SgmlFOTBuilder::rule(const RuleNIC &nic)
+{
+  flushPendingElements();
+  const char *s = symbolName(nic.orientation);
+  if (!s)
+    return;
+  os() << "<rule orientation=" << quot << s << quot;
+  switch (nic.orientation) {
+  case symbolHorizontal:
+  case symbolVertical:
+    displayNIC(nic);
+    break;
+  default:
+    inlineNIC(nic);
+    break;
+  }
+  if (nic.hasLength)
+    os() << " length=" << quot << nic.length << quot;
+  outputIcs();
+  os() << "/>" << RE;
+}
+
+void SgmlFOTBuilder::startLeader(const LeaderNIC &nic)
+{
+  flushPendingElements();
+  os() << "<leader";
+  if (nic.hasLength)
+    os() << " length=" << nic.length;
+  inlineNIC(nic);
+  outputIcs();
+  os() << '>' << RE;
+}
+
+void SgmlFOTBuilder::endLeader()
+{
+  endFlow("leader");
+}
+
+void SgmlFOTBuilder::startSideline()
+{
+  startSimpleFlowObj("sideline");
+}
+
+void SgmlFOTBuilder::endSideline()
+{
+  endFlow("sideline");
+}
+
+void SgmlFOTBuilder::startBox(const BoxNIC &nic)
+{
+  flushPendingElements();
+  os() << "<box";
+  if (nic.isDisplay) {
+    os() << " display=" << quot << trueString << quot;
+    displayNIC(nic);
+  }
+  else
+    inlineNIC(nic);
+  outputIcs();
+  os() << '>' << RE;
+}
+
+void SgmlFOTBuilder::endBox()
+{
+  endFlow("box");
+}
+
+void SgmlFOTBuilder::alignmentPoint()
+{
+  simpleFlowObj("alignment-point");
+}
+
+void SgmlFOTBuilder::startTable(const TableNIC &nic)
+{
+  flushPendingElements();
+  os() << "<table";
+  switch (nic.widthType) {
+  case TableNIC::widthExplicit:
+    os() << " width=" << quot << nic.width << quot;
+    break;
+  case TableNIC::widthMinimum:
+    os() << " minimum-width=" << quot << trueString << quot;
+    break;
+  default:
+    break;
+  }
+  displayNIC(nic);
+  outputIcs();
+  os() << '>' << RE;
+}
+
+void SgmlFOTBuilder::endTable()
+{
+  endFlow("table");
+}
+
+void SgmlFOTBuilder::tableBeforeRowBorder()
+{
+  simpleFlowObj("table.before-row-border");
+}
+
+void SgmlFOTBuilder::tableAfterRowBorder()
+{
+  simpleFlowObj("table.after-row-border");
+}
+
+void SgmlFOTBuilder::tableBeforeColumnBorder()
+{
+  simpleFlowObj("table.before-column-border");
+}
+
+void SgmlFOTBuilder::tableAfterColumnBorder()
+{
+  simpleFlowObj("table.after-column-border");
+}
+
+void SgmlFOTBuilder::tableColumn(const TableColumnNIC &nic)
+{
+  os() << "<table-column column-number="
+       << quot << (unsigned long)nic.columnIndex + 1 << quot;
+  if (nic.nColumnsSpanned != 1)
+    os() << " n-columns-spanned=" << quot << (unsigned long)nic.nColumnsSpanned << quot;
+  if (nic.hasWidth)
+    os() << " width=" << quot << nic.width << quot;
+  outputIcs();
+  os() << "/>" << RE;
+}
+
+void SgmlFOTBuilder::startTablePartSerial(const TablePartNIC &nic)
+{
+  os() << "<table-part";
+  displayNIC(nic);
+  outputIcs();
+  os() << '>' << RE;
+  startPortFlow("table-part.principal");
+}
+
+void SgmlFOTBuilder::endTablePartSerial()
+{
+  endFlow("table-part");
+}
+
+void SgmlFOTBuilder::startTablePartHeader()
+{
+  endFlow("table-part.principal");
+  os() << "<table-part.header>" << RE;
+}
+
+void SgmlFOTBuilder::endTablePartHeader()
+{
+  endFlow("table-part.header");
+}
+
+void SgmlFOTBuilder::startTablePartFooter()
+{
+  os() << "<table-part.footer>" << RE;
+}
+
+void SgmlFOTBuilder::endTablePartFooter()
+{
+  endFlow("table-part.footer");
+}
+
+void SgmlFOTBuilder::startTableRow()
+{
+  startSimpleFlowObj("table-row");
+}
+
+void SgmlFOTBuilder::endTableRow()
+{
+  endFlow("table-row");
+}
+
+void SgmlFOTBuilder::startTableCell(const TableCellNIC &nic)
+{
+  if (nic.missing)
+    os() << "<table-cell column-number=" << quot << 0 << quot;
+  else {
+    os() << "<table-cell column-number="
+         << quot << (unsigned long)nic.columnIndex + 1 << quot;
+    if (nic.nColumnsSpanned != 1)
+      os() << " n-columns-spanned=" << quot << (unsigned long)nic.nColumnsSpanned << quot;
+    if (nic.nRowsSpanned != 1)
+      os() << " n-rows-spanned=" << quot << (unsigned long)nic.nRowsSpanned << quot;
+  }
+  outputIcs();
+  os() << '>' << RE;
+}
+
+void SgmlFOTBuilder::endTableCell()
+{
+  endFlow("table-cell");
+}
+
+void SgmlFOTBuilder::tableCellBeforeRowBorder()
+{
+  simpleFlowObj("table-cell.before-row-border");
+}
+
+void SgmlFOTBuilder::tableCellAfterRowBorder()
+{
+  simpleFlowObj("table-cell.after-row-border");
+}
+
+void SgmlFOTBuilder::tableCellBeforeColumnBorder()
+{
+  simpleFlowObj("table-cell.before-column-border");
+}
+
+void SgmlFOTBuilder::tableCellAfterColumnBorder()
+{
+  simpleFlowObj("table-cell.after-column-border");
+}
+
+void SgmlFOTBuilder::startNode(const NodePtr &node, const StringC &mode)
+{
+  nodeLevel_++;
+  if (mode.size() != 0 || !nodeIsElement(node))
+    return;
+  for (size_t i = 0; i < pendingElements_.size(); i++)
+    if (*pendingElements_[i] == *node)
+      return;
+  pendingElements_.push_back(node);
+  pendingElementLevels_.push_back(nodeLevel_);
+}
+
+void SgmlFOTBuilder::endNode()
+{
+  // The idea is not to put out a bookmark if there were
+  // no flow objects associated with the node.
+  // The flow objects might have been labeled, in which case
+  // we will get a startNode for the node later.
+  if (pendingElements_.size() > 0 && pendingElementLevels_.back() == nodeLevel_
+      && nPendingElementsNonEmpty_ < pendingElements_.size()) {
+    pendingElementLevels_.resize(pendingElements_.size() - 1);
+    pendingElements_.resize(pendingElements_.size() - 1);
+  }
+  nodeLevel_--;
+}
+
+void SgmlFOTBuilder::currentNodePageNumber(const NodePtr &node)
+{
+  if (!nodeIsElement(node))
+    return;
+  os() << "<page-number ref=" << quot;
+  outputElementName(node);
+  os() << quot << "/>" << RE;
+}
+
+void SgmlFOTBuilder::outputElementName(unsigned long groveIndex,
+                                      const Char *idData,
+                                      size_t idSize)
+{
+  if (groveIndex)
+    os() << groveIndex << '.';
+  os() << Data(idData, idSize);
+}
+
+void SgmlFOTBuilder::outputElementName(const NodePtr &node)
+{
+  GroveString id;
+  if (node->getId(id) == accessOK)
+    outputElementName(node->groveIndex(), id.data(), id.size());
+  else {
+    unsigned long n;
+    n = node->groveIndex();
+    if (n)
+      os() << n << '.';
+    if (node->elementIndex(n) == accessOK)
+      os() << n;
+  }
+}
+
+void SgmlFOTBuilder::flushPendingElements()
+{
+  if (suppressAnchors_)
+    return;
+  for (size_t i = 0; i < pendingElements_.size(); i++) {
+    const NodePtr &node = pendingElements_[i];
+    os() << "<a name=" << quot;
+    outputElementName(node);
+    os() << quot << "/>" << RE;
+  }
+  nPendingElementsNonEmpty_ = 0;
+  pendingElements_.resize(0);
+  pendingElementLevels_.resize(0);
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
diff --git a/jade/SgmlFOTBuilder.h b/jade/SgmlFOTBuilder.h
new file mode 100644 (file)
index 0000000..e56764f
--- /dev/null
@@ -0,0 +1,20 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef SgmlFOTBuilder_INCLUDED
+#define SgmlFOTBuilder_INCLUDED 1
+
+#include "FOTBuilder.h"
+#include "OutputCharStream.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+FOTBuilder *makeSgmlFOTBuilder(OutputCharStream *);
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not SgmlFOTBuilder_INCLUDED */
diff --git a/jade/TeXFOTBuilder.cxx b/jade/TeXFOTBuilder.cxx
new file mode 100644 (file)
index 0000000..3100698
--- /dev/null
@@ -0,0 +1,4875 @@
+// TeXFotBuilder.cxx: a Generic TeX backend for Jade
+// Written by David Megginson <dmeggins@microstar.com>
+// With changes from Sebastian Rahtz <s.rahtz@elsevier.co.uk>
+// Last Modification: August 6th, 1998
+
+// Table Support: Kathleen Marszalek <kmarszal@watarts.uwaterloo.ca>
+// Version: 1.0b7
+// Last Modification: July 7th, 1998
+
+#include "config.h"
+#include "TeXFOTBuilder.h"
+#include "TeXMessages.h"
+#include "MessageArg.h"
+#include "TmpOutputByteStream.h"
+#include <stdio.h>
+#include <stdlib.h>
+#undef TEXDEBUG
+#undef NDEBUG
+
+#define OUTLINES
+#undef DEBUG_OUTLINES
+#ifdef DEBUG_OUTLINES
+#include <iostream.h>
+#endif
+#include <assert.h>
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+// --------- TeXTmpOutputByteStream ------------------------------------------
+
+struct TeXTmpOutputByteStream : public TmpOutputByteStream {
+  TeXTmpOutputByteStream() : TmpOutputByteStream() {}
+  void commit( OutputByteStream &os ) const;
+};
+
+// ----------------------------------------------------------------------------
+
+struct LengthInPoints {
+  LengthInPoints( long l_ ) : l( l_ ) {}
+  long l;
+};
+
+void TeXTmpOutputByteStream::commit( OutputByteStream &os ) const {
+
+  TmpOutputByteStream::Iter iter( *this );
+  const char *s;
+  size_t n;
+
+  while( iter.next( s, n ) ) {
+    os.sputn( s, n );
+  }
+}
+// --------- TeXFOTBuilder ----------------------------------------------------
+
+
+class TeXFOTBuilder : public SerialFOTBuilder {
+public:
+#ifdef TEXDEBUG 
+  static TeXFOTBuilder &curInstance() { assert( CurInstance != NULL ); return *CurInstance; }
+  // used for testing only: otherwise code is re-entrant
+#endif
+  struct PageFloatNIC {
+    ~PageFloatNIC();
+    StringC placement;
+  };
+  class TeXExtensionFlowObj : public FOTBuilder::ExtensionFlowObj {
+  public:
+    virtual void atomic(TeXFOTBuilder &, const NodePtr &) const = 0;
+  };
+  class TeXCompoundExtensionFlowObj : public FOTBuilder::CompoundExtensionFlowObj {
+  public:
+    virtual void start(TeXFOTBuilder &, const NodePtr &) const = 0;
+    virtual void end(TeXFOTBuilder &) const = 0;
+  };
+  class PageFloatFlowObj : public TeXCompoundExtensionFlowObj {
+    void start(TeXFOTBuilder &fotb, const NodePtr &) const {
+      fotb.startPageFloat(nic_);
+    }
+    void end(TeXFOTBuilder &fotb) const {
+      fotb.endPageFloat();
+    }
+    bool hasNIC(const StringC &name) const {
+      return name == "placement" ;
+    }
+    void setNIC(const StringC &, const Value &value) {
+      value.convertString(nic_.placement);
+      }
+    ExtensionFlowObj *copy() const { return new PageFloatFlowObj(*this); }
+  private:
+    PageFloatNIC nic_;
+    StringC name_;
+    StringC placement;
+  };
+  class PageFootnoteFlowObj : public TeXCompoundExtensionFlowObj {
+    void start(TeXFOTBuilder &fotb, const NodePtr &) const {
+      fotb.startPageFootnote();
+    }
+    void end(TeXFOTBuilder &fotb) const {
+      fotb.endPageFootnote();
+    }
+    ExtensionFlowObj *copy() const { return new PageFootnoteFlowObj(*this); }
+  private:
+  };
+  //////////////////////////////////////////////////////////////////////
+  // Constructor and destructor.
+  //////////////////////////////////////////////////////////////////////
+
+  TeXFOTBuilder(OutputByteStream *, Messenger *mgr);
+  ~TeXFOTBuilder();
+  //// Needed for heading levels
+
+  //////////////////////////////////////////////////////////////////////
+  // Atomic flow objects
+  //////////////////////////////////////////////////////////////////////
+  void extension(const ExtensionFlowObj &fo, const NodePtr &);
+  void startExtensionSerial(const CompoundExtensionFlowObj &fo, const NodePtr &nd);
+  void endExtensionSerial(const CompoundExtensionFlowObj &fo);
+  void start();
+  void end();
+  void charactersFromNode(const NodePtr &, const Char *, size_t);
+  void setPreserveSdata(bool);
+  void startPageFloat(const PageFloatNIC &);
+  void endPageFloat();
+  void setPageFloatNIC(const PageFloatNIC &);
+  void startPageFootnote();
+  void endPageFootnote();
+
+  void characters(const Char *, size_t);
+  void character(const CharacterNIC &);
+  void paragraphBreak(const ParagraphNIC &);
+  void externalGraphic(const ExternalGraphicNIC &);
+  void rule(const RuleNIC &);
+  void alignmentPoint();
+  void pageNumber();
+  void formattingInstruction(const StringC &);
+  void tableColumn(const TableColumnNIC &);
+  void tableCellBeforeRowBorder();
+  void tableCellAfterRowBorder();
+  void tableCellBeforeColumnBorder();
+  void tableCellAfterColumnBorder();
+
+  void fractionBar();
+  void radicalRadical(const CharacterNIC &);
+  void radicalRadicalDefaulted();
+  void currentNodePageNumber(const NodePtr &);
+
+  //////////////////////////////////////////////////////////////////////
+  // Non-atomic flow objects
+  //////////////////////////////////////////////////////////////////////
+
+  void startSequence();
+  void endSequence();
+  void startLineField(const LineFieldNIC &);
+  void endLineField();
+  void startParagraph(const ParagraphNIC &);
+  void endParagraph();
+  void startDisplayGroup(const DisplayGroupNIC &);
+  void endDisplayGroup();
+  void startScroll();
+  void endScroll();
+  void startScore(Char);
+  void startScore(const LengthSpec &);
+  void startScore(Symbol);
+  void endScore();
+  void startLeader(const LeaderNIC &);
+  void endLeader();
+  void startSideline();
+  void endSideline();
+  void startBox(const BoxNIC &);
+  void endBox();
+  // Tables
+  void startTable(const TableNIC &);
+  void endTable();
+  // A call for each border is made immediately
+  // after startTable(), each preceded by any appropriate set*() calls.
+  void tableBeforeRowBorder();
+  void tableAfterRowBorder();
+  void tableBeforeColumnBorder();
+  void tableAfterColumnBorder();
+  void startTablePartSerial(const TablePartNIC &);
+  void endTablePartSerial();
+  void startTableRow();
+  void endTableRow();
+  void startTableCell(const TableCellNIC &);
+  void endTableCell();
+  void startSimplePageSequenceSerial();
+  void endSimplePageSequenceSerial();
+  // Headers and footers are treated like a separate port.
+  void startSimplePageSequenceHeaderFooter(unsigned);
+  void endSimplePageSequenceHeaderFooter(unsigned);
+  // page-number sosofo
+
+  void startTablePartHeader();
+  void endTablePartHeader();
+  void startTablePartFooter();
+  void endTablePartFooter();
+  void startMathSequence();
+  void endMathSequence();
+  void startFractionSerial();
+  void endFractionSerial();
+  void startFractionNumerator();
+  void endFractionNumerator();
+  void startFractionDenominator();
+  void endFractionDenominator();
+  void startUnmath();
+  void endUnmath();
+  void startSuperscript();
+  void endSuperscript();
+  void startSubscript();
+  void endSubscript();
+  void startScriptSerial();
+  void endScriptSerial();
+  void startScriptPreSup();
+  void endScriptPreSup();
+  void startScriptPreSub();
+  void endScriptPreSub();
+  void startScriptPostSup();
+  void endScriptPostSup();
+  void startScriptPostSub();
+  void endScriptPostSub();
+  void startScriptMidSup();
+  void endScriptMidSup();
+  void startScriptMidSub();
+  void endScriptMidSub();
+  void startMarkSerial();
+  void endMarkSerial();
+  void startMarkOver();
+  void endMarkOver();
+  void startMarkUnder();
+  void endMarkUnder();
+  void startFenceSerial();
+  void endFenceSerial();
+  void startFenceOpen();
+  void endFenceOpen();
+  void startFenceClose();
+  void endFenceClose();
+  void startRadicalSerial();
+  void endRadicalSerial();
+  void startRadicalDegree();
+  void endRadicalDegree();
+  void startMathOperatorSerial();
+  void endMathOperatorSerial();
+  void startMathOperatorOperator();
+  void endMathOperatorOperator();
+  void startMathOperatorLowerLimit();
+  void endMathOperatorLowerLimit();
+  void startMathOperatorUpperLimit();
+  void endMathOperatorUpperLimit();
+  void startGrid(const GridNIC &);
+  void endGrid();
+  void startGridCell(const GridCellNIC &);
+  void endGridCell();
+  void startNode(const NodePtr &, const StringC &);
+  void endNode();
+  void startLink(const Address &);
+  void endLink();
+
+
+  //////////////////////////////////////////////////////////////////////
+  // Inherited characteristics
+  // Set the value of the characteristic for the next flow object.
+  // Inherited characteristics that are not explicitly set have
+  // the same value as the parent flow object.
+  //////////////////////////////////////////////////////////////////////
+
+  void setFontSize(Length);
+  void setFontFamilyName(const StringC &);
+  void setFontWeight(Symbol);
+  void setFontPosture(Symbol);
+  void setStartIndent(const LengthSpec &);
+  void setEndIndent(const LengthSpec &);
+  void setFirstLineStartIndent(const LengthSpec &);
+  void setLastLineEndIndent(const LengthSpec &);
+  void setLineSpacing(const LengthSpec &);
+  void setFieldWidth(const LengthSpec &);
+  void setMarginaliaSep(const LengthSpec &);
+  void setLines(Symbol);
+  void setQuadding(Symbol);
+  void setDisplayAlignment(Symbol);
+  void setFieldAlign(Symbol);
+  void setColor(const DeviceRGBColor &);
+  void setBackgroundColor(); // background of #f
+  void setBackgroundColor(const DeviceRGBColor &);
+  void setBorderPresent(bool);
+  void setLineThickness(Length);
+  void setCellBeforeRowMargin(Length);
+  void setCellAfterRowMargin(Length);
+  void setCellBeforeColumnMargin(Length);
+  void setCellAfterColumnMargin(Length);
+  void setLineSep(Length);
+  void setBoxSizeBefore(Length);
+  void setBoxSizeAfter(Length);
+  void setPositionPointShift(const LengthSpec &);
+  void setStartMargin(const LengthSpec &);
+  void setEndMargin(const LengthSpec &);
+  void setSidelineSep(const LengthSpec &);
+  void setAsisWrapIndent(const LengthSpec &);
+  void setLineNumberSep(const LengthSpec &);
+  void setLastLineJustifyLimit(const LengthSpec &);
+  void setJustifyGlyphSpaceMaxAdd(const LengthSpec &);
+  void setJustifyGlyphSpaceMaxRemove(const LengthSpec &);
+  void setTableCornerRadius(const LengthSpec &);
+  void setBoxCornerRadius(const LengthSpec &);
+  void setInhibitLineBreaks(bool);
+  void setHyphenate(bool);
+  void setKern(bool);
+  void setLigature(bool);
+  void setScoreSpaces(bool);
+  void setFloatOutMarginalia(bool);
+  void setFloatOutSidelines(bool);
+  void setFloatOutLineNumbers(bool);
+  void setCellBackground(bool);
+  void setSpanWeak(bool);
+  void setIgnoreRecordEnd(bool);
+  void setNumberedLines(bool);
+  void setHangingPunct(bool);
+  void setBoxOpenEnd(bool);
+  void setTruncateLeader(bool);
+  void setAlignLeader(bool);
+  void setTablePartOmitMiddleHeader(bool);
+  void setTablePartOmitMiddleFooter(bool);
+  void setBorderOmitAtBreak(bool);
+  void setPrincipalModeSimultaneous(bool);
+  void setMarginaliaKeepWithPrevious(bool);
+  void setLineJoin(Symbol);
+  void setLineCap(Symbol);
+  void setLineNumberSide(Symbol);
+  void setKernMode(Symbol);
+  void setInputWhitespaceTreatment(Symbol);
+  void setFillingDirection(Symbol);
+  void setWritingMode(Symbol);
+  void setLastLineQuadding(Symbol);
+  void setMathDisplayMode(Symbol);
+  void setBoxType(Symbol);
+  void setGlyphAlignmentMode(Symbol);
+  void setBoxBorderAlignment(Symbol);
+  void setCellRowAlignment(Symbol);
+  void setBorderAlignment(Symbol);
+  void setSidelineSide(Symbol);
+  void setHyphenationKeep(Symbol);
+  void setFontStructure(Symbol);
+  void setFontProportionateWidth(Symbol);
+  void setCellCrossed(Symbol);
+  void setMarginaliaSide(Symbol);
+  void setLayer(long);
+  void setBackgroundLayer(long);
+  void setBorderPriority(long);
+  void setLineRepeat(long);
+  void setSpan(long);
+  void setMinLeaderRepeat(long);
+  void setHyphenationRemainCharCount(long);
+  void setHyphenationPushCharCount(long);
+  void setWidowCount(long);
+  void setOrphanCount(long);
+  // 0 means #f
+  void setExpandTabs(long);
+  void setHyphenationLadderCount(long);
+  // public id or #f
+  void setBackgroundTile(PublicId);
+  void setLineBreakingMethod(PublicId);
+  void setLineCompositionMethod(PublicId);
+  void setImplicitBidiMethod(PublicId);
+  void setGlyphSubstMethod(PublicId);
+  void setGlyphReorderMethod(PublicId);
+  void setHyphenationMethod(PublicId);
+  void setTableAutoWidthMethod(PublicId);
+  void setFontName(PublicId);
+  // Two-letter code
+  void setLanguage(Letter2);
+  void setCountry(Letter2);
+  // For simple page sequence
+  void setPageWidth(Length);
+  void setPageHeight(Length);
+  void setLeftMargin(Length);
+  void setRightMargin(Length);
+  void setTopMargin(Length);
+  void setBottomMargin(Length);
+  void setHeaderMargin(Length);
+  void setFooterMargin(Length);
+
+  void setPageNumberRestart(bool);
+  void setPageNumberFormat(const StringC &);
+  void setPageNColumns(long);
+  void setPageColumnSep(Length);
+  void setPageBalanceColumns(bool);
+  void setPageTwoSide(bool);
+  void setTwoSideStartOnRight(bool);
+  void setGridRowSep(Length);
+  void setGridColumnSep(Length);
+  void setSubscriptDepth(Length);
+  void setSuperscriptHeight(Length);
+  void setUnderMarkDepth(Length);
+  void setOverMarkHeight(Length);
+  void setHeadingLevel(long);
+
+  void setMinPreLineSpacing(const OptLengthSpec &);
+  void setMinPostLineSpacing(const OptLengthSpec &);
+  void setMinLeading(const OptLengthSpec &);
+  void setScriptPreAlign(Symbol);
+  void setScriptPostAlign(Symbol);
+  void setScriptMidSupAlign(Symbol);
+  void setScriptMidSubAlign(Symbol);
+  void setNumeratorAlign(Symbol);
+  void setDenominatorAlign(Symbol);
+  void setGridPositionCellType(Symbol);
+  void setGridColumnAlignment(Symbol);
+  void setGridRowAlignment(Symbol);
+  void setGridEquidistantRows(bool);
+  void setGridEquidistantColumns(bool);
+  void setEscapementSpaceBefore(const InlineSpace &);
+  void setEscapementSpaceAfter(const InlineSpace &);
+  void setInlineSpaceSpace(const OptInlineSpace &);
+  void setGlyphSubstTable(const Vector<ConstPtr<GlyphSubstTable> > &tables);
+
+  void startDisplay( const DisplayNIC & ) {};
+  void endDisplay() {};
+
+  enum FotObjectClassType { oc_Unknown, oc_Cell };
+  enum { lengthUnspecified = LONG_MAX };
+//  static const Length lengthUnspecified = LONG_MAX;
+  
+  struct Format {
+
+    Format() : FotCurDisplaySize( 0 ),
+               FotLineThickness( 1000 ),
+               FotLineCap( symbolButt ),
+               FotBorderPriority( 0 ),
+               FotBorderPresent( true ),
+               FotLineRepeat( 1 ),
+               FotLines( symbolWrap ),
+               FotLineSep( 1000 ),
+               FotDisplayAlignment( symbolNotApplicable ),
+               FotCellRowAlignment( symbolNotApplicable ),
+               FotStartIndentSpec( 0 ),
+               FotEndIndentSpec( 0 ),
+               FotLeftMargin( 1 ),
+               FotRightMargin( 1 ),
+               FotPageWidth( 72000*8 ),
+               FotPageNColumns( 1 ),
+               FotPageColumnSep( 72000/2 ),
+               FotSpan( 1 ),
+               FotCellBeforeColumnMargin( lengthUnspecified ), 
+               FotCellAfterColumnMargin( lengthUnspecified ),
+              FotCellBackground(false),
+               FotObjectClass( oc_Unknown ) {}
+
+    long                 FotCurDisplaySize;
+    Length               FotLineThickness;
+    Symbol               FotLineCap;
+    long                 FotBorderPriority;
+    bool                 FotBorderPresent;
+    long                 FotLineRepeat;
+    Length               FotLineSep;
+    Symbol              FotLines;
+    Symbol               FotDisplayAlignment;
+    Symbol               FotCellRowAlignment;
+    LengthSpec           FotStartIndentSpec;
+    LengthSpec           FotEndIndentSpec;
+    Length               FotLeftMargin;
+    Length               FotRightMargin;
+    Length               FotPageWidth;
+    long                 FotPageNColumns;
+    Length               FotPageColumnSep;
+    long                 FotSpan;
+    bool                FotCellBackground;
+    DeviceRGBColor      FotBackgroundColor;
+    Length               FotCellBeforeColumnMargin;
+    Length               FotCellAfterColumnMargin;
+    FotObjectClassType   FotObjectClass;
+
+    static const Length INITIAL_PAGE_SIZE() { return 72000*8; }
+  };
+
+  struct CompoundFotElement;
+  struct FotElement {
+
+    FotElement(  CompoundFotElement *parent = NULL )
+     : Parent( parent ), SiblingSeqIdx( -1 ) {}
+    String<char> Characteristics;
+
+    virtual void out( OutputByteStream &stream ) const
+     { outProlog( stream ); outContent( stream ); outEpilog( stream ); }
+    virtual void open( TeXFOTBuilder &builder );
+    virtual void close( TeXFOTBuilder &builder );
+    virtual bool isAtomic() const = 0;
+    virtual const char *name() const = 0;
+    CompoundFotElement *parent() const { return Parent; }
+    String<char> &nodeInfoEpilog() { return NodeInfoEpilog; }
+    void setParent( CompoundFotElement *parent ) { Parent = parent; }
+    virtual FotElement *lastClosed_() = 0;
+    virtual FotElement *currentlyOpen_() = 0;
+    void setSiblingSeqIdx( int idx ) { SiblingSeqIdx = idx; }
+    int siblingSeqIdx() const { assert( SiblingSeqIdx > -1 ); return SiblingSeqIdx; }
+
+   protected:
+    int SiblingSeqIdx;
+    CompoundFotElement* Parent;
+    String<char> NodeInfoProlog;
+    String<char> NodeInfoEpilog;
+
+    virtual void outContent( OutputByteStream & ) const {};
+    virtual void outProlog( OutputByteStream &stream ) const = 0;
+    virtual void outEpilog( OutputByteStream &stream ) const = 0;
+  };
+
+  struct FotElementState {
+    FotElementState() : EnforcingStructure( true ), IsOpen( false ) {}
+    bool enforcingStructure() { return IsOpen && EnforcingStructure; }
+
+    bool EnforcingStructure;
+    bool IsOpen;
+    String<char> CurNodeInfoProlog;
+  };
+  
+  struct AtomicFotElement : public FotElement {
+
+    AtomicFotElement( CompoundFotElement *parent = NULL ) : FotElement( parent ) {}
+    virtual bool isAtomic() const { return true; }
+    virtual FotElement *lastClosed_() { return NULL; };
+    virtual FotElement *currentlyOpen_() { return this; }
+   
+   protected:
+    virtual void outProlog( OutputByteStream &stream ) const
+     { stream << NodeInfoProlog << "\\insert" << name() << "%\n{" << Characteristics << '}'; }
+    virtual void outEpilog( OutputByteStream &stream ) const
+     { stream << '}' << NodeInfoEpilog; }
+  };
+
+  struct CompoundFotElement : public FotElement {
+
+    CompoundFotElement( CompoundFotElement *parent = NULL )
+     : FotElement( parent ), CurrentlyOpenChildIdx( -1 ),
+       LastClosedChildIdx( -1 ) {}
+    virtual bool isAtomic() const { return false; }
+    virtual void open( TeXFOTBuilder &builder )
+      { FotElement::open( builder ); builder.pushOs( &PreContent ); };
+    virtual void close( TeXFOTBuilder &builder )
+      { builder.popOs(); FotElement::close( builder ); };
+    virtual void childJustClosed( FotElement &child )
+     { CurrentlyOpenChildIdx = -1; LastClosedChildIdx = child.siblingSeqIdx(); };
+    virtual void childJustOpened( FotElement &child )
+     { CurrentlyOpenChildIdx = child.siblingSeqIdx(); };
+    virtual FotElement &child( size_t idx ) = 0;
+    static FotElement *lastClosed( CompoundFotElement &treeRoot )
+     { return treeRoot.currentlyOpen( treeRoot )
+        ? treeRoot.currentlyOpen( treeRoot )->lastClosed_() : (FotElement*)NULL; }
+    static FotElement *currentlyOpen( CompoundFotElement &treeRoot ) {
+      return treeRoot.currentlyOpen_();
+    }
+    virtual FotElement *currentlyOpen_()
+     { return CurrentlyOpenChildIdx > -1
+        ? child( (size_t)CurrentlyOpenChildIdx ).currentlyOpen_() : this; }
+    virtual FotElement *lastClosed_() 
+     { return LastClosedChildIdx > -1
+        ? &child( (size_t)LastClosedChildIdx )
+        : ( parent() ? parent()->lastClosed_() : (FotElement*)NULL ); }
+    
+   protected:
+    virtual void outProlog( OutputByteStream &stream ) const {
+      #ifdef TEXDEBUG
+       stream <<  "\nELEMENT\n" << "\nPRO\n" << NodeInfoProlog << "\nEND_PRO\n" << "\\" << name() << "%\n{" << Characteristics << '}';
+      #else
+       stream <<  NodeInfoProlog << "\\" << name() << "%\n{" << Characteristics << '}';
+      #endif
+       
+      PreContent.commit( stream );
+     }
+    virtual void outEpilog( OutputByteStream &stream ) const {
+      #ifdef TEXDEBUG
+        stream << "\\end" << name() << "{}" << "\nEPI\n" << NodeInfoEpilog << "\nEND_EPI\nEND_ELEMENT\n" ;
+      #else
+        stream << "\\end" << name() << "{}" << NodeInfoEpilog << "%\n" ;
+      #endif
+    }
+
+    int CurrentlyOpenChildIdx;
+    int LastClosedChildIdx;
+    TeXTmpOutputByteStream PreContent;
+  };
+  
+  struct Border : public AtomicFotElement {
+
+    Border( CompoundFotElement *parent = NULL, bool cellBorder_ = true )
+     : AtomicFotElement( parent ), cellBorder( cellBorder_ ), borderPresent( false ) {}
+    long   borderPriority;
+    Length lineThickness;
+    bool   borderPresent;
+    long   lineRepeat;
+    Length lineSep;
+    bool   cellBorder;
+
+    void resolve( Border &adjacentBorder );
+    void setFromFot( TeXFOTBuilder &builder );
+  };
+
+  struct CellBeforeRowBorder : public Border {
+    CellBeforeRowBorder( CompoundFotElement *parent = NULL ) : Border( parent ) {}
+    virtual const char *name() const { return "TableCellBeforeRowBorder"; }
+  };
+  struct CellAfterRowBorder : public Border {
+    CellAfterRowBorder( CompoundFotElement *parent = NULL ) : Border( parent ) {}
+    virtual const char *name() const { return "TableCellAfterRowBorder"; }
+  };
+  struct CellBeforeColumnBorder : public Border {
+    CellBeforeColumnBorder( CompoundFotElement *parent = NULL ) : Border( parent ) {}
+    virtual const char *name() const { return "TableCellBeforeColumnBorder"; }
+  };
+  struct CellAfterColumnBorder : public Border {
+    CellAfterColumnBorder( CompoundFotElement *parent = NULL ) : Border( parent ) {}
+    virtual const char *name() const { return "TableCellAfterColumnBorder"; }
+  };
+  struct TableBeforeRowBorder : public Border {
+    TableBeforeRowBorder( CompoundFotElement *parent = NULL ) : Border( parent, false ) {}
+    virtual const char *name() const { return "TableBeforeRowBorder"; }
+  };
+  struct TableAfterRowBorder : public Border {
+    TableAfterRowBorder( CompoundFotElement *parent = NULL ) : Border( parent, false ) {}
+    virtual const char *name() const { return "TableAfterRowBorder"; }
+  };
+  struct TableBeforeColumnBorder : public Border {
+    TableBeforeColumnBorder( CompoundFotElement *parent = NULL ) : Border( parent, false ) {}
+    virtual const char *name() const { return "TableBeforeColumnBorder"; }
+  };
+  struct TableAfterColumnBorder : public Border {
+    TableAfterColumnBorder( CompoundFotElement *parent = NULL ) : Border( parent, false ) {}
+    virtual const char *name() const { return "TableAfterColumnBorder"; }
+  };
+  
+  struct Column {
+
+    Column() : hasWidth( 0 ), computedWidth( 0 ), defaultTeXLeftBorder( 0 ),
+              defaultTeXRightBorder( 0 ), displayAlignment( symbolStart ),
+              isExplicit( false ), displaySize(0),
+              defaultCellBeforeColumnMargin( 0 ),
+              defaultCellAfterColumnMargin( 0 ) {}
+    bool isExplicit;
+    bool hasWidth;
+    TableLengthSpec width;
+    long computedWidth;
+    long displaySize;
+    Symbol displayAlignment;
+    int defaultTeXLeftBorder; // also used as column border count;
+    int defaultTeXRightBorder; //
+    bool defaultCellBackground;
+    Length defaultCellBeforeColumnMargin;
+    Length defaultCellAfterColumnMargin;
+  };
+
+  struct TablePart;
+  struct Cell : public CompoundFotElement {
+
+    Cell( CompoundFotElement *parent = NULL )
+     : CompoundFotElement( parent ), missing( false ), OverlappingCell( NULL ),
+       nRowsSpanned( 1 ), nColumnsSpanned( 1 ), displaySize( 0 ),
+       beforeRowBorder(), afterRowBorder(), beforeColumnBorder(),
+       afterColumnBorder(), TeXTableRowIdx( -1 ), TeXTableColumnIdx(-1),
+       needsTeXColumnOverride(false),
+       beforeColumnMargin( lengthUnspecified ), 
+       effectiveBeforeColumnMargin( lengthUnspecified ), 
+       afterColumnMargin( lengthUnspecified ),
+       effectiveAfterColumnMargin( lengthUnspecified ),
+       effectiveAlignment( symbolStart ),
+       rowAlignment( symbolNotApplicable ),
+       cellBackground(false) {}
+
+    bool missing;
+    int TeXTableRowIdx;
+    int TeXTableColumnIdx;
+    unsigned nColumnsSpanned;
+    unsigned nRowsSpanned;
+    CellBeforeRowBorder beforeRowBorder;
+    CellAfterRowBorder afterRowBorder;
+    CellBeforeColumnBorder beforeColumnBorder;
+    CellAfterColumnBorder afterColumnBorder;
+    bool needsTeXColumnOverride;
+    Length beforeColumnMargin;
+    Length effectiveBeforeColumnMargin;
+    Length afterColumnMargin;
+    Length effectiveAfterColumnMargin;
+    Symbol rowAlignment;
+    Symbol effectiveAlignment;
+    long displaySize;
+    bool cellBackground;
+    DeviceRGBColor backgroundColor;
+
+    Cell *OverlappingCell;
+    OutputByteStream &content() { return Content; }
+    virtual void open( TeXFOTBuilder &builder )
+     { builder.pushFotElementState();
+       CompoundFotElement::open( builder );
+       builder.pushOs( &Content );
+       builder.curFotElementState().EnforcingStructure = false; }
+    virtual void close( TeXFOTBuilder &builder )
+     { builder.popOs();
+       CompoundFotElement::close( builder );
+       builder.popFotElementState(); }
+    virtual const char *name() const { return "TableCell"; }
+    bool singleRowBeforeRowBorderPresent() const;
+    bool singleRowAfterRowBorderPresent() const;
+    bool singleColumnBeforeColumnBorderPresent() const;
+    bool singleColumnAfterColumnBorderPresent() const;
+    void computeOverridingTeXColumnBorders( TablePart &tablePart );
+    void computeEffectiveTeXCellWidth( TablePart &tablePart );
+    void computeEffectiveTeXColumnMargins( TablePart &tablePart );
+    void computeTeXRowSpanFiller( TablePart &tablePart );
+
+    bool isOverlapped() const { return OverlappingCell == this ? false : true; }
+    virtual FotElement &child( size_t ) { assert( false ); return *this; }
+
+   protected:
+    virtual void outProlog( OutputByteStream &stream ) const;
+    virtual void outEpilog( OutputByteStream &stream ) const;
+    void outContent( OutputByteStream &stream ) const 
+      { if ( !isOverlapped() ) Content.commit( stream ); }
+    TeXTmpOutputByteStream Content;
+  };
+
+  struct Row : public CompoundFotElement {
+
+    Row( CompoundFotElement *parent = NULL ) : CompoundFotElement( parent ) {}
+    virtual const char *name() const { return "TableRow"; }
+    Vector<Cell> Cells;
+    static void outVerticalBorders
+      ( const Row *upperRow, const Row *lowerRow, OutputByteStream &stream );
+    virtual FotElement &child( size_t idx )
+     { assert( idx < Cells.size() ); return Cells[idx]; }
+
+   protected:
+    void outContent( OutputByteStream &stream ) const;
+  };
+
+  struct Table;
+  struct TablePart : public CompoundFotElement {
+
+    TablePart( CompoundFotElement *parent = NULL )
+     : CompoundFotElement( parent ), columnsProcessed( false ),
+       needsColumnReprocessing( false ), isExplicit( true ) {}
+
+    bool isExplicit;
+
+    Vector<Column> Columns;
+    String<char> HeaderProlog;
+    Vector<Row> Header;
+    String<char> HeaderEpilog;
+    Vector<Row> Body;
+    String<char> FooterProlog;
+    Vector<Row> Footer;                
+    String<char> FooterEpilog;
+
+    void processColumns( TeXFOTBuilder &builder );
+    void computeOverridingTeXCharacteristics();
+    void normalizeRows();
+    void begin();
+
+    Table &parentTable() const
+     { assert( Parent != NULL ); return *(Table*)Parent; }
+    virtual const char *name() const { return "TablePart"; }
+    virtual FotElement &child( size_t idx );
+
+    bool columnsProcessed;
+    bool needsColumnReprocessing;
+
+   protected:
+    virtual void outProlog( OutputByteStream &stream ) const
+     { if( isExplicit ) CompoundFotElement::outProlog( stream ); }
+    virtual void outEpilog( OutputByteStream &stream ) const
+     { if( isExplicit ) CompoundFotElement::outEpilog( stream ); }
+    Row &siblingSeqIdxToRow( int idx ) const;
+    void outContent( OutputByteStream &stream ) const;
+  };
+
+  struct Table : public CompoundFotElement {
+
+    Table(  CompoundFotElement *parent = NULL )
+     : CompoundFotElement( parent ), beforeRowBorder(), afterRowBorder(),
+       beforeColumnBorder(), afterColumnBorder(), CurCell( NULL ),
+       displayAlignment( symbolStart ), CurTablePart( NULL ), 
+       NoTablePartsSeen( true ) {}
+
+    Vector<TablePart> TableParts;
+
+    TableBeforeRowBorder beforeRowBorder;
+    TableAfterRowBorder afterRowBorder;
+    TableBeforeColumnBorder beforeColumnBorder;
+    TableAfterColumnBorder afterColumnBorder;
+    Length tableWidth;
+    Symbol displayAlignment;
+    Length startIndent;
+
+    virtual const char *name() const { return "Table"; }
+    virtual FotElement &child( size_t idx )
+     { assert( idx < TableParts.size() ); return TableParts[idx]; }
+    void resolveBorders( Vector<Row> *preceedingRows,
+                         Vector<Row> &rows,
+                         Vector<Row> *followingRows,
+                         unsigned startingRowIdx,
+                         bool hasFirstTableRow, bool hasLastTableRow );
+    void begin();
+    virtual void open( TeXFOTBuilder &builder )
+     { builder.pushFotElementState();
+       CompoundFotElement::open( builder );
+       builder.curFotElementState().EnforcingStructure = true; }
+    virtual void close( TeXFOTBuilder &builder )
+     { CompoundFotElement::close( builder );
+       builder.popFotElementState(); }
+    void end( TeXFOTBuilder &builder );
+
+    Vector<Row> &curRows() { assert( CurRows != NULL ); return *CurRows; }
+    TablePart &curTablePart() { assert( CurTablePart != NULL ); return *CurTablePart; }
+    Cell &curCell() { assert( CurCell != NULL ); return *CurCell; }
+    TablePart *CurTablePart;
+    Cell *CurCell;
+    Vector<Row> *CurRows;
+    
+    bool NoTablePartsSeen;
+
+  protected:
+    void outContent( OutputByteStream &stream ) const;
+  };
+  
+  long computeLengthSpec( const LengthSpec &spec ) const;
+  const Format &curFormat() const { assert( FormatStack.size() > 0 ); return FormatStack.back(); }
+  Table &curTable() { assert( TableStack.size() > 0 ); 
+                     return TableStack.back(); }
+  FotElementState &curFotElementState() 
+    { assert( FotElementStateStack_.size() > 0 );
+      return FotElementStateStack_.back(); }
+  void pushFotElementState()
+    { FotElementStateStack_.resize(FotElementStateStack_.size() + 1 ); }
+  void popFotElementState()
+    { assert( FotElementStateStack_.size() > 0 );
+      FotElementStateStack_.resize(FotElementStateStack_.size() - 1 ); }
+
+  void pushOs( OutputByteStream *to );
+  void popOs();
+  
+  void elementStart( FotObjectClassType objectClassType );
+  
+  OutputByteStream *fileout_;
+private:
+                               // Variables.
+  Vector<OutputByteStream *> osStack_;
+  StrOutputByteStream stringout_;
+  Messenger *mgr_;
+  bool preserveSdata_;
+  int inMath_;
+
+#ifdef OUTLINES
+  int needToCollect() {return inHeading_;}
+
+  void addHeadedText(const Char * s, size_t n);
+  void addHeadedText(const StringC p);
+
+  struct ParHead {
+    ParHead() : isHeaded_(false),level_(0),previous_(0){}
+    ParHead(bool h): isHeaded_(h),level_(0),previous_(0){}
+    ParHead(bool h,long l) : isHeaded_(h),level_(l),previous_(0){}
+
+    bool isHeaded_;
+    long level_;
+    StringC  headingText_;
+    size_t previous_;
+  };
+
+  StringC protectedChar_; //for special tex Chars
+  
+  bool headingSet_;
+  bool inHeading_;
+  StringC return_;
+  Vector<ParHead> parStack_;
+  size_t  lastHeaded_;
+#endif
+  Vector<size_t> DisplayBoxLevels;
+  Vector<Format> FormatStack;
+  Format NextFormat; 
+  Vector<Table> TableStack;
+  Vector<FotElementState> FotElementStateStack_;
+
+                               // Functions.
+  OutputByteStream &os();
+  void insertAtomic(const char *name);
+  void insertAtomic(FotElement &fotElement);
+  void startGroup(FotElement &fotElement);
+  void startGroup(const char *name, String<char> *output = NULL );
+  void endGroup(const char *name, String<char> *output = NULL );
+  void closeopenBrace(const char *name, String<char> *output = NULL );
+  void startBrace(const char *name, String<char> *output = NULL );
+  void endBrace(const char *name, String<char> *output = NULL );
+  void startSimpleGroup(const char *name, String<char> *output = NULL );
+  void endSimpleGroup(String<char> *output = NULL);
+  void endGroup() {};
+
+  void setlength(const char *,Length);
+  void set(const char *,const StringC &);
+  void set(const char *,const GroveString &);
+  void set(const char *,Symbol);
+  void set(const char *,const LengthSpec &);
+  void set(const char *,double);
+  void set(const char *,const DeviceRGBColor &);
+  void set(const char *,bool);
+  void set(const char *,long);
+  void set(const char *,long unsigned int);
+  void set(const char *name,unsigned int n) {
+    set(name, (unsigned long)n);
+  }
+  void set(const char *,PublicId);
+  void setletter2(const char *,Letter2);
+  void set(const char *,const DisplaySpace &);
+  void set(const char *,const GlyphId &);
+
+  void set(const char *,const OptLengthSpec &);
+  void set(const char *,const InlineSpace &);
+  void set(const char *,const OptInlineSpace &);
+
+  // Structures for non-inherited characteristics,
+  // in the order specified in style/FOTBuilder.h.
+
+  void setDisplayNIC(const DisplayNIC &);
+  void setInlineNIC(const InlineNIC &);
+  void setDisplayGroupNIC(const DisplayGroupNIC &);
+  void setExternalGraphicNIC(const ExternalGraphicNIC &);
+  void setBoxNIC(const BoxNIC &);
+  void setRuleNIC(const RuleNIC &);
+  void setLeaderNIC(const LeaderNIC &);
+  void setParagraphNIC(const ParagraphNIC &);
+  void setCharacterNIC(const CharacterNIC &);
+  void setLineFieldNIC(const LineFieldNIC &);
+  void setTableNIC(const TableNIC &);
+  void setTablePartNIC(const TablePartNIC &);
+  void setTableColumnNIC(const TableColumnNIC &);
+  void setTableCellNIC(const TableCellNIC &);
+  void setGridNIC(const GridNIC &);
+  void setGridCellNIC(const GridCellNIC &);
+
+  void dumpInherited();
+
+  void message(const MessageType0 &);
+  static ParHead& top(Vector<ParHead>& s);
+  static ParHead* ptrTop(Vector<ParHead>& s);
+  static void pop(Vector<ParHead>& s);
+  static void push(Vector<ParHead>& s, ParHead p);
+};
+
+#ifdef OUTLINES
+// Stack Utilities
+
+TeXFOTBuilder::ParHead& 
+TeXFOTBuilder::top (Vector<TeXFOTBuilder::ParHead> &s) {
+  //cerr << "top" <<s.back().level_<<'\n';
+  return s.back();
+}
+
+TeXFOTBuilder::ParHead* 
+TeXFOTBuilder::ptrTop (Vector<TeXFOTBuilder::ParHead> &s) {
+  //cerr << "top" <<s.back().level_<<'\n';
+  return &(s.back());
+}
+
+void 
+TeXFOTBuilder::pop(Vector<TeXFOTBuilder::ParHead> &s){
+  //cerr << "popping" <<'\n';
+  s.resize(s.size() - 1);
+}
+    
+void 
+TeXFOTBuilder::push(Vector<TeXFOTBuilder::ParHead> &s,TeXFOTBuilder::ParHead p ){
+  //cerr << "pushing" <<p.level_<<'\n';
+  s.push_back(p);
+}
+
+void TeXFOTBuilder::addHeadedText(const Char * s, size_t n){
+  if (top(parStack_).isHeaded_){
+    top(parStack_).headingText_.append(s,n);
+  }
+  else{
+    assert(((top(parStack_).previous_)) >= 0);
+    parStack_[top(parStack_).previous_].headingText_.append(s,n);
+  }
+}
+
+void TeXFOTBuilder::addHeadedText(const  StringC p){
+  if (top(parStack_).isHeaded_){
+    top(parStack_).headingText_ += p;
+  }
+  else{
+    assert(((top(parStack_).previous_)) >= 0);
+    parStack_[top(parStack_).previous_].headingText_ += p;
+  }
+}
+#endif
+
+#ifdef TEXDEBUG
+  TeXFOTBuilder *TeXFOTBuilder::CurInstance = NULL;
+#endif
+
+// --------- OutputByteStream operators --------------------------------------
+
+OutputByteStream &operator<<( OutputByteStream &os, LengthInPoints length ) {
+
+  char buf[32];
+  int i;
+  sprintf( buf, "%li.%.3i%n", long(length.l)/1000, abs(long(length.l)%1000), &i );
+  while( buf[--i] == '0' ) {}; if( buf[i] == '.' ) i--;
+    buf[i+1] = '\0';
+  os << buf << "\\p@";
+  return os;
+}
+
+// --------- TeXFOTBuilder::FotElement ---------------------------------------
+
+void TeXFOTBuilder::FotElement::open( TeXFOTBuilder &builder ) {
+  builder.curFotElementState().IsOpen = true;
+  if( parent() )
+    parent()->childJustOpened( *this );
+
+  if( builder.curFotElementState().CurNodeInfoProlog.size() > 0 ) {
+    NodeInfoProlog = builder.curFotElementState().CurNodeInfoProlog;
+    builder.curFotElementState().CurNodeInfoProlog.resize( 0 );
+  }
+}
+
+void TeXFOTBuilder::FotElement::close( TeXFOTBuilder &builder ) {
+  if( parent() )
+    parent()->childJustClosed( *this );
+  else 
+    builder.curFotElementState().IsOpen = false;
+}  
+
+TeXFOTBuilder::FotElement *TeXFOTBuilder::FotElement::lastClosed_() {
+
+  return parent() ? parent()->lastClosed_() : (FotElement*)NULL;
+}
+
+// --------- TeXFOTBuilder Standard Display/Element Handling -----------------
+
+void TeXFOTBuilder::elementStart( FotObjectClassType objectClassType ) {
+  NextFormat.FotObjectClass = objectClassType;
+  FormatStack.push_back( NextFormat );
+}
+
+void TeXFOTBuilder::start() {
+  NextFormat.FotObjectClass = oc_Unknown;
+  FormatStack.push_back( NextFormat );
+}
+
+void TeXFOTBuilder::end() {
+  assert( FormatStack.size() > 0 );
+  FormatStack.resize( FormatStack.size()-1 );
+
+  assert( FormatStack.size() > 0 );
+  NextFormat = FormatStack.back();
+}
+
+// --------- TeXFOTBuilder Misc ----------------------------------------------
+
+long TeXFOTBuilder::computeLengthSpec( const LengthSpec &spec ) const {
+
+    if( spec.displaySizeFactor == 0.0 ) {
+        return spec.length;
+    } else {
+        double tem = curFormat().FotCurDisplaySize * spec.displaySizeFactor;
+        return spec.length + long( tem >= 0.0 ? tem +.5 : tem - .5 );
+    }
+}
+
+// --------- TeXFOTBuilder::Table ---------------------------------------------
+
+void TeXFOTBuilder::Table::resolveBorders
+ ( Vector<Row> *preceedingRows, Vector<Row> &rows,
+   Vector<Row> *, unsigned startingRowIdx, bool hasFirstTableRow,
+   bool hasLastTableRow ) {
+
+    bool isFirstRow;
+    bool isLastRow;
+    bool isFirstColumn;
+    bool isLastColumn;
+    Cell *cell = NULL;
+    size_t r, c, rr, cc;
+    bool leftEdge, topEdge;
+
+    #ifdef TEXDEBUG
+      *TeXFOTBuilder::curInstance().fileout_ << "RESOLVING_BORDERS\n";
+    #endif
+
+    for( r = 0; r < rows.size(); r++ ) {
+      for( c = 0; c < rows[r].Cells.size()-1; c++ ) {
+        cell = &rows[r].Cells[c];
+        if( cell->OverlappingCell == NULL ) {
+          for( rr = r; rr < r + cell->nRowsSpanned; rr++ ) {
+            for( cc = c, leftEdge = true; cc < c + cell->nColumnsSpanned; cc++ ) {
+              rows[rr].Cells[cc].OverlappingCell = cell;
+              rows[rr].Cells[cc].TeXTableRowIdx = rr + startingRowIdx;
+              rows[rr].Cells[cc].TeXTableColumnIdx = cc;
+            }
+          }
+        }
+      }
+    }
+
+    for( r = 0; r < rows.size(); r++ ) {
+        #ifdef TEXDEBUG
+          *TeXFOTBuilder::curInstance().fileout_ << "ROW " << r << "\n";
+        #endif
+        for( c = 0; c < rows[r].Cells.size() - 1; c++ ) {
+            #ifdef TEXDEBUG
+              *TeXFOTBuilder::curInstance().fileout_ << "    COL " << c << "\n";
+            #endif
+            cell = &rows[r].Cells[c];
+            if( cell->OverlappingCell == cell ) {
+                for( rr = r, topEdge = true; rr < r + cell->nRowsSpanned; rr++ ) {
+                    isFirstRow = ( rr == 0 ) ? true : false;
+                    isLastRow = ( rr == rows.size() - 1 ) ? true : false;
+                    for( cc = c, leftEdge = true; cc < c + cell->nColumnsSpanned; cc++ ) {
+                        isFirstColumn = ( cc == 0 ) ? true : false;
+                        isLastColumn = ( cc == rows[rr].Cells.size() - 2 ) ? true : false;
+
+                        if( leftEdge )
+                            if( isFirstColumn ) {
+                                #ifdef TEXDEBUG
+                                  *TeXFOTBuilder::curInstance().fileout_
+                                   << "LEFT_TABLE_BORDER_RES \n";
+                                #endif
+                                cell->beforeColumnBorder.resolve( beforeColumnBorder );
+                            } else
+                                cell->beforeColumnBorder.resolve
+                                 ( rows[rr].Cells[cc-1].OverlappingCell->afterColumnBorder );
+
+                        if( topEdge )
+                            if( isFirstRow && hasFirstTableRow )
+                                cell->beforeRowBorder.resolve( beforeRowBorder );
+                            else
+                                if( !isFirstRow )
+                                    cell->beforeRowBorder.resolve
+                                     ( rows[rr-1].Cells[cc].OverlappingCell->afterRowBorder );
+                                else if( preceedingRows != NULL ) {
+                                    assert( preceedingRows->size() > 0 );
+                                    cell->beforeRowBorder.resolve
+                                     ( (*preceedingRows)[preceedingRows->size()-1].Cells[cc]
+                                        .OverlappingCell->afterRowBorder );
+                                }
+
+                        if( isLastColumn )
+                            cell->afterColumnBorder.resolve( afterColumnBorder );
+
+                        if( isLastRow && hasLastTableRow )
+                            cell->afterRowBorder.resolve( afterRowBorder );
+                        
+                        leftEdge = false;
+                    }
+                    topEdge = false;
+                }
+            }                
+        }
+    }
+}
+
+void TeXFOTBuilder::Table::begin() {
+
+    CurCell = NULL;
+    NoTablePartsSeen = true;
+
+    TableParts.resize( 0 );
+    TableParts.resize( 1 );
+    TableParts.back().setSiblingSeqIdx( 0 );
+    TableParts.back().setParent( this );
+    TableParts.back().begin();
+}
+
+void TeXFOTBuilder::Table::end( TeXFOTBuilder &builder ) {
+
+  bool firstPart, lastPart, hasHeader, hasBody, hasFooter;
+  for( size_t i = 0; i < TableParts.size(); i++ ) {
+      firstPart = ( i == 0 ) ? true : false;
+      lastPart = ( i == TableParts.size() - 1 ) ? true : false;
+      TablePart &tablePart = TableParts[i];
+      tablePart.normalizeRows();
+      hasHeader = tablePart.Header.size() > 0 ? true : false;
+      hasBody = tablePart.Body.size() > 0 ? true : false;
+      hasFooter = tablePart.Footer.size() > 0 ? true : false;
+      if( hasHeader )
+          resolveBorders( (Vector<Row>*)NULL,
+                          tablePart.Header,
+                          hasBody ? &tablePart.Body : (Vector<Row>*)NULL,
+                          0, firstPart ? true : false, false );
+      resolveBorders( hasHeader ? &tablePart.Header : (Vector<Row>*)NULL,
+                      tablePart.Body,
+                      hasFooter ? &tablePart.Footer : (Vector<Row>*)NULL,
+                      tablePart.Header.size(), hasHeader ? false : true,
+                      hasFooter ? false : true );
+      if( hasFooter )
+          resolveBorders( hasBody ? &tablePart.Body : (Vector<Row>*)NULL,
+                          tablePart.Footer,
+                          (Vector<Row>*)NULL, 
+                          tablePart.Header.size() + tablePart.Body.size(),
+                          false, lastPart ? true : false );
+
+      if( tablePart.needsColumnReprocessing )
+        tablePart.processColumns( builder );
+
+      tablePart.computeOverridingTeXCharacteristics();
+  }
+}
+
+void TeXFOTBuilder::Table::outContent( OutputByteStream &stream ) const {
+
+  for( size_t i = 0; i < TableParts.size(); i++ )
+      TableParts[i].out( stream );
+};
+
+// --------- TeXFOTBuilder::TablePart -----------------------------------------
+
+void TeXFOTBuilder::TablePart::begin() {
+
+    Columns.resize( 0 );
+    Header.resize( 0 );
+    Body.resize( 0 );
+    Footer.resize( 0 );
+    
+    columnsProcessed = false;
+    needsColumnReprocessing = false;
+
+    parentTable().CurRows = &Body;    
+    parentTable().CurTablePart = this;
+}
+
+TeXFOTBuilder::FotElement &TeXFOTBuilder::TablePart::child( size_t idx ) {
+
+  if( idx < Header.size() )
+    return Header[idx];
+
+  idx -= Header.size();
+  if( idx < Body.size() )
+    return Body[idx];
+
+  assert( idx < Footer.size() );
+  idx -= Body.size();
+  return Footer[idx];
+}
+
+void TeXFOTBuilder::TablePart::computeOverridingTeXCharacteristics() {
+
+  Vector<Row> *rows;  
+  for( int step = 0; step < 3; step++ ) {
+    switch( step ) {
+      case 0: rows = &Header; break;
+      case 1: rows = &Body; break;
+      default: rows = &Footer;
+    }
+    for( size_t r = 0; r < rows->size(); r++ ) {
+      if( (*rows)[r].Cells.size()-1 > Columns.size() )
+        Columns.resize( (*rows)[r].Cells.size()-1 ); 
+      for( size_t c = 0; c < (*rows)[r].Cells.size()-1; c++ ) {
+        if( (*rows)[r].Cells[c].singleColumnBeforeColumnBorderPresent() )
+          Columns[c].defaultTeXLeftBorder++;
+        if( (*rows)[r].Cells[c].singleColumnAfterColumnBorderPresent() )
+          Columns[c].defaultTeXRightBorder++;
+      }
+    }
+  }
+
+  #ifdef TEXDEBUG
+    for( int step = 0; step < 3; step++ ) {
+      switch( step ) {
+        case 0: rows = &Header; break;
+        case 1: rows = &Body; break;
+        default: rows = &Footer;
+      }
+      for( size_t r = 0; r < rows->size(); r++ ) {
+        *TeXFOTBuilder::curInstance().fileout_
+         << "\nROW " << ( step == 0 ? "Header" : ( step == 1 ? "Body" : "Footer" ) ) << "\n";
+        for( size_t c = 0; c < (*rows)[r].Cells.size()-1; c++ ) {
+          *TeXFOTBuilder::curInstance().fileout_
+           << "\n    CELL " << c
+           << " LB: " << (*rows)[r].Cells[c].beforeColumnBorder.borderPresent
+           << " RB: " << (*rows)[r].Cells[c].beforeColumnBorder.borderPresent
+           << " OVERLAPPED: "
+           << ( (*rows)[r].Cells[c].isOverlapped() ? "YES" : "NO" ) << "\n";
+        }
+      }
+    }
+  #endif
+
+  size_t TeXTableRowsNum = Header.size() + Body.size() + Footer.size();
+  for( size_t c = 0; c < Columns.size(); c++ ) {
+    Columns[c].defaultTeXLeftBorder
+     = ((size_t)Columns[c].defaultTeXLeftBorder)*2 >= TeXTableRowsNum ? 1 : 0;
+    Columns[c].defaultTeXRightBorder
+      = ((size_t)Columns[c].defaultTeXRightBorder)*2 >= TeXTableRowsNum ? 1 : 0;
+  }
+
+  for( int step = 0; step < 3; step++ ) {
+    switch( step ) {
+      case 0: rows = &Header; break;
+      case 1: rows = &Body; break;
+      default: rows = &Footer;
+    }
+    for( size_t r = 0; r < rows->size(); r++ ) {
+      for( size_t c = 0; c < (*rows)[r].Cells.size()-1; c++ ) {
+        if( !(*rows)[r].Cells[c].isOverlapped() ) {
+          (*rows)[r].Cells[c].computeOverridingTeXColumnBorders( *this );
+        } else {
+         (*rows)[r].Cells[c].computeTeXRowSpanFiller( *this );
+       }
+      }
+    }
+  }
+}
+  
+void TeXFOTBuilder::TablePart::processColumns( TeXFOTBuilder &builder ) {
+
+  long totalNonproportionalWidth = 0L;
+  double totalProportionalUnits = 0.0;
+  size_t nonWidthCellsNum = 0;
+  for( size_t i = 0; i < Columns.size(); i++ ) {
+    if( Columns[i].hasWidth ) {
+      if( Columns[i].width.tableUnitFactor ) {
+        totalProportionalUnits += Columns[i].width.tableUnitFactor;
+      } else {
+        Columns[i].computedWidth = builder.computeLengthSpec( Columns[i].width );
+        totalNonproportionalWidth += Columns[i].computedWidth;
+      }
+    } else
+      nonWidthCellsNum++;
+  }
+
+  if( totalProportionalUnits > 0 )
+    totalProportionalUnits += nonWidthCellsNum;
+  // cannot predict width of some cells, but their width is needed to 
+  // compute widths of proportional cells - force non-with cells to be 1 table-unit
+
+  double proportionalUnit = 0.0;
+  if( totalProportionalUnits )
+      proportionalUnit
+       = ( parentTable().tableWidth - totalNonproportionalWidth ) / totalProportionalUnits;
+  
+  for( size_t i = 0; i < Columns.size(); i++ ) {
+      if( Columns[i].hasWidth ) {
+          if( Columns[i].width.tableUnitFactor )
+              Columns[i].computedWidth
+               = long(proportionalUnit * Columns[i].width.tableUnitFactor);
+      } else if( totalProportionalUnits > 0 )
+          Columns[i].computedWidth = long(proportionalUnit);
+  }
+
+  // Compute display size of the column
+  for( size_t i = 0; i < Columns.size(); i++ ) {
+    if (Columns[i].computedWidth > 0) {
+      Columns[i].displaySize = Columns[i].computedWidth;
+      if (Columns[i].defaultCellBeforeColumnMargin != lengthUnspecified)
+       Columns[i].displaySize -= Columns[i].defaultCellBeforeColumnMargin;
+      
+      if (Columns[i].defaultCellAfterColumnMargin != lengthUnspecified)
+       Columns[i].displaySize -= Columns[i].defaultCellAfterColumnMargin;
+    }
+  }
+  
+  columnsProcessed = true;
+}
+
+void TeXFOTBuilder::TablePart::outContent( OutputByteStream &stream ) const {
+
+  stream << "\\TeXTable%\n{" << LengthInPoints( parentTable().tableWidth ) 
+         << "}{" << Columns.size() << "}{";
+
+  for( size_t i = 0; i < Columns.size(); i++ ) {
+    #ifdef TEXDEBUG
+      stream << "\nCOLUMN " << i << " DEF_LEFT_B: " <<  Columns[i].defaultTeXLeftBorder
+             << " DEF_RIGHT_B: " <<  Columns[i].defaultTeXRightBorder << "\n";
+    #endif
+    if( i == 0 && Columns[i].defaultTeXLeftBorder )
+      stream << '|';
+
+    //Cell before margin
+    if( Columns[i].computedWidth > 0 ) {
+      char alignment;
+      switch( Columns[i].displayAlignment ) {
+        case symbolOutside: 
+        case symbolEnd:
+         alignment =  'U';
+          break;
+        case symbolCenter: 
+         alignment = 'Y';
+         break;
+        case symbolInside:  
+        case symbolStart:
+        default:
+         alignment = 'T';
+          break;
+      }
+      stream << alignment << '{' 
+            << LengthInPoints(Columns[i].defaultCellBeforeColumnMargin)
+            << "}{" << LengthInPoints( Columns[i].displaySize ) 
+            << "}{" 
+            << LengthInPoints(Columns[i].defaultCellAfterColumnMargin) 
+            << '}';
+    } else {
+      stream << "@{\\hspace{" 
+            << LengthInPoints(Columns[i].defaultCellBeforeColumnMargin)
+            << "}}";
+
+      switch( Columns[i].displayAlignment ) {
+        case symbolOutside: 
+        case symbolEnd:     stream << 'r'; break;
+        case symbolCenter:  stream << 'c'; break;
+        case symbolInside:  
+        case symbolStart:
+        default:            stream << 'l'; break;
+      }
+      stream << "@{\\hspace{" 
+            << LengthInPoints(Columns[i].defaultCellAfterColumnMargin)
+            << "}}";
+    }
+    if( Columns[i].defaultTeXRightBorder )
+      stream << '|';
+  }
+  stream << "}%\n";
+
+  stream << HeaderProlog;
+  const Row *recentRow = NULL;
+  for( size_t i = 0; i < Header.size(); i++ ) {
+    Row::outVerticalBorders( recentRow, &Header[i], stream );
+    Header[i].out( stream );
+    recentRow = &Header[i];
+  }
+  stream << HeaderEpilog;
+
+  for( size_t i = 0; i < Body.size(); i++ ) {
+    Row::outVerticalBorders( recentRow, &Body[i], stream );
+    Body[i].out( stream );
+    recentRow = &Body[i];
+  }
+
+  stream << FooterProlog;
+  for( size_t i = 0; i < Footer.size(); i++ ) {
+    Row::outVerticalBorders( recentRow, &Footer[i], stream );
+    Footer[i].out( stream );
+    recentRow = &Footer[i];
+  }
+  stream << FooterEpilog;
+
+  if( recentRow )
+    Row::outVerticalBorders( recentRow, NULL, stream );
+
+  stream << "\\endTeXTable" << "{}%\n";
+}
+
+void TeXFOTBuilder::TablePart::normalizeRows() {
+
+  size_t maxCellsInRow = Columns.size()+1;
+  Vector<Row> *rows;  
+  for( int step = 0; step < 2; step++ ) {
+    for( int rowType = 0; rowType < 3; rowType++ ) {
+      switch( rowType ) {
+        case 0: rows = &Header; break;
+        case 1: rows = &Body; break;
+        default: rows = &Footer;
+      }
+      for( size_t r = 0; r < rows->size(); r++ ) {
+        if( step == 0 ) {
+          if( (*rows)[r].Cells.size() > 1 ) {
+            size_t lastCellIdx = (*rows)[r].Cells.size()-2;
+            Cell &lastCell = (*rows)[r].Cells[lastCellIdx];
+            if( !lastCell.missing
+                  &&
+                lastCellIdx+lastCell.nColumnsSpanned+1 > maxCellsInRow )
+              maxCellsInRow = lastCellIdx+lastCell.nColumnsSpanned+1;
+          }
+        } else if( (*rows)[r].Cells.size() < maxCellsInRow )
+          (*rows)[r].Cells.resize( maxCellsInRow );
+      }
+    }
+  }
+}
+
+// --------- TeXFOTBuilder::Row -----------------------------------------------
+
+void TeXFOTBuilder::Row::outContent( OutputByteStream &stream ) const {
+
+  bool first = true;
+  for( size_t i = 0; i + 1 < Cells.size(); i++ ) {
+    /* Output the overlapped cells in a row span but not
+       those in a column span.
+       
+       If the overlapping cell is both row and column spanning
+       only output the first cell in the row.
+    */
+    bool outputCell = !Cells[i].isOverlapped() ||
+      (Cells[i].OverlappingCell->nRowsSpanned > 1 && 
+       Cells[i].OverlappingCell->TeXTableColumnIdx == i);
+  
+    if( !first ) {
+      if (outputCell)
+       stream << "&";  
+    }
+    else
+      first = false;
+    if (outputCell)
+      Cells[i].out( stream );
+  }
+}
+  
+
+void TeXFOTBuilder::Row::outVerticalBorders
+ ( const TeXFOTBuilder::Row *upperRow, 
+   const TeXFOTBuilder::Row *lowerRow, OutputByteStream &stream ) {
+
+  assert( upperRow != NULL || lowerRow != NULL );
+  size_t colNum = upperRow ? upperRow->Cells.size()-1 : lowerRow->Cells.size()-1;
+  int borderStartIdx = -1;
+  int borderEndIdx;
+  for( size_t i = 0; i < colNum; i++ ) {
+    #ifdef TEXDEBUG
+      stream << "\nROW: " << "COL " << i << " " <<
+       ( ( ( upperRow && upperRow->Cells[i].singleRowAfterRowBorderPresent() )
+           ||
+          ( lowerRow && lowerRow->Cells[i].singleRowBeforeRowBorderPresent() ) )
+          ? "Border" : "No Border" );    
+    #endif
+    if( ( upperRow && upperRow->Cells[i].singleRowAfterRowBorderPresent() )
+         ||
+        ( lowerRow && lowerRow->Cells[i].singleRowBeforeRowBorderPresent() ) ) {
+      if( borderStartIdx < 0 )
+        borderStartIdx = i;
+      if( i == colNum-1 ) {
+        borderEndIdx = i;
+        goto OUT_BORDER;
+      }  
+   } else if( borderStartIdx > -1 ) {
+      borderEndIdx = i-1;
+      goto OUT_BORDER;
+   }
+   continue;
+
+    OUT_BORDER:    
+      if( borderStartIdx == 0 && i == colNum-1 )
+        stream << "\\Hline%\n";
+      else
+        stream << "\\Cline{" << borderStartIdx+1 << '-' << borderEndIdx+1 << "}%\n";
+      borderStartIdx = -1;
+  }
+}
+
+// --------- TeXFOTBuilder::Cell ----------------------------------------------
+
+void TeXFOTBuilder::Cell::outProlog( OutputByteStream &stream ) const
+{
+  if ( nColumnsSpanned > 1 || needsTeXColumnOverride ||
+       (rowAlignment != symbolNotApplicable &&
+       rowAlignment != symbolStart ) ||
+       cellBackground )
+  {
+    char color_buf[32];
+    if ( cellBackground ) {
+      double r,g,b;
+      r = (double)backgroundColor.red   / 255.0;
+      g = (double)backgroundColor.green / 255.0;
+      b = (double)backgroundColor.blue  / 255.0;
+      sprintf( color_buf, "{%.2f, %.2f, %.2f}", r, g, b );
+    }
+    else
+      strcpy( color_buf, "");
+
+    stream << "\\TeXTableCell{" << nColumnsSpanned << "}{";
+  
+    if( beforeColumnBorder.borderPresent )
+      stream << '|';
+
+    if (displaySize) {
+      char alignment;
+      switch( effectiveAlignment ) {
+      case symbolOutside: 
+      case symbolEnd:     
+       switch (rowAlignment) {
+       case symbolOutside:
+       case symbolEnd:
+         alignment = cellBackground ? '3' : 'M';
+         break;
+       case symbolCenter:
+         alignment = cellBackground ? '6' : 'J';
+         break;
+       case symbolInside:
+       case symbolStart:
+       default:
+         alignment = cellBackground ? '9' : 'U';
+         break;
+       }
+       break;
+      case symbolCenter:  
+       switch (rowAlignment) {
+       case symbolOutside:
+       case symbolEnd:
+         alignment = cellBackground ? '2' : 'N';
+         break;
+       case symbolCenter:
+         alignment = cellBackground ? '5' : 'H';
+         break;
+       case symbolInside:
+       case symbolStart:
+       default:
+         alignment = cellBackground ? '8' : 'Y';
+         break;
+       }
+       break;
+      case symbolInside:  
+      case symbolStart:
+      default:
+       switch (rowAlignment) {
+       case symbolOutside:
+       case symbolEnd:
+         alignment = cellBackground ? '1' : 'B';
+         break;
+       case symbolCenter:
+         alignment = cellBackground ? '4' : 'G';
+         break;
+       case symbolInside:
+       case symbolStart:
+       default:
+         alignment = cellBackground ? '7' : 'T';
+         break;
+       }
+       break;
+      } 
+      stream << alignment 
+            << '{' << LengthInPoints(effectiveBeforeColumnMargin) 
+            << "}{" << LengthInPoints(displaySize) << "}{"
+            << LengthInPoints(effectiveAfterColumnMargin) 
+            << '}' << color_buf;
+    }
+    else {
+      //cell-before-margin
+      stream << "@{\\hspace{" << LengthInPoints(effectiveBeforeColumnMargin) 
+            << "}}";
+      if ( cellBackground )
+       stream << ">{\\columncolor[rgb]" << color_buf << "}";
+      
+      switch (rowAlignment) {
+      case symbolOutside:
+      case symbolEnd:
+       stream << 'r';
+       break;
+      case symbolCenter:
+       stream << 'c';
+       break;
+      case symbolInside:
+      case symbolStart:
+      default:
+       stream << 'l';
+       break;
+      }
+      //cell-after-margin
+      stream << "@{\\hspace{" << LengthInPoints(effectiveAfterColumnMargin) 
+            << "}}";
+    }
+  
+    if( afterColumnBorder.borderPresent )
+      stream << '|';
+
+    stream << "}%\n{%\n";
+  }
+  
+  CompoundFotElement::outProlog( stream );
+}
+
+void TeXFOTBuilder::Cell::outEpilog( OutputByteStream &stream ) const {
+
+  CompoundFotElement::outEpilog( stream );
+  if ( nColumnsSpanned > 1 || needsTeXColumnOverride ||
+       (rowAlignment != symbolNotApplicable &&
+       rowAlignment != symbolStart ) ||
+       cellBackground )
+    stream << "}%\n";
+}
+
+void TeXFOTBuilder::Cell::computeOverridingTeXColumnBorders( TablePart &tablePart ) {
+
+  StrOutputByteStream str;
+
+  if( tablePart.Columns[TeXTableColumnIdx].defaultTeXLeftBorder
+       != beforeColumnBorder.borderPresent ) 
+    str << "\\def\\TeXTableCellBeforeColumnBorder{"  << beforeColumnBorder.borderPresent << '}';
+
+  if( tablePart.Columns[TeXTableColumnIdx+nColumnsSpanned-1].defaultTeXRightBorder
+       != afterColumnBorder.borderPresent ) 
+    str << "\\def\\TeXTableCellAfterColumnBorder{"  << afterColumnBorder.borderPresent << '}';
+
+  String<char> s;
+  str.extractString( s );
+  Characteristics += s;
+}
+
+void TeXFOTBuilder::Cell::computeTeXRowSpanFiller( TablePart &tablePart ) {
+
+  StrOutputByteStream str;
+
+  if ( isOverlapped() && OverlappingCell->nRowsSpanned > 1 )
+  {
+    // This isn't output automatically for overlapped cell
+    str << "\\def\\ColumnIndex{" << TeXTableColumnIdx <<'}';
+    str << "\\def\\TeXRowSpanFiller{1}";
+  }
+  
+  String<char> s;
+  str.extractString( s );
+  Characteristics += s;
+}
+
+void TeXFOTBuilder::Cell::computeEffectiveTeXColumnMargins( TablePart &tablePart ) {
+  effectiveBeforeColumnMargin = beforeColumnMargin != lengthUnspecified
+    ? beforeColumnMargin : 
+    tablePart.Columns[TeXTableColumnIdx].defaultCellBeforeColumnMargin;
+  if( effectiveBeforeColumnMargin != lengthUnspecified &&
+      (tablePart.Columns[TeXTableColumnIdx].defaultCellBeforeColumnMargin
+       != effectiveBeforeColumnMargin || nColumnsSpanned > 1) ) 
+    needsTeXColumnOverride = true;
+
+  
+  effectiveAfterColumnMargin = afterColumnMargin != lengthUnspecified 
+    ? afterColumnMargin :
+    tablePart.Columns[TeXTableColumnIdx].defaultCellAfterColumnMargin;
+  if( effectiveAfterColumnMargin != lengthUnspecified &&
+      (tablePart.Columns[TeXTableColumnIdx].defaultCellAfterColumnMargin
+       != effectiveAfterColumnMargin || nColumnsSpanned > 1) ) 
+    needsTeXColumnOverride = true;
+}
+
+void TeXFOTBuilder::Cell::computeEffectiveTeXCellWidth( TablePart &tablePart )
+{
+  displaySize = 0;
+  for (unsigned i = 0; i < nColumnsSpanned; i++ )
+    displaySize += tablePart.Columns[TeXTableColumnIdx + i].computedWidth;
+
+  if (displaySize)
+    displaySize -= effectiveBeforeColumnMargin + effectiveAfterColumnMargin;
+}
+
+bool TeXFOTBuilder::Cell::singleRowBeforeRowBorderPresent() const {
+
+  assert( OverlappingCell != NULL );
+  if( OverlappingCell->TeXTableRowIdx == TeXTableRowIdx )
+    return OverlappingCell->beforeRowBorder.borderPresent;
+  else
+    return false;    
+}
+
+bool TeXFOTBuilder::Cell::singleRowAfterRowBorderPresent() const {
+
+  assert( OverlappingCell != NULL );
+  assert( TeXTableRowIdx > -1 );
+  if( OverlappingCell->TeXTableRowIdx + OverlappingCell->nRowsSpanned
+       == ((unsigned)TeXTableRowIdx)+1 )
+    return OverlappingCell->afterRowBorder.borderPresent;
+  else
+    return false;    
+}
+
+bool TeXFOTBuilder::Cell::singleColumnBeforeColumnBorderPresent() const {
+
+  assert( OverlappingCell != NULL );
+  assert( TeXTableRowIdx > -1 );
+  if( OverlappingCell->TeXTableColumnIdx
+       == TeXTableColumnIdx )
+    return OverlappingCell->beforeColumnBorder.borderPresent;
+  else
+    return false;    
+}
+
+bool TeXFOTBuilder::Cell::singleColumnAfterColumnBorderPresent() const {
+
+  assert( OverlappingCell != NULL );
+  if( OverlappingCell->TeXTableColumnIdx + (int)OverlappingCell->nColumnsSpanned
+       == TeXTableColumnIdx+1 )
+    return OverlappingCell->afterColumnBorder.borderPresent;
+  else
+    return false;    
+}
+
+// --------- TeXFOTBuilder::Border --------------------------------------------
+
+void TeXFOTBuilder::Border::setFromFot( TeXFOTBuilder &builder ) {
+
+  const TeXFOTBuilder::Format &f = builder.curFormat();
+  borderPriority = f.FotBorderPriority;
+  borderPresent = f.FotBorderPresent;
+  lineThickness = f.FotLineThickness;
+  lineRepeat = f.FotLineRepeat;
+  lineSep  = f.FotLineSep;
+}
+
+void TeXFOTBuilder::Border::resolve( Border &adjacentBorder ) {
+    
+  if( adjacentBorder.borderPriority > borderPriority
+     ||
+    (   adjacentBorder.borderPriority == borderPriority 
+     && !adjacentBorder.cellBorder
+     && adjacentBorder.borderPresent ) ) {
+
+    lineThickness = adjacentBorder.lineThickness;
+    borderPresent = adjacentBorder.borderPresent;
+    lineRepeat = adjacentBorder.lineRepeat;
+    lineSep = adjacentBorder.lineSep;
+
+    if( adjacentBorder.cellBorder )
+        adjacentBorder.borderPresent = false;
+  }
+
+  #ifdef TEXDEBUG
+    *TeXFOTBuilder::curInstance().fileout_
+     << "RESOLVE_RESULT: " << borderPresent << "\n";
+  #endif
+}
+
+// --------- End Tables -------------------------------------------------------
+
+#define MAYBESET(name,value,default) (value!=default?(set(name,value),0):0)
+
+//
+// Get the current output stream.
+//
+inline
+OutputByteStream &TeXFOTBuilder::os()
+{
+  return  *(osStack_.back());
+}
+
+void
+TeXFOTBuilder::pushOs(OutputByteStream *to)
+{
+  osStack_.push_back( to );
+}
+
+void
+TeXFOTBuilder::popOs()
+{
+  assert( osStack_.size() > 0 );
+  osStack_.resize( osStack_.size() - 1);
+}
+
+//
+// Define an output operator for StringC
+//
+// FIXME This won't work for Unicode characters.
+
+static OutputByteStream &operator<<(OutputByteStream &os, const StringC &s)
+{
+  for (size_t i = 0; i < s.size(); i++)
+    os << char(s[i]);
+  return os;
+}
+
+
+//
+// Define an output operator for GroveString
+//
+static OutputByteStream &operator<<(OutputByteStream &os, const GroveString &s)
+{
+  for (size_t i = 0; i < s.size(); i++)
+    os << char(s[i]);
+  return os;
+}
+
+static OutputByteStream &operator<<(OutputByteStream &os, double d)
+{
+  char buf[64];
+  sprintf(buf, "%g", d);
+  return os << buf;
+}
+
+FOTBuilder *makeTeXFOTBuilder(OutputByteStream *os, Messenger *mgr,
+                             const FOTBuilder::Extension *&ext)
+{  
+  static const TeXFOTBuilder::PageFloatFlowObj pageFloat;
+  static const TeXFOTBuilder::PageFootnoteFlowObj pageFootnote;
+  static const FOTBuilder::Extension extensions[] = {
+    {
+      "UNREGISTERED::Sebastian Rahtz//Flow Object Class::page-float",
+      0,
+      0,
+      0,
+      0,
+      &pageFloat
+    },
+    {
+      "UNREGISTERED::Sebastian Rahtz//Flow Object Class::page-footnote",
+      0,
+      0,
+      0,
+      0,
+      &pageFootnote
+    },
+    {
+      "UNREGISTERED::James Clark//Characteristic::page-number-format",
+      0,
+      (void (FOTBuilder::*)(const StringC &))&TeXFOTBuilder::setPageNumberFormat,
+      0,
+      0
+    },
+    {
+      "UNREGISTERED::James Clark//Characteristic::page-number-restart?",
+      (void (FOTBuilder::*)(bool))&TeXFOTBuilder::setPageNumberRestart,
+      0,
+      0
+    },
+    {
+      "UNREGISTERED::James Clark//Characteristic::page-n-columns",
+      0,
+      0,
+      (void (FOTBuilder::*)(long))&TeXFOTBuilder::setPageNColumns,
+      0
+    },
+    {
+      "UNREGISTERED::James Clark//Characteristic::page-column-sep",
+      0,
+      0,
+      0,
+      (void (FOTBuilder::*)(FOTBuilder::Length))&TeXFOTBuilder::setPageColumnSep,
+    },
+    {
+      "UNREGISTERED::James Clark//Characteristic::page-balance-columns?",
+      (void (FOTBuilder::*)(bool))&TeXFOTBuilder::setPageBalanceColumns,
+      0,
+      0
+    },
+    {
+      "UNREGISTERED::OpenJade//Characteristic::page-two-side?",
+      (void (FOTBuilder::*)(bool))&TeXFOTBuilder::setPageTwoSide,
+      0,
+      0
+    },
+    {
+      "UNREGISTERED::OpenJade//Characteristic::two-side-start-on-right?",
+      (void (FOTBuilder::*)(bool))&TeXFOTBuilder::setTwoSideStartOnRight,
+      0,
+      0
+    },
+    {
+      "UNREGISTERED::James Clark//Characteristic::subscript-depth",
+      0,
+      0,
+      0,
+      (void (FOTBuilder::*)(FOTBuilder::Length))&TeXFOTBuilder::setSubscriptDepth,
+    },
+    {
+      "UNREGISTERED::James Clark//Characteristic::over-mark-height",
+      0,
+      0,
+      0,
+      (void (FOTBuilder::*)(FOTBuilder::Length))&TeXFOTBuilder::setOverMarkHeight,
+    },
+    {
+      "UNREGISTERED::James Clark//Characteristic::under-mark-depth",
+      0,
+      0,
+      0,
+      (void (FOTBuilder::*)(FOTBuilder::Length))&TeXFOTBuilder::setUnderMarkDepth,
+    },
+    {
+      "UNREGISTERED::James Clark//Characteristic::superscript-height",
+      0,
+      0,
+      0,
+      (void (FOTBuilder::*)(FOTBuilder::Length))&TeXFOTBuilder::setSuperscriptHeight,
+    },
+    {
+      "UNREGISTERED::James Clark//Characteristic::grid-row-sep",
+      0,
+      0,
+      0,
+      (void (FOTBuilder::*)(FOTBuilder::Length))&TeXFOTBuilder::setGridRowSep,
+    },
+    {
+      "UNREGISTERED::James Clark//Characteristic::grid-column-sep",
+      0,
+      0,
+      0,
+      (void (FOTBuilder::*)(FOTBuilder::Length))&TeXFOTBuilder::setGridColumnSep,
+    },
+    {
+      "UNREGISTERED::James Clark//Characteristic::heading-level",
+      0,
+      0,
+      (void (FOTBuilder::*)(long))&TeXFOTBuilder::setHeadingLevel,
+      0
+    },
+    {
+      "UNREGISTERED::James Clark//Characteristic::preserve-sdata?",
+      (void (FOTBuilder::*)(bool))&TeXFOTBuilder::setPreserveSdata,
+      0,
+      0,
+      0,
+      0
+    },
+
+    { 0, 0, 0}
+  };
+  ext = extensions;
+  return new TeXFOTBuilder(os, mgr);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Constructor and Destructor
+////////////////////////////////////////////////////////////////////////
+
+TeXFOTBuilder::TeXFOTBuilder(OutputByteStream *o, Messenger *mgr)
+: fileout_(o), mgr_(mgr), preserveSdata_(1)
+#ifdef OUTLINES
+,inHeading_(0),headingSet_(0),lastHeaded_(0)
+#endif
+,inMath_(0)
+{
+  #ifdef TEXDEBUG
+    CurInstance = this;
+  #endif
+  NextFormat.FotCurDisplaySize = Format::INITIAL_PAGE_SIZE();
+  FormatStack.push_back( NextFormat );
+  pushFotElementState();
+  pushOs(o);
+  os() << "\\FOT{3}";
+#ifdef OUTLINES
+  return_ += Char('\n');
+  protectedChar_ += Char('\\');
+  protectedChar_ += Char('?');
+#endif
+}
+
+TeXFOTBuilder::~TeXFOTBuilder()
+{
+  os() << "\\endFOT{}";
+}
+
+//////////////////////////////////////////////////////////////////////
+// Atomic flow objects
+//////////////////////////////////////////////////////////////////////
+#ifdef OUTLINES
+//FIXME Que faire avec les characteres > 256
+#endif
+void TeXFOTBuilder::characters(const Char *s, size_t n)
+{
+  for (; n > 0; n--, s++) {
+                               // Since TeX has only 256 characters
+                               // by default, two-byte characters
+                               // will need special treatment.
+    if (*s > 255) {
+      //      set("Ch",(unsigned long)(*s));
+      // insertAtomic("Character");
+      //
+      // Don't complicate matters, just give the character!
+       os() << "\\Character{" << (unsigned long)(*s) << "}";
+    } else {
+                               // Otherwise, check for special
+                               // TeX escapes.
+      switch(*s) {
+      default:
+       os() << char(*s);
+#ifdef OUTLINES
+       if (needToCollect()){
+         addHeadedText(s,1);
+         //top(parStack_).headingText_.append(s,1);
+       }
+#endif
+       break;
+      case ' ':
+      case '\t':
+       if ( NextFormat.FotLines == symbolAsis )
+         os() << '~';
+       else
+         os() << char(*s);
+#ifdef OUTLINES
+       if (needToCollect()){
+         addHeadedText(s,1);
+         //top(parStack_).headingText_.append(s,1);
+       }
+#endif
+       break;
+      case '\\':
+      case '^':
+      case '_':
+      case '~':
+       os() << "\\char" << int(*s) << "{}";
+#ifdef OUTLINES
+       if (needToCollect()){
+         addHeadedText(s,1);
+         //top(parStack_).headingText_.append(s,1);
+       }
+#endif
+       break;
+      case '{':
+      case '}':
+      case '$':
+      case '&':
+      case '#':
+      case '%':
+       os() << "\\" << char(*s);
+#ifdef OUTLINES
+       if (needToCollect()){
+         protectedChar_[1]=*s;
+         addHeadedText(protectedChar_);
+         //top(parStack_).headingText_ += protectedChar_;
+       }
+#endif
+       break;
+      case '\r':
+       os() << '\n';
+#ifdef OUTLINES
+       if (needToCollect()){
+         addHeadedText(return_);
+         //top(parStack_).headingText_ += return_;
+       }
+#endif
+       break;
+      case '\n':
+       break;
+      case '-':
+      case '<':
+      case '>':
+        os() << char(*s);   
+       if (!inMath_)
+          os() << "\\/"; // break ligatures
+        break;
+      }
+    }
+  }
+}
+
+void TeXFOTBuilder::character(const CharacterNIC &nic)
+{
+  setCharacterNIC(nic);
+  //  insertAtomic("Character");
+  dumpInherited();
+  os() << "\\Character{" << (unsigned long)(nic.ch) << "}";
+}
+
+void TeXFOTBuilder::paragraphBreak(const ParagraphNIC &nic)
+{
+  setParagraphNIC(nic);
+  insertAtomic("ParagraphBreak");
+}
+
+void TeXFOTBuilder::externalGraphic(const ExternalGraphicNIC &nic)
+{
+  setExternalGraphicNIC(nic);
+  insertAtomic("ExternalGraphic");
+}
+
+void TeXFOTBuilder::rule(const RuleNIC &nic)
+{
+  setRuleNIC(nic);
+  insertAtomic("Rule");
+}
+
+void TeXFOTBuilder::alignmentPoint()
+{
+  insertAtomic("AlignmentPoint");
+}
+
+// page-number sosofo
+void TeXFOTBuilder::pageNumber()
+{
+  insertAtomic("PageNumber");
+}
+
+void TeXFOTBuilder::formattingInstruction (const StringC &instr)
+{
+  os() << instr;
+}
+  
+void TeXFOTBuilder::tableColumn(const TableColumnNIC &nic)
+{
+  setTableColumnNIC(nic);
+
+  if( nic.columnIndex >= curTable().curTablePart().Columns.size() )
+    curTable().curTablePart().Columns.resize( nic.columnIndex + 1 );
+
+  Column &col = curTable().curTablePart().Columns[nic.columnIndex];
+
+  col.isExplicit = true;
+  col.hasWidth = nic.hasWidth;
+  if( nic.hasWidth )
+      col.width = nic.width;
+
+  if ( curFormat().FotDisplayAlignment != symbolNotApplicable )
+      col.displayAlignment = curFormat().FotDisplayAlignment;
+  if ( curFormat().FotCellBeforeColumnMargin != lengthUnspecified )
+    col.defaultCellBeforeColumnMargin = curFormat().FotCellBeforeColumnMargin;
+  if ( curFormat().FotCellAfterColumnMargin != lengthUnspecified )
+    col.defaultCellAfterColumnMargin = curFormat().FotCellAfterColumnMargin;
+
+  insertAtomic("TableColumn");
+}
+
+void TeXFOTBuilder::tableCellBeforeRowBorder()
+{
+  start();
+  curTable().curCell().beforeRowBorder.setFromFot( *this );
+  insertAtomic( curTable().curCell().beforeRowBorder );
+  end();
+}
+
+void TeXFOTBuilder::tableCellAfterRowBorder()
+{
+  start();
+  curTable().curCell().afterRowBorder.setFromFot( *this );
+  insertAtomic( curTable().curCell().afterRowBorder );
+  end();
+}
+
+void TeXFOTBuilder::tableCellBeforeColumnBorder()
+{
+  start();
+  curTable().curCell().beforeColumnBorder.setFromFot( *this );
+  insertAtomic( curTable().curCell().beforeColumnBorder );
+  end();
+}
+
+void TeXFOTBuilder::tableCellAfterColumnBorder()
+{
+  start();
+  curTable().curCell().afterColumnBorder.setFromFot( *this );
+  insertAtomic( curTable().curCell().afterColumnBorder );
+  end();
+}
+
+void TeXFOTBuilder::fractionBar()
+{
+  insertAtomic("FractionBar");
+}
+
+void TeXFOTBuilder::radicalRadical(const CharacterNIC &c)
+{
+  setCharacterNIC(c);
+  insertAtomic("RadicalRadical");
+}
+
+void TeXFOTBuilder::radicalRadicalDefaulted()
+{
+  insertAtomic("RadicalRadicalDefaulted");
+}
+
+void TeXFOTBuilder::currentNodePageNumber(const NodePtr &node)
+{
+  GroveString id;
+  unsigned long ei;
+
+  // FIX ME!
+  // Only PARTIALLY supported -- I currently allow cross-references
+  // only to elements.
+  if (node->getId(id) == accessOK) {
+    set("Label",id);
+  } else if (node->elementIndex(ei) == accessOK) {
+    set("Element",ei);
+  } else {
+    message(TeXMessages::unsupportedPageNumberNonElement);
+    return;
+  }
+  unsigned long g = node->groveIndex();
+  if (g) {
+    set("GroveIndex",g);
+  }
+  insertAtomic("CurrentNodePageNumber");
+}
+
+
+//////////////////////////////////////////////////////////////////////
+// Non-atomic flow objects
+//////////////////////////////////////////////////////////////////////
+
+void TeXFOTBuilder::startSequence()
+{
+  start();
+  if( !curFotElementState().enforcingStructure() )
+    startGroup("Seq");
+}
+
+void TeXFOTBuilder::endSequence()
+{
+  if( !curFotElementState().enforcingStructure() )
+    endGroup("Seq");
+  end();
+}
+
+void TeXFOTBuilder::startLineField(const LineFieldNIC &nic)
+{
+  start();
+  setLineFieldNIC(nic);
+  startGroup("LineField");
+}
+
+void TeXFOTBuilder::endLineField()
+{
+  endGroup("LineField");
+  end();
+}
+
+void TeXFOTBuilder::startParagraph(const ParagraphNIC &nic)
+{
+  startDisplay( nic );
+  start();
+  setParagraphNIC(nic);
+#ifdef OUTLINES
+  if (headingSet_){
+    startGroup("HeadPar");
+    headingSet_=0;
+    inHeading_=1;
+    top(parStack_).previous_=lastHeaded_;
+    lastHeaded_=parStack_.size() - 1 ;
+    //assert(lastHeaded_!=0);
+  }
+  else{
+    ParHead par(0);
+    startGroup("Par");
+    push(parStack_,par);
+    top(parStack_).previous_=lastHeaded_;
+  }
+#else
+  startGroup("Par");
+#endif
+}
+
+void TeXFOTBuilder::endParagraph()
+{
+  //FIXME : when (headed (level n) (headed level (+ n 1)))
+  // text for level N+1 is emitted before text for level n
+  // and outliens are out of sync.
+#ifdef OUTLINES
+  if (top(parStack_).isHeaded_){
+    //cerr << "Writing\n";
+    //cerr << "length : "<<top(parStack_).headingText_.size();
+    os() << "\\def\\HeadingText{%\n"
+        << top(parStack_).headingText_
+        <<"}%\n";
+    endGroup("HeadPar");
+    //    headingText_.resize(0);
+    inHeading_=0;
+    
+  }
+  else{
+    //cerr << "Non Writing\n";
+    endGroup("Par");
+  }
+  lastHeaded_=top(parStack_).previous_;
+  pop(parStack_);
+#else
+  endDisplay();
+#endif
+  end();
+  endDisplay();
+}
+void TeXFOTBuilder::startDisplayGroup(const DisplayGroupNIC &nic)
+{
+  startDisplay( nic );
+  start();
+  setDisplayGroupNIC(nic);
+  startGroup("DisplayGroup");
+}
+
+void TeXFOTBuilder::endDisplayGroup()
+{
+  endGroup("DisplayGroup");
+  end();
+  endDisplay();
+}
+
+void TeXFOTBuilder::startScroll()
+{
+  start();
+  startGroup("Scroll");
+}
+
+void TeXFOTBuilder::endScroll()
+{
+  endGroup("Scroll");
+  end();
+}
+
+void TeXFOTBuilder::startScore(Char ch)
+{
+  start();
+  set("ScoreCharacter",(unsigned long)ch);
+  startGroup("Score");
+}
+
+void TeXFOTBuilder::startScore(const LengthSpec &len)
+{
+  start();
+  set("ScoreLength",len);
+  startGroup("Score");
+}
+
+void TeXFOTBuilder::startScore(Symbol type)
+{
+  start();
+  set("ScoreType",type);
+  startGroup("Score");
+}
+
+void TeXFOTBuilder::endScore()
+{
+  endGroup("Score");
+  end();
+}
+
+void TeXFOTBuilder::startLeader(const LeaderNIC &nic)
+{
+  start();
+  setLeaderNIC(nic);
+  startGroup("Leader");
+}
+
+void TeXFOTBuilder::endLeader()
+{
+  endGroup("Leader");
+  end();
+}
+
+void TeXFOTBuilder::startSideline()
+{
+  start();
+  startGroup("SideLine");
+}
+
+void TeXFOTBuilder::endSideline()
+{
+  endGroup("SideLine");
+  end();
+}
+
+void TeXFOTBuilder::startBox(const BoxNIC &nic)
+{
+  if( nic.isDisplay ) {
+    DisplayBoxLevels.push_back( FormatStack.size() );
+    startDisplay(nic);
+  }
+  start();
+  setBoxNIC(nic);
+  startGroup("BOX");
+}
+
+void TeXFOTBuilder::endBox()
+{
+  endGroup("BOX");
+  end();
+  if( DisplayBoxLevels.size() > 0 && DisplayBoxLevels.back() == FormatStack.size() ) {
+    DisplayBoxLevels.resize( DisplayBoxLevels.size() - 1 );
+    endDisplay();
+  }
+}
+
+// Tables
+void TeXFOTBuilder::startTable(const TableNIC &nic)
+{
+  #ifdef TEXDEBUG
+    *fileout_ << "\nTABLE_START\n";
+  #endif
+  TableStack.resize( TableStack.size() + 1 );
+  startDisplay( nic );
+  start();
+  
+  setTableNIC(nic);
+
+  Length curStartIndent = computeLengthSpec( curFormat().FotStartIndentSpec );
+  curTable().startIndent = curStartIndent;
+
+  startGroup( curTable() );
+  curTable().open( *this);
+  curTable().begin();
+  if ( curFormat().FotDisplayAlignment != symbolNotApplicable )
+      curTable().displayAlignment = curFormat().FotDisplayAlignment;
+
+  if( nic.widthType == TableNIC::widthExplicit )
+      curTable().tableWidth = computeLengthSpec( nic.width );
+  else
+      curTable().tableWidth
+       = curFormat().FotCurDisplaySize - curStartIndent
+          - computeLengthSpec( curFormat().FotEndIndentSpec );
+
+  curTable().curTablePart().open( *this );
+}
+
+void TeXFOTBuilder::endTable()
+{
+  assert( TableStack.size() > 0 );
+  #ifdef TEXDEBUG
+    *fileout_ << "\nTABLE_END\n";
+  #endif
+
+  if( curTable().NoTablePartsSeen ) {
+    curTable().curTablePart().close( *this );
+    curTable().curTablePart().isExplicit = false;
+  }
+
+  curTable().end( *this );
+  curTable().close( *this );
+  curTable().out( os() );
+  
+  endGroup();
+  end();
+  endDisplay();
+
+  TableStack.resize( TableStack.size() - 1 );
+}
+
+// A call for each border is made immediately
+// after startTable(), each preceded by any appropriate set*() calls.
+void TeXFOTBuilder::tableBeforeRowBorder()
+{
+  start();
+  curTable().beforeRowBorder.setFromFot( *this );
+  insertAtomic( curTable().beforeRowBorder );
+  end();
+}
+
+void TeXFOTBuilder::tableAfterRowBorder()
+{
+  start();
+  curTable().afterRowBorder.setFromFot( *this );
+  insertAtomic( curTable().afterRowBorder );
+  end();
+}
+
+void TeXFOTBuilder::tableBeforeColumnBorder()
+{
+  start();
+  curTable().beforeColumnBorder.setFromFot( *this );
+  insertAtomic( curTable().beforeColumnBorder );
+  end();
+}
+
+void TeXFOTBuilder::tableAfterColumnBorder()
+{
+  start();
+  curTable().afterColumnBorder.setFromFot( *this );
+  insertAtomic( curTable().afterColumnBorder );
+  end();
+}
+
+void TeXFOTBuilder::startTablePartSerial(const TablePartNIC &nic)
+{
+  #ifdef TEXDEBUG
+    *fileout_ << "\nTABLE_PART_START\n";
+  #endif
+
+  startDisplay( nic );
+  start();
+
+  setTablePartNIC(nic);
+
+  if( curTable().NoTablePartsSeen ) {
+      curTable().NoTablePartsSeen = false;
+      /* begin() was arleady called from Table() and 
+        open() was called from startTable() */
+  }
+  else {
+      curTable().TableParts.resize( curTable().TableParts.size()+1 );
+      curTable().TableParts.back().setSiblingSeqIdx( curTable().TableParts.size()-1 );
+      curTable().TableParts.back().setParent( &curTable() );    
+
+      curTable().TableParts.back().begin();    
+      curTable().TableParts.back().open( *this );    
+  }
+  startGroup( curTable().curTablePart() );
+}
+
+void TeXFOTBuilder::endTablePartSerial()
+{
+  curTable().curTablePart().close( *this );
+  curTable().CurTablePart = NULL;
+  endGroup();
+  end();
+  endDisplay();
+
+  #ifdef TEXDEBUG
+    *fileout_ << "\nTABLE_PART_END\n";
+  #endif
+}
+
+void TeXFOTBuilder::startTableRow()
+{
+  #ifdef TEXDEBUG
+    *fileout_ << "\nTABLE_ROW_START\n";
+  #endif
+
+  curTable().curRows().resize( curTable().curRows().size() + 1 );
+  curTable().curRows().back().setSiblingSeqIdx( curTable().curRows().size()-1 );
+  curTable().curRows().back().setParent( &curTable().curTablePart() );
+  startGroup( curTable().curRows().back() );
+  curTable().curRows().back().open( *this );
+}
+
+void TeXFOTBuilder::endTableRow()
+{
+  curTable().curRows().back().close( *this );
+  endGroup();
+
+  #ifdef TEXDEBUG
+    *fileout_ << "\nTABLE_ROW_END\n";
+  #endif
+}
+
+/* 
+ * FIXME: We are getting one extra table cell in each
+ * row whic nic.missing set . What is this ???
+ */
+void TeXFOTBuilder::startTableCell(const TableCellNIC &nic)
+{
+  #ifdef TEXDEBUG
+    *fileout_ << "\nTABLE_CELL_START index: " << nic.columnIndex
+              << " missing: " << nic.missing << "\n";
+  #endif
+
+  setTableCellNIC(nic);
+
+  TablePart &tp = curTable().curTablePart();
+  if( !tp.columnsProcessed )
+      tp.processColumns( *this );
+  Vector<Cell> &Cells = curTable().curRows().back().Cells;
+  { size_t curSize = Cells.size();
+    if( nic.columnIndex >= curSize ) {
+        Cells.resize( nic.columnIndex + 1 );
+        for( size_t i = curSize; i < Cells.size(); i++ )
+          Cells[i].setSiblingSeqIdx( i );
+    }
+  }
+
+  Cell &cell = Cells[nic.columnIndex];
+  curTable().CurCell = &cell;
+  cell.missing = nic.missing;
+  cell.setParent( &curTable().curRows().back() );
+
+  if( nic.nColumnsSpanned != 1 )
+      cell.nColumnsSpanned = nic.nColumnsSpanned;
+
+  if( nic.nRowsSpanned != 1 )
+      cell.nRowsSpanned = nic.nRowsSpanned;
+
+  for( size_t i = nic.columnIndex; i < nic.columnIndex + nic.nColumnsSpanned; i++ )
+  {
+    if( i >= tp.Columns.size() && !nic.missing ) {
+      tp.Columns.resize( tp.Columns.size() + 1 ); 
+      tp.Columns.back().hasWidth = false;
+      tp.Columns.back().isExplicit = false;
+      tp.columnsProcessed = false;
+    }
+  }
+  // We may need reprocessing
+  if( !tp.columnsProcessed )
+      tp.processColumns( *this );
+
+  if ( !nic.missing ) {
+    if ( NextFormat.FotCellRowAlignment != symbolNotApplicable )
+      cell.rowAlignment = NextFormat.FotCellRowAlignment;
+    if ( NextFormat.FotCellBeforeColumnMargin != lengthUnspecified )
+      cell.beforeColumnMargin = NextFormat.FotCellBeforeColumnMargin;
+    if ( NextFormat.FotCellAfterColumnMargin != lengthUnspecified )
+      cell.afterColumnMargin = NextFormat.FotCellAfterColumnMargin;
+
+    if (NextFormat.FotCellBackground) {
+      cell.cellBackground = true;
+      cell.backgroundColor = NextFormat.FotBackgroundColor;
+    }
+  
+    cell.TeXTableColumnIdx = nic.columnIndex;
+    cell.effectiveAlignment = tp.Columns[nic.columnIndex].displayAlignment;
+    cell.computeEffectiveTeXColumnMargins( tp );
+    cell.computeEffectiveTeXCellWidth( tp );
+
+    NextFormat.FotCurDisplaySize = cell.displaySize;
+  }
+  
+  elementStart( oc_Cell );
+  startGroup( cell );
+  cell.open( *this );
+}
+
+void TeXFOTBuilder::endTableCell()
+{
+  curTable().curCell().close( *this );
+  curTable().CurCell = NULL;
+  endGroup();
+  end();
+
+  #ifdef TEXDEBUG
+    *fileout_ << "\nTABLE_CELL_END\n";
+  #endif
+}
+
+void TeXFOTBuilder::startSimplePageSequenceSerial()
+{
+  NextFormat.FotCurDisplaySize
+   = ( NextFormat.FotPageWidth - NextFormat.FotLeftMargin - NextFormat.FotRightMargin
+        - NextFormat.FotPageColumnSep * ( NextFormat.FotPageNColumns - 1 ) )  
+      / NextFormat.FotPageNColumns;
+
+  start();
+  startGroup("SpS");
+}
+
+void TeXFOTBuilder::endSimplePageSequenceSerial()
+{
+  endGroup("SpS");
+  end();
+}
+
+// These aren't real flow objects, so handle them a little
+// differently.
+void TeXFOTBuilder::startSimplePageSequenceHeaderFooter(unsigned flags)
+{
+  os() << "\n\\SpS";
+  if ((flags & (firstHF|otherHF)) == firstHF)
+    os() << "First";
+  else
+    os() << "Other";
+  if ((flags & (frontHF|backHF)) == frontHF)
+    os() << "Front";
+  else
+    os() << "Back";
+  switch (flags & (leftHF|centerHF|rightHF)) {
+  case leftHF:
+    os() << "Left";
+    break;
+  case centerHF:
+    os() << "Center";
+    break;
+  case rightHF:
+    os() << "Right";
+    break;
+  }
+  if ((flags & (headerHF|footerHF)) == headerHF)
+    os() << "Header";
+  else
+    os() << "Footer";
+  os() << "%\n{";
+}
+
+void TeXFOTBuilder::endSimplePageSequenceHeaderFooter(unsigned)
+{
+  endSimpleGroup();
+}
+
+void TeXFOTBuilder::startTablePartHeader()
+{
+  curTable().CurRows = &curTable().curTablePart().Header; 
+  startGroup( "TablePartHeader", &curTable().curTablePart().HeaderProlog );
+}
+
+void TeXFOTBuilder::endTablePartHeader()
+{
+  curTable().CurRows = &curTable().curTablePart().Body; 
+  endGroup( "TablePartHeader", &curTable().curTablePart().HeaderEpilog );
+}
+
+void TeXFOTBuilder::startTablePartFooter()
+{
+  curTable().CurRows = &curTable().curTablePart().Footer; 
+  startGroup( "TablePartFooter", &curTable().curTablePart().FooterProlog );
+}
+
+void TeXFOTBuilder::endTablePartFooter()
+{
+  curTable().CurRows = &curTable().curTablePart().Body; 
+  endGroup( "TablePartFooter", &curTable().curTablePart().FooterEpilog );
+}
+
+void TeXFOTBuilder::startMathSequence()
+{
+  inMath_++;
+  startGroup("MathSeq");
+}
+
+void TeXFOTBuilder::endMathSequence()
+{
+  endGroup("MathSeq");
+  inMath_++;
+}
+
+void TeXFOTBuilder::startFractionSerial()
+{
+  startGroup("FractionSerial");
+}
+
+void TeXFOTBuilder::endFractionSerial()
+{
+  endGroup("FractionSerial");
+}
+
+void TeXFOTBuilder::startFractionNumerator()
+{
+  startGroup("FractionNumerator");
+}
+
+void TeXFOTBuilder::endFractionNumerator()
+{
+  endGroup("FractionNumerator");
+}
+
+void TeXFOTBuilder::startFractionDenominator()
+{
+  startGroup("FractionDenominator");
+}
+
+void TeXFOTBuilder::endFractionDenominator()
+{
+  endGroup("FractionDenominator");
+}
+
+void TeXFOTBuilder::startUnmath()
+{
+  startBrace("Unmath");
+}
+
+void TeXFOTBuilder::endUnmath()
+{
+  endBrace("Unmath");
+}
+
+void TeXFOTBuilder::startSuperscript()
+{ 
+   startBrace("Superscript");
+}
+
+void TeXFOTBuilder::endSuperscript()
+{
+  endBrace("Superscript");
+}
+
+void TeXFOTBuilder::startSubscript()
+{
+  startBrace("Subscript");
+}
+
+void TeXFOTBuilder::endSubscript()
+{
+  endBrace("Subscript");
+}
+void TeXFOTBuilder::startScriptSerial()
+{
+  startBrace("ScriptSerial");
+}
+
+void TeXFOTBuilder::endScriptSerial()
+{
+}
+
+void TeXFOTBuilder::startScriptPreSup()
+{
+  closeopenBrace("ScriptPreSup"); // ends brace started in startScript Serial
+}
+
+void TeXFOTBuilder::endScriptPreSup()
+{
+  endSimpleGroup();
+}
+
+void TeXFOTBuilder::startScriptPreSub()
+{
+  startSimpleGroup("ScriptPreSub");
+}
+
+void TeXFOTBuilder::endScriptPreSub()
+{
+  endSimpleGroup();
+}
+
+void TeXFOTBuilder::startScriptPostSup()
+{
+  startSimpleGroup("ScriptPostSup");
+}
+
+void TeXFOTBuilder::endScriptPostSup()
+{
+  endSimpleGroup();
+}
+
+void TeXFOTBuilder::startScriptPostSub()
+{
+  startSimpleGroup("ScriptPostSub");
+}
+
+void TeXFOTBuilder::endScriptPostSub()
+{
+  endSimpleGroup();
+}
+
+void TeXFOTBuilder::startScriptMidSup()
+{
+  startSimpleGroup("ScriptMidSup");
+}
+
+void TeXFOTBuilder::endScriptMidSup()
+{
+  endSimpleGroup();
+}
+
+void TeXFOTBuilder::startScriptMidSub()
+{
+  startSimpleGroup("ScriptMidSub");
+}
+
+void TeXFOTBuilder::endScriptMidSub()
+{
+  endSimpleGroup();
+}
+
+void TeXFOTBuilder::startMarkSerial()
+{
+  startGroup("MarkSerial");
+}
+
+void TeXFOTBuilder::endMarkSerial()
+{
+  endGroup("MarkSerial");
+}
+
+void TeXFOTBuilder::startMarkOver()
+{
+  startGroup("MarkOver");
+}
+
+void TeXFOTBuilder::endMarkOver()
+{
+  endGroup("MarkOver");
+}
+
+void TeXFOTBuilder::startMarkUnder()
+{
+  startGroup("MarkUnder");
+}
+
+void TeXFOTBuilder::endMarkUnder()
+{
+  endGroup("MarkUnder");
+}
+
+void TeXFOTBuilder::startFenceSerial()
+{
+  startBrace("FenceSerial");
+}
+
+void TeXFOTBuilder::endFenceSerial()
+{
+    //  endGroup("FenceSerial");
+}
+
+void TeXFOTBuilder::startFenceOpen()
+{
+  // Extra closing brace for end of fence body
+  closeopenBrace("FenceOpen");
+}
+
+void TeXFOTBuilder::endFenceOpen()
+{
+  endSimpleGroup();
+}
+
+void TeXFOTBuilder::startFenceClose()
+{
+  startSimpleGroup("FenceClose");
+}
+
+void TeXFOTBuilder::endFenceClose()
+{
+  endSimpleGroup();
+}
+
+void TeXFOTBuilder::startRadicalSerial()
+{
+  startGroup("RadicalSerial");
+}
+
+void TeXFOTBuilder::endRadicalSerial()
+{
+  endGroup("RadicalSerial");
+}
+
+void TeXFOTBuilder::startRadicalDegree()
+{
+  startGroup("RadicalDegree");
+}
+
+void TeXFOTBuilder::endRadicalDegree()
+{
+  endGroup("RadicalDegree");
+}
+
+void TeXFOTBuilder::startMathOperatorSerial()
+{
+  startGroup("MathOperatorSerial");
+}
+
+void TeXFOTBuilder::endMathOperatorSerial()
+{
+  endGroup("MathOperatorSerial");
+}
+
+void TeXFOTBuilder::startMathOperatorOperator()
+{
+  startGroup("MathOperatorOperator");
+}
+
+void TeXFOTBuilder::endMathOperatorOperator()
+{
+  endGroup("MathOperatorOperator");
+}
+
+void TeXFOTBuilder::startMathOperatorLowerLimit()
+{
+  startGroup("MathOperatorLowerLimit");
+}
+
+void TeXFOTBuilder::endMathOperatorLowerLimit()
+{
+  endGroup("MathOperatorLowerLimit");
+}
+
+void TeXFOTBuilder::startMathOperatorUpperLimit()
+{
+  startGroup("MathOperatorUpperLimit");
+}
+
+void TeXFOTBuilder::endMathOperatorUpperLimit()
+{
+  endGroup("MathOperatorUpperLimit");
+}
+
+void TeXFOTBuilder::startGrid(const GridNIC &nic)
+{
+  setGridNIC(nic);
+  startGroup("Grid");
+}
+
+void TeXFOTBuilder::endGrid()
+{
+  endGroup("Grid");
+}
+
+void TeXFOTBuilder::startGridCell(const GridCellNIC &nic)
+{
+  setGridCellNIC(nic);
+  startGroup("GridCell");
+}
+
+void TeXFOTBuilder::endGridCell()
+{
+  endGroup("GridCell");
+}
+
+void TeXFOTBuilder::startNode(const NodePtr &node,
+                             const StringC &processingMode)
+{
+  GroveString id;
+  unsigned long ei;
+
+  if (node->getId(id) == accessOK) {
+    set("Label",id);
+  }
+  else if (node->elementIndex(ei) == accessOK) {
+    set("Element", ei);
+  }
+  unsigned long g = node->groveIndex();
+  if (g) {
+    set("GroveIndex", g);
+  }
+  if (processingMode.size()) {
+    set("ProcessingMode", processingMode);
+  }
+
+  if( curFotElementState().enforcingStructure() ) {
+    startGroup( "Node", &(curFotElementState().CurNodeInfoProlog) );
+    #ifdef TEXDEBUG
+      *fileout_ << "\nSTART_NODE " << ei << "\n";
+    #endif
+  } else 
+    startGroup("Node");
+}
+
+void TeXFOTBuilder::endNode()
+{
+  if( curFotElementState().enforcingStructure() ) {
+    curFotElementState().CurNodeInfoProlog.resize( 0 );
+    FotElement *lastClosed = CompoundFotElement::lastClosed( curTable() );
+    if( lastClosed != NULL )
+      endGroup( "Node", &lastClosed->nodeInfoEpilog() );
+    #ifdef TEXDEBUG
+      *fileout_ << "\nEND_NODE\n";
+    #endif
+  } else
+    endGroup("Node");
+}
+
+void TeXFOTBuilder::startLink(const Address &addr)
+{
+  GroveString id;
+  unsigned long ei;
+
+  // FIX ME!
+  // This needs a lot of work -- for now, it supports only links to
+  // elements.
+
+  switch (addr.type) {
+  case Address::none:
+    break;
+  case Address::resolvedNode:
+    if (addr.node->getId(id) == accessOK) {
+      set("Label",id);
+    } else if (addr.node->elementIndex(ei) == accessOK) {
+      set("Element", ei);
+    }
+    else {
+      message(TeXMessages::unsupportedLinkNonElement);
+    }
+    break;
+  case Address::idref:
+                               // just the first IDREF for now
+    set("Label",addr.params[0]);
+    break;
+  case Address::entity:
+    message(TeXMessages::unsupportedLinkEntity);
+    break;
+  case Address::sgmlDocument:
+    message(TeXMessages::unsupportedLinkSgmlDoc);
+    break;
+  case Address::hytimeLinkend:
+    message(TeXMessages::unsupportedLinkHyTime);
+    break;
+  case Address::tei:
+    message(TeXMessages::unsupportedLinkTei);
+    break;
+  case Address::html:
+    message(TeXMessages::unsupportedLinkHtml);
+    break;
+  }
+  if (addr.node) {
+    unsigned long g = addr.node->groveIndex();
+    if (g) {
+      set("GroveIndex",g);
+    }
+  }
+  startGroup("Link");
+}
+
+void TeXFOTBuilder::endLink()
+{
+  endGroup("Link");
+}
+
+/////////////////////////////////////////////////////////////////////
+// Inherited characteristics
+// Set the value of the characteristic for the next flow object.
+// Inherited characteristics that are not explicitly set have
+// the same value as the parent flow object.
+//////////////////////////////////////////////////////////////////////
+
+void TeXFOTBuilder::setFontSize(Length size)
+{
+  setlength("fSize",size);
+}
+
+void TeXFOTBuilder::setFontFamilyName(const StringC &name)
+{
+  stringout_ << "\\def\\fFamName{";
+  for (size_t i = 0; i < name.size(); i++)
+    {
+      switch(name[i]) {
+      case ' ': 
+       stringout_ << '-';
+        break;
+      default:
+       stringout_ << char(name[i]);
+       break;
+       }
+      }
+      stringout_ << "}";
+}
+
+void TeXFOTBuilder::setFontWeight(Symbol weight)
+{
+  set("fWeight",weight);
+}
+
+void TeXFOTBuilder::setFontPosture(Symbol posture)
+{
+  set("fPosture",posture);
+}
+
+void TeXFOTBuilder::setStartIndent(const LengthSpec &indent)
+{
+  NextFormat.FotStartIndentSpec = indent;
+  set("StartIndent",indent);
+}
+
+void TeXFOTBuilder::setEndIndent(const LengthSpec &indent)
+{
+  NextFormat.FotEndIndentSpec = indent;
+  set("EndIndent",indent);
+}
+
+void TeXFOTBuilder::setFirstLineStartIndent(const LengthSpec &indent)
+{
+  set("FirstLineStartIndent",indent);
+}
+
+void TeXFOTBuilder::setLastLineEndIndent(const LengthSpec &indent)
+{
+  set("LastLineEndIndent",indent);
+}
+
+void TeXFOTBuilder::setLineSpacing(const LengthSpec &spacing)
+{
+  set("LineSpacing",spacing);
+}
+
+void TeXFOTBuilder::setFieldWidth(const LengthSpec &width)
+{
+  set("FieldWidth",width);
+}
+
+void TeXFOTBuilder::setMarginaliaSep(const LengthSpec &sep)
+{
+  set("MarginaliaSep",sep);
+}
+
+void TeXFOTBuilder::setLines(Symbol lines)
+{
+  NextFormat.FotLines = lines;
+  set("Lines",lines);
+}
+
+void TeXFOTBuilder::setQuadding(Symbol quadding)
+{
+  set("Quadding",quadding);
+}
+
+void TeXFOTBuilder::setDisplayAlignment(Symbol align)
+{
+  NextFormat.FotDisplayAlignment = align;
+  set("DisplayAlignment",align);
+}
+
+void TeXFOTBuilder::setFieldAlign(Symbol align)
+{
+  set("FieldAlign",align);
+}
+
+void TeXFOTBuilder::setColor(const DeviceRGBColor &color)
+{
+  set("Color",color);
+}
+
+void TeXFOTBuilder::setBackgroundColor()
+{
+  set("BackgroundColor",symbolFalse);
+}
+
+void TeXFOTBuilder::setBackgroundColor(const DeviceRGBColor &color)
+{
+  NextFormat.FotBackgroundColor = color;
+  set("BackgroundColor",color);
+}
+
+void TeXFOTBuilder::setBorderPresent(bool flag)
+{
+  NextFormat.FotBorderPresent = flag;
+  set("BorderPresent",flag);
+}
+
+void TeXFOTBuilder::setLineThickness(Length thickness)
+{
+  NextFormat.FotLineThickness = thickness;
+  setlength("LineThickness",thickness);
+}
+
+void TeXFOTBuilder::setCellBeforeRowMargin(Length margin)
+{
+  setlength("CellBeforeRowMargin",margin);
+}
+
+void TeXFOTBuilder::setCellAfterRowMargin(Length margin)
+{
+  setlength("CellAfterRowMargin",margin);
+}
+
+void TeXFOTBuilder::setCellBeforeColumnMargin(Length margin)
+{
+  NextFormat.FotCellBeforeColumnMargin = margin;
+  setlength("CellBeforeColumnMargin",margin);
+}
+
+void TeXFOTBuilder::setCellAfterColumnMargin(Length margin)
+{
+  NextFormat.FotCellAfterColumnMargin = margin;
+  setlength("CellAfterColumnMargin",margin);
+}
+
+void TeXFOTBuilder::setLineSep(Length sep)
+{
+  NextFormat.FotLineSep = sep;
+  setlength("LineSep",sep);
+}
+
+void TeXFOTBuilder::setBoxSizeBefore(Length size)
+{
+  setlength("BoxSizeBefore",size);
+}
+
+void TeXFOTBuilder::setBoxSizeAfter(Length size)
+{
+  setlength("BoxSizeAfter",size);
+}
+
+void TeXFOTBuilder::setPositionPointShift(const LengthSpec &shift)
+{
+  set("PositionPointShift",shift);
+}
+
+void TeXFOTBuilder::setStartMargin(const LengthSpec &margin)
+{
+  set("StartMargin",margin);
+}
+
+void TeXFOTBuilder::setEndMargin(const LengthSpec &margin)
+{
+  set("EndMargin",margin);
+}
+
+void TeXFOTBuilder::setSidelineSep(const LengthSpec &sep)
+{
+  set("SidelineSep",sep);
+}
+
+void TeXFOTBuilder::setAsisWrapIndent(const LengthSpec &indent)
+{
+  set("AsisWrapIndent",indent);
+}
+
+void TeXFOTBuilder::setLineNumberSep(const LengthSpec &sep)
+{
+  set("LineNumberSep",sep);
+}
+
+void TeXFOTBuilder::setLastLineJustifyLimit(const LengthSpec &limit)
+{
+  set("LastLineJustifyLimit",limit);
+}
+
+void TeXFOTBuilder::setJustifyGlyphSpaceMaxAdd(const LengthSpec &max)
+{
+  set("JustifyGlyphSpaceMaxAdd",max);
+}
+
+void TeXFOTBuilder::setJustifyGlyphSpaceMaxRemove(const LengthSpec &max)
+{
+  set("JustifyGlyphSpaceMaxRemove",max);
+}
+
+void TeXFOTBuilder::setTableCornerRadius(const LengthSpec &radius)
+{
+  set("TableCornerRadius",radius);
+}
+
+void TeXFOTBuilder::setBoxCornerRadius(const LengthSpec &radius)
+{
+  set("BoxCornerRadius",radius);
+}
+
+void TeXFOTBuilder::setInhibitLineBreaks(bool flag)
+{
+  set("InhibitLineBreaks",flag);
+}
+
+void TeXFOTBuilder::setHyphenate(bool flag)
+{
+  set("Hyphenate",flag);
+}
+
+void TeXFOTBuilder::setKern(bool flag)
+{
+  set("Kern",flag);
+}
+
+void TeXFOTBuilder::setLigature(bool flag)
+{
+  set("Ligature",flag);
+}
+
+void TeXFOTBuilder::setScoreSpaces(bool flag)
+{
+  set("ScoreSpaces",flag);
+}
+
+void TeXFOTBuilder::setFloatOutMarginalia(bool flag)
+{
+  set("FloatOutMarginalia",flag);
+}
+
+void TeXFOTBuilder::setFloatOutSidelines(bool flag)
+{
+  set("FloatOutSidelines",flag);
+}
+
+void TeXFOTBuilder::setFloatOutLineNumbers(bool flag)
+{
+  set("FloatOutLineNumbers",flag);
+}
+
+void TeXFOTBuilder::setCellBackground(bool flag)
+{
+  NextFormat.FotCellBackground = flag;
+  set("CellBackground",flag);
+}
+
+void TeXFOTBuilder::setSpanWeak(bool flag)
+{
+  set("SpanWeak",flag);
+}
+
+void TeXFOTBuilder::setIgnoreRecordEnd(bool flag)
+{
+  set("IgnoreRecordEnd",flag);
+}
+
+void TeXFOTBuilder::setNumberedLines(bool flag)
+{
+  set("NumberedLines",flag);
+}
+
+void TeXFOTBuilder::setHangingPunct(bool flag)
+{
+  set("HangingPunct",flag);
+}
+
+void TeXFOTBuilder::setBoxOpenEnd(bool flag)
+{
+  set("BoxOpenEnd",flag);
+}
+
+void TeXFOTBuilder::setTruncateLeader(bool flag)
+{
+  set("TruncateLeader",flag);
+}
+
+void TeXFOTBuilder::setAlignLeader(bool flag)
+{
+  set("AlignLeader",flag);
+}
+
+void TeXFOTBuilder::setTablePartOmitMiddleHeader(bool flag)
+{
+  set("TablePartOmitMiddleHeader",flag);
+}
+
+void TeXFOTBuilder::setTablePartOmitMiddleFooter(bool flag)
+{
+  set("TablePartOmitMiddleFooter",flag);
+}
+
+void TeXFOTBuilder::setBorderOmitAtBreak(bool flag)
+{
+  set("BorderOmitAtBreak",flag);
+}
+
+void TeXFOTBuilder::setPrincipalModeSimultaneous(bool flag)
+{
+  set("PrincipalModeSimultaneous",flag);
+}
+
+void TeXFOTBuilder::setMarginaliaKeepWithPrevious(bool flag)
+{
+  set("MarginaliaKeepWithPrevious",flag);
+}
+
+void TeXFOTBuilder::setLineJoin(Symbol join)
+{
+  set("LineJoin",join);
+}
+
+void TeXFOTBuilder::setLineCap(Symbol cap)
+{
+  NextFormat.FotLineCap = cap;
+  set("LineCap",cap);
+}
+
+void TeXFOTBuilder::setLineNumberSide(Symbol side)
+{
+  set("LineNumberSide",side);
+}
+
+void TeXFOTBuilder::setKernMode(Symbol mode)
+{
+  set("KernMode",mode);
+}
+
+void TeXFOTBuilder::setInputWhitespaceTreatment(Symbol treatment)
+{
+  set("InputWhitespaceTreatment",treatment);
+}
+
+void TeXFOTBuilder::setFillingDirection(Symbol direction)
+{
+  set("FillingDirection",direction);
+}
+
+void TeXFOTBuilder::setWritingMode(Symbol mode)
+{
+  set("WritingMode",mode);
+}
+
+void TeXFOTBuilder::setLastLineQuadding(Symbol quadding)
+{
+  set("LastLineQuadding",quadding);
+}
+
+void TeXFOTBuilder::setMathDisplayMode(Symbol mode)
+{
+  set("MathDisplayMode",mode);
+}
+
+void TeXFOTBuilder::setBoxType(Symbol type)
+{
+  set("BoxType",type);
+}
+
+void TeXFOTBuilder::setGlyphAlignmentMode(Symbol mode)
+{
+  set("GlyphAlignmentMode",mode);
+}
+
+void TeXFOTBuilder::setBoxBorderAlignment(Symbol align)
+{
+  set("BoxBorderAlignment",align);
+}
+
+void TeXFOTBuilder::setCellRowAlignment(Symbol align)
+{
+  NextFormat.FotCellRowAlignment = align;
+  set("CellRowAlignment",align);
+}
+
+void TeXFOTBuilder::setBorderAlignment(Symbol align)
+{
+  set("BorderAlignment",align);
+}
+
+void TeXFOTBuilder::setSidelineSide(Symbol side)
+{
+  set("SidelineSide",side);
+}
+
+void TeXFOTBuilder::setHyphenationKeep(Symbol keep)
+{
+  set("HyphenationKeep",keep);
+}
+
+void TeXFOTBuilder::setFontStructure(Symbol structure)
+{
+  set("fStructure",structure);
+}
+
+void TeXFOTBuilder::setFontProportionateWidth(Symbol width)
+{
+  set("fProportionateWidth",width);
+}
+
+void TeXFOTBuilder::setCellCrossed(Symbol crossed)
+{
+  set("CellCrossed",crossed);
+}
+
+void TeXFOTBuilder::setMarginaliaSide(Symbol side)
+{
+  set("MarginaliaSide",side);
+}
+
+void TeXFOTBuilder::setLayer(long n)
+{
+  set("Layer",n);
+}
+
+void TeXFOTBuilder::setBackgroundLayer(long n)
+{
+  set("BackgroundLayer",n);
+}
+
+void TeXFOTBuilder::setBorderPriority(long n)
+{
+  NextFormat.FotBorderPriority = n;
+  set("BorderPriority",n);
+}
+
+void TeXFOTBuilder::setLineRepeat(long n)
+{
+  NextFormat.FotLineRepeat = n;
+  set("LineRepeat",n);
+}
+
+void TeXFOTBuilder::setSpan(long n)
+{
+  NextFormat.FotSpan = n;
+  NextFormat.FotCurDisplaySize
+    = NextFormat.FotPageWidth - NextFormat.FotLeftMargin - NextFormat.FotRightMargin;
+  set("Span",n);
+}
+
+void TeXFOTBuilder::setMinLeaderRepeat(long n)
+{
+  set("MinLeaderRepeat",n);
+}
+
+void TeXFOTBuilder::setHyphenationRemainCharCount(long n)
+{
+  set("HyphenationRemainCharCount",n);
+}
+
+void TeXFOTBuilder::setHyphenationPushCharCount(long n)
+{
+  set("HyphenationPushCharCount",n);
+}
+
+void TeXFOTBuilder::setWidowCount(long n)
+{
+  set("WidowCount",n);
+}
+
+void TeXFOTBuilder::setOrphanCount(long n)
+{
+  set("OrphanCount",n);
+}
+
+// 0 means #f
+void TeXFOTBuilder::setExpandTabs(long n)
+{
+  set("ExpandTabs",n);
+}
+
+void TeXFOTBuilder::setHyphenationLadderCount(long n)
+{
+  set("HyphenationLadderCount",n);
+}
+
+// public id or #f
+void TeXFOTBuilder::setBackgroundTile(PublicId id)
+{
+  set("BackgroundTile",id);
+}
+
+void TeXFOTBuilder::setLineBreakingMethod(PublicId id)
+{
+  set("LineBreakingMethod",id);
+}
+
+void TeXFOTBuilder::setLineCompositionMethod(PublicId id)
+{
+  set("LineCompositionMethod",id);
+}
+
+void TeXFOTBuilder::setImplicitBidiMethod(PublicId id)
+{
+  set("ImplicitBidiMethod",id);
+}
+
+void TeXFOTBuilder::setGlyphSubstMethod(PublicId id)
+{
+  set("GlyphSubstMethod",id);
+}
+
+void TeXFOTBuilder::setGlyphReorderMethod(PublicId id)
+{
+  set("GlyphReorderMethod",id);
+}
+
+void TeXFOTBuilder::setHyphenationMethod(PublicId id)
+{
+  set("HyphenationMethod",id);
+}
+
+void TeXFOTBuilder::setTableAutoWidthMethod(PublicId id)
+{
+  set("TableAutoWidthMethod",id);
+}
+
+void TeXFOTBuilder::setFontName(PublicId id)
+{
+  set("fName",id);
+}
+
+// Two-letter code
+void TeXFOTBuilder::setLanguage(Letter2 language)
+{
+  setletter2("Language",language);
+}
+
+void TeXFOTBuilder::setCountry(Letter2 country)
+{
+  setletter2("Country",country);
+}
+
+// For simple page sequence
+void TeXFOTBuilder::setPageWidth(Length width)
+{
+  NextFormat.FotPageWidth = width;
+  setlength("PageWidth",width);
+}
+
+void TeXFOTBuilder::setPageHeight(Length height)
+{
+  setlength("PageHeight",height);
+}
+
+void TeXFOTBuilder::setLeftMargin(Length margin)
+{
+  NextFormat.FotLeftMargin = margin;
+  setlength("LeftMargin",margin);
+}
+
+void TeXFOTBuilder::setRightMargin(Length margin)
+{
+  NextFormat.FotRightMargin = margin;
+  setlength("RightMargin",margin);
+}
+
+void TeXFOTBuilder::setTopMargin(Length margin)
+{
+  setlength("TopMargin",margin);
+}
+
+void TeXFOTBuilder::setBottomMargin(Length margin)
+{
+  setlength("BottomMargin",margin);
+}
+
+void TeXFOTBuilder::setHeaderMargin(Length margin)
+{
+  setlength("HeaderMargin",margin);
+}
+
+void TeXFOTBuilder::setFooterMargin(Length margin)
+{
+  setlength("FooterMargin",margin);
+}
+
+                               // New inherited characteristics
+                               // added 1 March/97 with math support.
+void TeXFOTBuilder::setMinPreLineSpacing(const OptLengthSpec &len)
+{
+  set("MinPreLineSpacing",len);
+}
+
+
+void TeXFOTBuilder::setMinPostLineSpacing(const OptLengthSpec &len)
+{
+  set("MinPostLineSpacing",len);
+}
+
+
+void TeXFOTBuilder::setMinLeading(const OptLengthSpec &len)
+{
+  set("MinLeading",len);
+}
+
+
+void TeXFOTBuilder::setScriptPreAlign(Symbol sym)
+{
+  set("ScriptPreAlign",sym);
+}
+
+
+void TeXFOTBuilder::setScriptPostAlign(Symbol sym)
+{
+  set("ScriptPostAlign",sym);
+}
+
+
+void TeXFOTBuilder::setScriptMidSupAlign(Symbol sym)
+{
+  set("ScriptMidSupAlign",sym);
+}
+
+
+void TeXFOTBuilder::setScriptMidSubAlign(Symbol sym)
+{
+  set("ScriptMidSubAlign",sym);
+}
+
+
+void TeXFOTBuilder::setNumeratorAlign(Symbol sym)
+{
+  set("NumeratorAlign",sym);
+}
+
+
+void TeXFOTBuilder::setDenominatorAlign(Symbol sym)
+{
+  set("DenominatorAlign",sym);
+}
+
+
+void TeXFOTBuilder::setGridPositionCellType(Symbol sym)
+{
+  set("GridPositionCellType",sym);
+}
+
+
+void TeXFOTBuilder::setGridColumnAlignment(Symbol sym)
+{
+  set("GridColumnAlignment",sym);
+}
+
+
+void TeXFOTBuilder::setGridRowAlignment(Symbol sym)
+{
+  set("GridRowAlignment",sym);
+}
+
+
+void TeXFOTBuilder::setGridEquidistantRows(bool flag)
+{
+  set("GridEquidistantRows",flag);
+}
+
+
+void TeXFOTBuilder::setGridEquidistantColumns(bool flag)
+{
+  set("GridEquidistantColumns",flag);
+}
+
+
+void TeXFOTBuilder::setEscapementSpaceBefore(const InlineSpace &space)
+{
+  set("EscapementSpaceBefore",space);
+}
+
+
+void TeXFOTBuilder::setEscapementSpaceAfter(const InlineSpace &space)
+{
+  set("EscapementSpaceAfter",space);
+}
+
+
+void TeXFOTBuilder::setInlineSpaceSpace(const OptInlineSpace &space)
+{
+  set("InlineSpaceSpace",space);
+}
+
+
+void TeXFOTBuilder::setGlyphSubstTable(const Vector<ConstPtr<GlyphSubstTable> > &)
+{
+  // FIX ME!
+  message(TeXMessages::unsupportedGlyphSubstTable);
+  // set("GlyphSubstTable",tables);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Private member functions.
+////////////////////////////////////////////////////////////////////////
+
+//
+// Insert an atomic flow object.
+//
+void TeXFOTBuilder::insertAtomic(const char *name)
+{
+  os() << "\\insert" << name << "%\n{";
+  dumpInherited();
+  os() << '}';
+}
+
+void TeXFOTBuilder::insertAtomic( TeXFOTBuilder::FotElement &fotElement )
+{
+  stringout_.extractString( fotElement.Characteristics );
+}
+
+//
+// Start a non-atomic flow object.
+//
+void TeXFOTBuilder::startGroup(const char *name, String<char> *output )
+{
+  if( output ) {
+    String<char> s;
+    stringout_.extractString( s );
+    StrOutputByteStream out;
+    out << "\\" << name << "%\n{" << s << '}';
+    out.extractString( s );
+    *output += s;
+  } else {
+    os() << "\\" << name << "%\n{";
+    dumpInherited();
+    os() << '}';
+  }
+}
+
+void TeXFOTBuilder::startGroup( TeXFOTBuilder::FotElement &fotElement ) {
+
+  stringout_.extractString( fotElement.Characteristics );
+}
+
+//
+// Start a non-atomic flow object, with the content delimited by braces,
+// but no macro name at all; we just emit all the characteristics in
+// the stream after the brace.
+//
+void TeXFOTBuilder::startSimpleGroup(const char *name, String<char> *output )
+{
+  if( output ) {
+    String<char> s;
+    stringout_.extractString( s );
+    StrOutputByteStream out;
+    out << "%\n{" << s ;
+    out.extractString( s );
+    *output += s;
+  } else {
+    os() << "%\n{";
+    dumpInherited();
+  }
+}
+
+//
+// End with just a closing brace
+//
+void TeXFOTBuilder::endSimpleGroup(String<char> *output )
+{
+  if( output ) {
+    StrOutputByteStream out;
+    out << "}"; 
+    String<char> s;
+    out.extractString( s );
+    *output += s;
+  }
+  else
+    os() << "}";
+}
+//
+// Stop and start a brace, but note characteristics
+//
+void TeXFOTBuilder::closeopenBrace(const char *name, String<char> *output )
+{
+  if( output ) {
+    String<char> s;
+    stringout_.extractString( s );
+    StrOutputByteStream out;
+    out << "}{" << s ;
+    out.extractString( s );
+    *output += s;
+  } else {
+    os() << "}{";
+    dumpInherited();
+  }
+}
+//
+// Start a non-atomic flow object, with the content delimited by braces
+//
+void TeXFOTBuilder::startBrace(const char *name, String<char> *output )
+{
+  if( output ) {
+    String<char> s;
+    stringout_.extractString( s );
+    StrOutputByteStream out;
+    out << "\\" << name << "%\n{" << s << "}{";
+    out.extractString( s );
+    *output += s;
+  } else {
+    os() << "\\" << name << "%\n{";
+    dumpInherited();
+    os() << "}{";
+  }
+}
+
+//
+// End a non-atomic flow object with just a closing brace
+//
+void TeXFOTBuilder::endBrace(const char *name, String<char> *output )
+{
+  if( output ) {
+    StrOutputByteStream out;
+    out << "}"; 
+    String<char> s;
+    out.extractString( s );
+    *output += s;
+  }
+  else
+    os() << "}";
+}
+
+//
+// End a non-atomic flow object.
+//
+void TeXFOTBuilder::endGroup(const char *name, String<char> *output )
+{
+  if( output ) {
+    StrOutputByteStream out;
+    out << "\\end" << name << "{}";
+    String<char> s;
+    out.extractString( s );
+    *output += s;
+  }
+  else
+    os() << "\\end" << name << "{}";
+}
+
+//
+// Set a Length (needs a different name to avoid conflict
+// with long.
+//
+void TeXFOTBuilder::setlength(const char *name,Length size)
+{
+  stringout_ << "\\def\\" << name << "%\n{"
+             << float(size/1000.0)
+             << "\\p@}";
+}
+
+//
+// Set a StringC.
+//
+void TeXFOTBuilder::set(const char *name,const StringC &value)
+{
+  stringout_ << "\\def\\" << name << "%\n{"
+             << value
+             << '}';
+}
+
+//
+// Set a GroveString
+//
+void TeXFOTBuilder::set(const char *name,const GroveString &value)
+{
+  stringout_ << "\\def\\" << name << "%\n{"
+             << value
+             << '}';
+}
+
+//
+// Set a Symbol.
+//
+void TeXFOTBuilder::set(const char *name,Symbol sym)
+{
+  const char * symbolName = "";
+
+  switch (sym) {
+  case symbolFalse:
+    symbolName = "false";
+    break;
+  case symbolTrue:
+    symbolName = "true";
+    break;
+  case symbolNotApplicable:
+    symbolName = "notapplicable";
+    break;
+  case symbolUltraCondensed:
+    symbolName = "ultracondensed";
+    break;
+  case symbolExtraCondensed:
+    symbolName = "extracondensed";
+    break;
+  case symbolCondensed:
+    symbolName = "condensed";
+    break;
+  case symbolSemiCondensed:
+    symbolName = "semicondensed";
+    break;
+  case symbolUltraLight:
+    symbolName = "ultralight";
+    break;
+  case symbolExtraLight:
+    symbolName = "extralight";
+    break;
+  case symbolLight:
+    symbolName = "light";
+    break;
+  case symbolSemiLight:
+    symbolName = "semilight";
+    break;
+  case symbolMedium:
+    symbolName = "medium";
+    break;
+  case symbolSemiExpanded:
+    symbolName = "semiexpanded";
+    break;
+  case symbolExpanded:
+    symbolName = "expanded";
+    break;
+  case symbolExtraExpanded:
+    symbolName = "extraexpanded";
+    break;
+  case symbolUltraExpanded:
+    symbolName = "ultraexpanded";
+    break;
+  case symbolSemiBold:
+    symbolName = "semibold";
+    break;
+  case symbolBold:
+    symbolName = "bold";
+    break;
+  case symbolExtraBold:
+    symbolName = "extrabold";
+    break;
+  case symbolUltraBold:
+    symbolName = "ultrabold";
+    break;
+  case symbolUpright:
+    symbolName = "upright";
+    break;
+  case symbolOblique:
+    symbolName = "oblique";
+    break;
+  case symbolBackSlantedOblique:
+    symbolName = "backslantedoblique";
+    break;
+  case symbolItalic:
+    symbolName = "italic";
+    break;
+  case symbolBackSlantedItalic:
+    symbolName = "backslanteditalic";
+    break;
+  case symbolStart:
+    symbolName = "start";
+    break;
+  case symbolEnd:
+    symbolName = "end";
+    break;
+  case symbolCenter:
+    symbolName = "center";
+    break;
+  case symbolJustify:
+    symbolName = "justify";
+    break;
+  case symbolSpreadInside:
+    symbolName = "spreadinside";
+    break;
+  case symbolSpreadOutside:
+    symbolName = "spreadoutside";
+    break;
+  case symbolPageInside:
+    symbolName = "pageinside";
+    break;
+  case symbolPageOutside:
+    symbolName = "pageoutside";
+    break;
+  case symbolWrap:
+    symbolName = "wrap";
+    break;
+  case symbolAsis:
+    symbolName = "asis";
+    break;
+  case symbolAsisWrap:
+    symbolName = "asiswrap";
+    break;
+  case symbolAsisTruncate:
+    symbolName = "asistruncate";
+    break;
+  case symbolNone:
+    symbolName = "none";
+    break;
+  case symbolBefore:
+    symbolName = "before";
+    break;
+  case symbolThrough:
+    symbolName = "through";
+    break;
+  case symbolAfter:
+    symbolName = "after";
+    break;
+  case symbolTopToBottom:
+    symbolName = "toptobottom";
+    break;
+  case symbolLeftToRight:
+    symbolName = "lefttoright";
+    break;
+  case symbolBottomToTop:
+    symbolName = "bottomtotop";
+    break;
+  case symbolRightToLeft:
+    symbolName = "righttoleft";
+    break;
+  case symbolInside:
+    symbolName = "inside";
+    break;
+  case symbolOutside:
+    symbolName = "outside";
+    break;
+  case symbolHorizontal:
+    symbolName = "horizontal";
+    break;
+  case symbolVertical:
+    symbolName = "vertical";
+    break;
+  case symbolEscapement:
+    symbolName = "escapement";
+    break;
+  case symbolLineProgression:
+    symbolName = "lineprogression";
+    break;
+  case symbolMath:
+    symbolName = "math";
+    break;
+  case symbolOrdinary:
+    symbolName = "ordinary";
+    break;
+  case symbolOperator:
+    symbolName = "operator";
+    break;
+  case symbolBinary:
+    symbolName = "binary";
+    break;
+  case symbolRelation:
+    symbolName = "relation";
+    break;
+  case symbolOpening:
+    symbolName = "opening";
+    break;
+  case symbolClosing:
+    symbolName = "closing";
+    break;
+  case symbolPunctuation:
+    symbolName = "punctuation";
+    break;
+  case symbolInner:
+    symbolName = "inner";
+    break;
+  case symbolSpace:
+    symbolName = "space";
+    break;
+  case symbolPage:
+    symbolName = "page";
+    break;
+  case symbolPageRegion:
+    symbolName = "pageregion";
+    break;
+  case symbolColumnSet:
+    symbolName = "columnset";
+    break;
+  case symbolColumn:
+    symbolName = "column";
+    break;
+  case symbolMax:
+    symbolName = "max";
+    break;
+  case symbolMaxUniform:
+    symbolName = "maxuniform";
+    break;
+  case symbolMiter:
+    symbolName = "miter";
+    break;
+  case symbolRound:
+    symbolName = "round";
+    break;
+  case symbolBevel:
+    symbolName = "bevel";
+    break;
+  case symbolButt:
+    symbolName = "butt";
+    break;
+  case symbolSquare:
+    symbolName = "square";
+    break;
+  case symbolLoose:
+    symbolName = "loose";
+    break;
+  case symbolNormal:
+    symbolName = "normal";
+    break;
+  case symbolKern:
+    symbolName = "kern";
+    break;
+  case symbolTight:
+    symbolName = "tight";
+    break;
+  case symbolTouch:
+    symbolName = "touch";
+    break;
+  case symbolPreserve:
+    symbolName = "preserve";
+    break;
+  case symbolCollapse:
+    symbolName = "collapse";
+    break;
+  case symbolIgnore:
+    symbolName = "ignore";
+    break;
+  case symbolRelative:
+    symbolName = "relative";
+    break;
+  case symbolDisplay:
+    symbolName = "display";
+    break;
+  case symbolInline:
+    symbolName = "inline";
+    break;
+  case symbolBorder:
+    symbolName = "border";
+    break;
+  case symbolBackground:
+    symbolName = "background";
+    break;
+  case symbolBoth:
+    symbolName = "both";
+    break;
+  case symbolBase:
+    symbolName = "base";
+    break;
+  case symbolFont:
+    symbolName = "font";
+    break;
+  case symbolTop:
+    symbolName = "top";
+    break;
+  case symbolBottom:
+    symbolName = "bottom";
+    break;
+  case symbolSpread:
+    symbolName = "spread";
+    break;
+  case symbolSolid:
+    symbolName = "solid";
+    break;
+  case symbolOutline:
+    symbolName = "outline";
+    break;
+  case symbolWith:
+    symbolName = "with";
+    break;
+  case symbolAgainst:
+    symbolName = "against";
+    break;
+  case symbolForce:
+    symbolName = "force";
+    break;
+  case symbolIndependent:
+    symbolName = "independent";
+    break;
+  case symbolPile:
+    symbolName = "pile";
+    break;
+  case symbolSupOut:
+    symbolName = "supout";
+    break;
+  case symbolSubOut:
+    symbolName = "subout";
+    break;
+  case symbolLeadEdge:
+    symbolName = "leadedge";
+    break;
+  case symbolTrailEdge:
+    symbolName = "trailedge";
+    break;
+  case symbolExplicit:
+    symbolName = "explicit";
+    break;
+  case symbolRowMajor:
+    symbolName = "rowmajor";
+    break;
+  case symbolColumnMajor:
+    symbolName = "columnmajor";
+    break;
+  }
+
+  stringout_ << "\\def\\" << name << "%\n{" << symbolName << '}';
+}
+
+//
+// Set a LengthSpec.
+//
+void TeXFOTBuilder::set(const char *name,const LengthSpec &spec)
+{
+  stringout_ << "\\def\\" << name << "%\n{"
+             << float(spec.length/1000.0)
+             << "\\p@}";
+  stringout_ << "\\def\\" << name << "Factor%\n{"
+             << spec.displaySizeFactor
+             << '}';
+}
+
+//
+// Set a double.
+//
+void TeXFOTBuilder::set(const char *name,double n)
+{
+  stringout_ << "\\def\\" << name << "%\n{" << n << '}';
+}
+
+//
+// Set a DeviceRGBColor.
+//
+void TeXFOTBuilder::set(const char *name, const DeviceRGBColor &color)
+{
+  stringout_ << "\\def\\" << name << "Red%\n{" << int(color.red) << '}';
+  stringout_ << "\\def\\" << name << "Green%\n{" << int(color.green) << '}';
+  stringout_ << "\\def\\" << name << "Blue%\n{" << int(color.blue) << '}';
+}
+
+//
+// Set a bool.
+//
+void TeXFOTBuilder::set(const char *name,bool flag)
+{
+  stringout_ << "\\def\\" << name << "%\n{"
+             << (flag ? 1 : 0)
+             << '}';
+}
+
+//
+// Set a long.
+//
+void TeXFOTBuilder::set(const char *name,long n)
+{
+  stringout_ << "\\def\\" << name << "%\n{" << n << '}';
+}
+
+//
+// Set an unsigned long.
+//
+void TeXFOTBuilder::set(const char *name,long unsigned int n)
+{
+  stringout_ << "\\def\\" << name << "%\n{" << n << '}';
+}
+
+//
+// Set a PublicId.
+//
+void TeXFOTBuilder::set(const char *name,PublicId id)
+{
+  stringout_ << "\\def\\" << name << "%\n{" << id << '}';
+}
+
+//
+// Set a Letter2.
+//
+void TeXFOTBuilder::setletter2(const char *name,Letter2 code)
+{
+  char letter1 = (code & 0xff00) >> 8;
+  char letter2 = (code & 0xff);
+  stringout_ << "\\def\\" << name << "%\n{" << letter1 << letter2 << '}';
+}
+
+//
+// This one is a problem because it duplications functionality from
+// above.
+//
+void TeXFOTBuilder::set(const char *name,const DisplaySpace &space)
+{
+  if (space.nominal.length != 0 || space.min.length != 0
+      || space.max.length != 0) {
+    stringout_ << "\\def\\" << name << "Nom%\n{"
+               << (space.nominal.length/1000.0) << "\\p@}";
+    if (space.nominal.displaySizeFactor != 0)
+      stringout_ << "\\def\\" << name << "NomFactor%\n{"
+                 << space.nominal.displaySizeFactor << '}';
+    if (space.min.length != 0)
+      stringout_ << "\\def\\" << name << "Min%\n{"
+                 << (space.min.length/1000.0) << "\\p@}";
+    if (space.min.displaySizeFactor != 0)
+      stringout_ << "\\def\\" << name << "MinFactor%\n{"
+                 << space.min.displaySizeFactor << '}';
+    if (space.max.length != 0)
+      stringout_ << "\\def\\" << name << "Max%\n{"
+                 << (space.max.length/1000.0) << "\\p@}";
+    if (space.max.displaySizeFactor != 0)
+      stringout_ << "\\def\\" << name << "MaxFactor%\n{"
+                 << space.max.displaySizeFactor << '}';
+    if (space.priority != 0)
+      stringout_ << "\\def\\" << name << "Priority%\n{"
+                 << space.priority << '}';
+    if (space.conditional)
+      stringout_ << "\\def\\" << name << "Conditional%\n{"
+                 << (space.conditional ? 1 : 0) << '}';
+    if (space.force)
+      stringout_ << "\\def\\" << name << "Force%\n{"
+                 << (space.force ? 1 : 0) << '}';
+  }
+}
+
+void TeXFOTBuilder::set(const char *name,const GlyphId &glyphId)
+{
+  stringout_ << "\\def\\" << name << "%\n{";
+  if (glyphId.publicId) {
+    stringout_ << glyphId.publicId;
+    if (glyphId.suffix)
+      stringout_ << "::" << glyphId.suffix;
+  }
+  stringout_ << '}';
+}
+
+void TeXFOTBuilder::set(const char *name,const OptLengthSpec &spec)
+{
+  if (spec.hasLength) {
+    set(name,spec.length);
+  }
+}
+
+void TeXFOTBuilder::set(const char *name,const OptInlineSpace &spec)
+{
+  if (spec.hasSpace) {
+    set(name,spec.space);
+  }
+}
+
+// This one is also a problem because it duplicates functionality.
+void TeXFOTBuilder::set(const char *name,const InlineSpace &space)
+{
+  if (space.nominal.length != 0 || space.min.length != 0
+      || space.max.length != 0) {
+    stringout_ << "\\def\\" << name << "Nom%\n{"
+               << (space.nominal.length/1000.0) << "\\p@}";
+    if (space.nominal.displaySizeFactor != 0)
+      stringout_ << "\\def\\" << name << "NomFactor%\n{"
+                 << space.nominal.displaySizeFactor << '}';
+    if (space.min.length != 0)
+      stringout_ << "\\def\\" << name << "Min%\n{"
+                 << (space.min.length/1000.0) << "\\p@}";
+    if (space.min.displaySizeFactor != 0)
+      stringout_ << "\\def\\" << name << "MinFactor%\n{"
+                 << space.min.displaySizeFactor << '}';
+    if (space.max.length != 0)
+      stringout_ << "\\def\\" << name << "Max%\n{"
+                 << (space.max.length/1000.0) << "\\p@}";
+    if (space.max.displaySizeFactor != 0)
+      stringout_ << "\\def\\" << name << "MaxFactor%\n{"
+                 << space.max.displaySizeFactor << '}';
+  }
+}
+
+//
+// Structures for non-inherited characters, in the order specified
+// in /style/FOTBuilder.h.
+//
+
+void TeXFOTBuilder::setDisplayNIC(const DisplayNIC &nic)
+{
+  set("sb",nic.spaceBefore);
+  set("sa",nic.spaceAfter);
+  MAYBESET("PositionPreference",nic.positionPreference,symbolFalse);
+  MAYBESET("Keep",nic.keep,symbolFalse);
+  MAYBESET("BreakBefore",nic.breakBefore,symbolFalse);
+  MAYBESET("BreakAfter",nic.breakAfter,symbolFalse);
+  MAYBESET("KeepWithPrevious",nic.keepWithPrevious,symbolFalse);
+  MAYBESET("KeepWithNext",nic.keepWithNext,symbolFalse);
+  MAYBESET("MayViolateKeepBefore",nic.mayViolateKeepBefore,symbolFalse);
+  MAYBESET("MayViolateKeepAfter",nic.mayViolateKeepAfter,symbolFalse);
+}
+
+void TeXFOTBuilder::setInlineNIC(const InlineNIC &nic)
+{
+  MAYBESET("BreakBeforePriority",nic.breakBeforePriority,0);
+  MAYBESET("BreakAfterPriority",nic.breakAfterPriority,0);
+}
+
+void TeXFOTBuilder::setDisplayGroupNIC(const DisplayGroupNIC &nic)
+{
+  setDisplayNIC(nic);
+  if (nic.hasCoalesceId) 
+    set("CoalesceId",nic.coalesceId);
+}
+
+void TeXFOTBuilder::setExternalGraphicNIC(const ExternalGraphicNIC &nic)
+{
+  setDisplayNIC(nic);
+  setInlineNIC(nic);
+
+  MAYBESET("IsDisplay",nic.isDisplay,symbolFalse);
+  MAYBESET("ScaleType",nic.scaleType,symbolMaxUniform);
+  if (nic.scaleType == symbolFalse) {
+    set("ScaleX",nic.scale[0]);
+    set("ScaleY",nic.scale[1]);
+  }
+  set("EntitySystemId",nic.entitySystemId);
+  set("NotationSystemId",nic.notationSystemId);
+  if(nic.hasMaxWidth)
+    set("MaxWidth",nic.maxWidth);
+  if (nic.hasMaxHeight)
+    set("MaxHeight",nic.maxHeight);
+  if (!nic.isDisplay) {
+    set("EscapementDirection",nic.escapementDirection);
+    set("PositionPointX",nic.positionPointX);
+    set("PositionPointY",nic.positionPointY);
+  }
+}
+
+void TeXFOTBuilder::setBoxNIC(const BoxNIC &nic)
+{
+  setDisplayNIC(nic);
+  setInlineNIC(nic);
+                               // BoxNIC
+  MAYBESET("IsDisplay",nic.isDisplay,symbolFalse);
+}
+
+void TeXFOTBuilder::setRuleNIC(const RuleNIC &nic)
+{
+  setDisplayNIC(nic);
+  setInlineNIC(nic);
+                               // Rule NIC
+  set("Orientation",nic.orientation);
+  if (nic.hasLength)
+    set("Length",nic.length);
+}
+
+void TeXFOTBuilder::setLeaderNIC(const LeaderNIC &nic)
+{
+  setInlineNIC(nic);
+  if (nic.hasLength)
+    set("Length",nic.length);
+}
+
+void TeXFOTBuilder::setParagraphNIC(const ParagraphNIC &nic)
+{
+  setDisplayNIC(nic);
+}
+
+void TeXFOTBuilder::setCharacterNIC(const CharacterNIC &nic)
+{
+#if 1
+  if (nic.valid) {
+    set("Ch",(unsigned long)nic.ch);
+    set("GlyphId",nic.glyphId);
+    set("BreakBeforePriority",nic.breakBeforePriority);
+    set("MathClass",nic.mathClass);
+    set("MathFontPosture",nic.mathFontPosture);
+    stringout_ << "\\def\\Script%\n{" << nic.script+29 << '}';
+    set("IsDropAfterLineBreak",nic.isDropAfterLineBreak);
+    set("IsDropUnlessBeforeLineBreak",nic.isDropUnlessBeforeLineBreak);
+    set("IsPunct",nic.isPunct);
+    set("IsInputWhiteSpace",nic.isInputWhitespace);
+    set("IsInputTab",nic.isInputTab);
+    set("IsRecordEnd",nic.isRecordEnd);
+    set("IsSpace",nic.isSpace);
+  }
+#else
+  if (nic.specifiedC & (1 << CharacterNIC::cChar))
+    set("Ch",(unsigned long)nic.ch);
+  if (nic.specifiedC & (1 << CharacterNIC::cGlyphId))
+    set("GlyphId",nic.glyphId);
+  if (nic.specifiedC & (1 << CharacterNIC::cBreakBeforePriority))
+    set("BreakBeforePriority",nic.breakBeforePriority);
+  if (nic.specifiedC & (1 << CharacterNIC::cBreakAfterPriority))
+    set("BreakAfterPriority",nic.breakAfterPriority);
+  if (nic.specifiedC & (1 << CharacterNIC::cMathClass))
+    set("MathClass",nic.mathClass);
+  if (nic.specifiedC & (1 << CharacterNIC::cMathFontPosture))
+    set("MathFontPosture",nic.mathFontPosture);
+  if (nic.specifiedC & (1 << CharacterNIC::cScript))
+    set("Script",(long unsigned int)nic.script);
+  if (nic.specifiedC & (1 << CharacterNIC::cIsDropAfterLineBreak))
+    set("IsDropAfterLineBreak",nic.isDropAfterLineBreak);
+  if (nic.specifiedC & (1 << CharacterNIC::cIsDropUnlessBeforeLineBreak))
+    set("IsDropUnlessBeforeLineBreak",nic.isDropUnlessBeforeLineBreak);
+  if (nic.specifiedC & (1 << CharacterNIC::cIsPunct))
+    set("IsPunct",nic.isPunct);
+  if (nic.specifiedC & (1 << CharacterNIC::cIsInputWhitespace))
+    set("IsInputWhiteSpace",nic.isInputWhitespace);
+  if (nic.specifiedC & (1 << CharacterNIC::cIsInputTab))
+    set("IsInputTab",nic.isInputTab);
+  if (nic.specifiedC & (1 << CharacterNIC::cIsRecordEnd))
+    set("IsRecordEnd",nic.isRecordEnd);
+  if (nic.specifiedC & (1 << CharacterNIC::cIsSpace))
+    set("IsSpace",nic.isSpace);
+#endif
+  MAYBESET("StretchFactor",nic.stretchFactor,1.0);
+}
+
+void TeXFOTBuilder::setLineFieldNIC(const LineFieldNIC &nic)
+{
+  setInlineNIC(nic);
+}
+
+void TeXFOTBuilder::setTableNIC(const TableNIC &nic)
+{
+  setDisplayNIC(nic);
+                               // TableNIC
+  switch (nic.widthType) {
+  case TableNIC::widthFull:
+    set("TableWidth","full");
+    break;
+  case TableNIC::widthMinimum:
+    set("TableWidth","minimum");
+    break;
+  case TableNIC::widthExplicit:
+    set("TableWidth",nic.width);
+    break;
+  }
+}
+
+void TeXFOTBuilder::setTablePartNIC(const TablePartNIC &nic)
+{
+  setDisplayNIC(nic);
+}
+
+void TeXFOTBuilder::setTableColumnNIC(const TableColumnNIC &nic)
+{
+  MAYBESET("ColumnIndex",long(nic.columnIndex),0);
+  MAYBESET("NColumnsSpanned",long(nic.nColumnsSpanned),1);
+  if (nic.hasWidth)
+    set("Width",nic.width);
+}
+
+void TeXFOTBuilder::setTableCellNIC(const TableCellNIC &nic)
+{
+  // FIX ME!
+  // does not deal with "missing" bool yet.
+  MAYBESET("ColumnIndex",long(nic.columnIndex),0);
+  MAYBESET("NColumnsSpanned",long(nic.nColumnsSpanned),1);
+  MAYBESET("NRowsSpanned",long(nic.nRowsSpanned),1);
+}
+
+void TeXFOTBuilder::setGridNIC(const GridNIC &nic)
+{
+  set("NColumns",nic.nColumns);
+  set("NRows",nic.nRows);
+}
+
+void TeXFOTBuilder::setGridCellNIC(const GridCellNIC &nic)
+{
+  set("ColumnNumber",nic.columnNumber);
+  set("RowNumber",nic.rowNumber);
+}
+
+
+// Dump all accumulated inherited characteristics.
+
+void TeXFOTBuilder::dumpInherited()
+{
+  String<char> tem;
+  stringout_.extractString(tem);
+  os() << tem;
+}
+
+void TeXFOTBuilder::message(const MessageType0 &msg)
+{
+  mgr_->message(msg);
+}
+
+void TeXFOTBuilder::setPageNumberFormat(const StringC &name)
+{
+  set("PageNumberFormat",name);
+}
+
+void TeXFOTBuilder::setPageNColumns(long n)
+{
+  NextFormat.FotPageNColumns = n;
+  set("PageNColumns",n);
+}
+
+void TeXFOTBuilder::setPageColumnSep(Length w)
+{
+  NextFormat.FotPageColumnSep = w;
+  setlength("PageColumnSep",w);
+}
+
+void TeXFOTBuilder::setPageBalanceColumns(bool flag)
+{
+ set("PageBalanceColumns",flag);
+}
+
+void TeXFOTBuilder::setPageTwoSide(bool flag)
+{
+  set("PageTwoSide",flag);
+}
+
+void TeXFOTBuilder::setTwoSideStartOnRight(bool flag)
+{
+  set("TwoSideStartOnRight",flag);
+}
+
+void TeXFOTBuilder::setSubscriptDepth(Length w)
+{
+ setlength("SubScriptDepth",w);
+}
+
+void TeXFOTBuilder::setOverMarkHeight(Length w)
+{
+ setlength("OverMarkHeight",w);
+}
+
+void TeXFOTBuilder::setUnderMarkDepth(Length w)
+{
+ setlength("UnderMarkDepth",w);
+}
+
+void TeXFOTBuilder::setSuperscriptHeight(Length w)
+{
+ setlength("SuperscriptHeight",w);
+}
+
+void TeXFOTBuilder::setGridRowSep(Length  w)
+{
+ setlength("GridRowsep",w);
+}
+
+void TeXFOTBuilder::setGridColumnSep(Length w)
+{
+ setlength("GridColumnSep",w);
+}
+
+void TeXFOTBuilder::setHeadingLevel(long n)
+{
+#ifdef OUTLINES
+  if ((n >=1) && (n <=9)){
+    ParHead par(1,n);
+    headingSet_=1;
+    push(parStack_,par);
+    set("HeadingLevel",n);
+  }
+#else
+  set("HeadingLevel",n);
+#endif
+}
+
+void TeXFOTBuilder::setPageNumberRestart(bool flag)
+{
+ set("PageNumberRestart",flag);
+}
+
+void TeXFOTBuilder::startPageFloat(const PageFloatNIC &nic)
+{
+  setPageFloatNIC(nic);
+  startGroup("PageFloat");
+}
+
+void TeXFOTBuilder::endPageFloat()
+{
+  endGroup("PageFloat");
+}
+
+void TeXFOTBuilder::startPageFootnote()
+{
+  startBrace("PageFootnote");
+}
+
+void TeXFOTBuilder::endPageFootnote()
+{
+  endBrace("PageFootnote");
+}
+
+void TeXFOTBuilder::setPageFloatNIC(const PageFloatNIC &nic)
+{
+  set("placement",nic.placement);
+}
+
+TeXFOTBuilder::PageFloatNIC::~PageFloatNIC()
+{
+}
+
+void TeXFOTBuilder::extension(const ExtensionFlowObj &fo, const NodePtr &nd)
+{
+  ((const TeXExtensionFlowObj &)fo).atomic(*this, nd);
+}
+
+void TeXFOTBuilder::startExtensionSerial(const CompoundExtensionFlowObj &fo, const NodePtr &nd)
+{
+  ((const TeXCompoundExtensionFlowObj &)fo).start(*this, nd);
+}
+
+void TeXFOTBuilder::endExtensionSerial(const CompoundExtensionFlowObj &fo)
+{
+  ((const TeXCompoundExtensionFlowObj &)fo).end(*this);
+}
+
+void TeXFOTBuilder::setPreserveSdata(bool b)
+{
+  preserveSdata_ = b;
+}
+
+void TeXFOTBuilder::charactersFromNode(const NodePtr &nd, const Char *s, size_t n)
+{
+  GroveString name;
+  if (preserveSdata_ && n == 1 && nd->getEntityName(name) == accessOK)
+    os() << "\\Entity{" << name << '}';
+  else
+    TeXFOTBuilder::characters(s, n);
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#include "TeXFOTBuilder_inst.cxx"
diff --git a/jade/TeXFOTBuilder.h b/jade/TeXFOTBuilder.h
new file mode 100644 (file)
index 0000000..4d7ff35
--- /dev/null
@@ -0,0 +1,23 @@
+// This is a -*-c++-*- header.
+// TeXFOTBuilder.h: a generic TeX backend for Jade.
+// Written by David Megginson <dmeggins@microstar.com>
+
+#ifndef TeXFOTBuilder_INCLUDED
+#define TeXFOTBuilder_INCLUDED 1
+
+#include "OutputByteStream.h"
+#include "FOTBuilder.h"
+#include "Message.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+FOTBuilder *makeTeXFOTBuilder(OutputByteStream *, Messenger *,
+                             const FOTBuilder::Extension *&);
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not TeXFOTBuilder_INCLUDED */
diff --git a/jade/TeXFOTBuilder_inst.m4 b/jade/TeXFOTBuilder_inst.m4
new file mode 100644 (file)
index 0000000..ebda320
--- /dev/null
@@ -0,0 +1,28 @@
+#include "config.h"
+#define OUTLINES
+#ifdef SP_MANUAL_INST
+
+#define SP_DEFINE_TEMPLATES
+#include "Vector.h"
+#undef SP_DEFINE_TEMPLATES
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+__instantiate(Vector<TeXFOTBuilder::Format>)
+__instantiate(Vector<TeXFOTBuilder::Row>)
+__instantiate(Vector<TeXFOTBuilder::Cell>)
+__instantiate(Vector<TeXFOTBuilder::Column>)
+__instantiate(Vector<TeXFOTBuilder::TablePart>)
+__instantiate(Vector<TeXFOTBuilder::Table>)
+__instantiate(Vector<TeXFOTBuilder::FotElementState>)
+__instantiate(Vector<OutputByteStream *>)
+#ifdef OUTLINES
+__instantiate(Vector<TeXFOTBuilder::ParHead>)
+#endif
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* SP_MANUAL_INST */
diff --git a/jade/TeXMessages.msg b/jade/TeXMessages.msg
new file mode 100644 (file)
index 0000000..e4dc4a9
--- /dev/null
@@ -0,0 +1,13 @@
+# Copyright (c) 1997 James Clark
+# See the file COPYING for copying permission
+
+=5000
+
+W0+unsupportedPageNumberNonElement++TeX backend does not currently support references to page numbers of nodes other than elements
+W0+unsupportedLinkNonElement++TeX backend does not currently support links to nodes other than elements
+W0+unsupportedLinkEntity++TeX backend does not currently support links to entities
+W0+unsupportedLinkSgmlDoc++TeX backend does not currently support links to other SGML documents
+W0+unsupportedLinkHyTime++TeX backend does not currently support HyTime linkends
+W0+unsupportedLinkTei++TeX backend does not currently support TEI links
+W0+unsupportedLinkHtml++TeX backend does not currently support HTML links
+W0+unsupportedGlyphSubstTable++TeX backend does not currently support glyph substitution tables
diff --git a/jade/TmpOutputByteStream.h b/jade/TmpOutputByteStream.h
new file mode 100644 (file)
index 0000000..6f5e707
--- /dev/null
@@ -0,0 +1,58 @@
+#ifndef TmpOutputByteStream_INCLUDED
+#define TmpOutputByteStream_INCLUDED 1
+
+#include "OutputByteStream.h"
+#include "Boolean.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+#ifdef SP_NAMESPACE
+using namespace SP_NAMESPACE;
+#endif
+
+class TmpOutputByteStream : public OutputByteStream {
+public:
+  enum { bufSize = 1024 };
+  struct Block {
+    Block *next;
+    char buf[bufSize];
+  };
+  class Iter {
+  public:
+    Iter(const TmpOutputByteStream &sb) : block_(sb.head_), lastBlockUsed_(sb.lastBlockUsed()) { }
+    bool next(const char *&p, size_t &n) {
+      if (block_) {
+       p = block_->buf;
+       n = block_->next ? TmpOutputByteStream::bufSize : lastBlockUsed_;
+       block_ = block_->next;
+       return 1;
+      }
+      else
+       return 0;
+    }
+  private:
+    Block *block_;
+    size_t lastBlockUsed_;
+  };
+  TmpOutputByteStream();
+  ~TmpOutputByteStream();
+  bool isEmpty() { return head_ == 0; }
+  void flush();
+  void flushBuf(char ch);
+private:
+  friend class Iter;
+  size_t lastBlockUsed() const {
+    return last_ ? (ptr_ - last_->buf) : 0;
+  }
+  unsigned nFullBlocks_;
+  Block *head_;
+  Block *last_;
+};
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not OutputByteStream_INCLUDED */
diff --git a/jade/TransformFOTBuilder.cxx b/jade/TransformFOTBuilder.cxx
new file mode 100644 (file)
index 0000000..d410322
--- /dev/null
@@ -0,0 +1,641 @@
+// Copyright (c) 1997 James Clark
+// See the file copying.txt for copying permission.
+
+#include "config.h"
+#include "TransformFOTBuilder.h"
+#include "FOTBuilder.h"
+#include "OutputCharStream.h"
+#include "MessageArg.h"
+#include "ErrnoMessageArg.h"
+
+#include <errno.h>
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+const char RE = '\r';
+
+class TransformFOTBuilder : public SerialFOTBuilder {
+public:
+  // SGML Transformations
+  struct DocumentTypeNIC {
+    ~DocumentTypeNIC();
+    StringC name;
+    StringC publicId;
+    StringC systemId;
+  };
+  struct ElementNIC {
+    ~ElementNIC();
+    StringC gi;
+    Vector<StringC> attributes;
+  };
+  class TransformExtensionFlowObj : public FOTBuilder::ExtensionFlowObj {
+  public:
+    virtual void atomic(TransformFOTBuilder &, const NodePtr &) const = 0;
+  };
+  class TransformCompoundExtensionFlowObj : public FOTBuilder::CompoundExtensionFlowObj {
+  public:
+    virtual void start(TransformFOTBuilder &, const NodePtr &) const = 0;
+    virtual void end(TransformFOTBuilder &) const = 0;
+  };
+  class EntityRefFlowObj : public TransformExtensionFlowObj {
+  public:
+    void atomic(TransformFOTBuilder &fotb, const NodePtr &) const {
+      fotb.entityRef(name_);
+    }
+    bool hasNIC(const StringC &name) const {
+      return name == "name";
+    }
+    void setNIC(const StringC &name, const Value &value) {
+      value.convertString(name_);
+    }
+    ExtensionFlowObj *copy() const { return new EntityRefFlowObj(*this); }
+  private:
+    StringC name_;
+  };
+  class ProcessingInstructionFlowObj : public TransformExtensionFlowObj {
+  public:
+    void atomic(TransformFOTBuilder &fotb, const NodePtr &) const {
+      fotb.processingInstruction(data_);
+    }
+    bool hasNIC(const StringC &name) const {
+      return name.size() == 4 && name[0] == 'd' && name[1] == 'a' && name[2] == 't' && name[3] == 'a';
+    }
+    void setNIC(const StringC &name, const Value &value) {
+      value.convertString(data_);
+    }
+    ExtensionFlowObj *copy() const { return new ProcessingInstructionFlowObj(*this); }
+  private:
+    StringC data_;
+  };
+  class EmptyElementFlowObj : public TransformExtensionFlowObj {
+    void atomic(TransformFOTBuilder &fotb, const NodePtr &nd) const {
+      if (nic_.gi.size() > 0)
+       fotb.emptyElement(nic_);
+      else {
+       GroveString str;
+       if (nd && nd->getGi(str) == accessOK) {
+         ElementNIC tem(nic_);
+         tem.gi.assign(str.data(), str.size());
+         fotb.emptyElement(tem);
+       }
+       else
+         fotb.emptyElement(nic_);
+      }
+    }
+    bool hasNIC(const StringC &name) const {
+      return name == "gi" || name == "attributes";
+    }
+    void setNIC(const StringC &name, const Value &value) {
+      switch (name[0]) {
+      case 'g':
+       value.convertString(nic_.gi);
+       break;
+      case 'a':
+       value.convertStringPairList(nic_.attributes);
+       break;
+      }
+    }
+    ExtensionFlowObj *copy() const { return new EmptyElementFlowObj(*this); }
+  private:
+    ElementNIC nic_;
+  };
+  class ElementFlowObj : public TransformCompoundExtensionFlowObj {
+    void start(TransformFOTBuilder &fotb, const NodePtr &nd) const {
+      if (nic_.gi.size() > 0)
+       fotb.startElement(nic_);
+      else {
+       GroveString str;
+       if (nd && nd->getGi(str) == accessOK) {
+         ElementNIC tem(nic_);
+         tem.gi.assign(str.data(), str.size());
+         fotb.startElement(tem);
+       }
+       else
+         fotb.startElement(nic_);
+      }
+    }
+    void end(TransformFOTBuilder &fotb) const {
+      fotb.endElement();
+    }
+    bool hasNIC(const StringC &name) const {
+      return name == "gi" || name == "attributes";
+    }
+    void setNIC(const StringC &name, const Value &value) {
+      switch (name[0]) {
+      case 'g':
+       value.convertString(nic_.gi);
+       break;
+      case 'a':
+       value.convertStringPairList(nic_.attributes);
+       break;
+      }
+    }
+    ExtensionFlowObj *copy() const { return new ElementFlowObj(*this); }
+  private:
+    ElementNIC nic_;
+  };
+  class EntityFlowObj : public TransformCompoundExtensionFlowObj {
+    void start(TransformFOTBuilder &fotb, const NodePtr &) const {
+      fotb.startEntity(systemId_);
+    }
+    void end(TransformFOTBuilder &fotb) const {
+      fotb.endEntity();
+    }
+    bool hasNIC(const StringC &name) const {
+      return name == "system-id";
+    }
+    void setNIC(const StringC &name, const Value &value) {
+      value.convertString(systemId_);
+    }
+    ExtensionFlowObj *copy() const { return new EntityFlowObj(*this); }
+  private:
+    StringC systemId_;
+  };
+  class DocumentTypeFlowObj : public TransformExtensionFlowObj {
+    void atomic(TransformFOTBuilder &fotb, const NodePtr &nd) const {
+      fotb.documentType(nic_);
+    }
+    bool hasNIC(const StringC &name) const {
+      return name == "system-id" || name == "public-id" || name == "name";
+    }
+    void setNIC(const StringC &name, const Value &value) {
+      switch (name[0]) {
+      case 's':
+       value.convertString(nic_.systemId);
+       break;
+      case 'p':
+       value.convertString(nic_.publicId);
+       break;
+      case 'n':
+       value.convertString(nic_.name);
+       break;
+      }
+    }
+    ExtensionFlowObj *copy() const { return new DocumentTypeFlowObj(*this); }
+  private:
+    DocumentTypeNIC nic_;
+  };
+  TransformFOTBuilder(CmdLineApp *, bool xml, const Vector<StringC> &options);
+  ~TransformFOTBuilder();
+  void startElement(const ElementNIC &);
+  void endElement();
+  void emptyElement(const ElementNIC &);
+  void characters(const Char *s, size_t n);
+  void charactersFromNode(const NodePtr &, const Char *, size_t);
+  void processingInstruction(const StringC &);
+  void documentType(const DocumentTypeNIC &);
+  void formattingInstruction(const StringC &);
+  void entityRef(const StringC &);
+  void startEntity(const StringC &);
+  void endEntity();
+  void extension(const ExtensionFlowObj &fo, const NodePtr &);
+  void startExtensionSerial(const CompoundExtensionFlowObj &fo, const NodePtr &nd);
+  void endExtensionSerial(const CompoundExtensionFlowObj &fo);
+  void start();
+  void end();
+  void setPreserveSdata(bool);
+private:
+  TransformFOTBuilder(const TransformFOTBuilder &);
+  void operator=(const TransformFOTBuilder &);
+
+  OutputCharStream &os() { return *os_; }
+  void attributes(const Vector<StringC> &atts);
+  void flushPendingRe() {
+    if (state_ == statePendingRe) {
+      os() << RE;
+      state_ = stateMiddle;
+    }
+  }
+  void flushPendingReCharRef() {
+    if (state_ == statePendingRe) {
+      os() << "&#13;";
+      state_ = stateMiddle;
+    }
+  }
+
+  CmdLineApp *app_;
+  OutputCharStream *os_;
+  Owner<OutputCharStream> topOs_;
+  Vector<StringC> openElements_;
+  StringC undefGi_;
+  struct OpenFile : Link {
+    ~OpenFile();
+    OutputCharStream *saveOs;
+    // fb must be before os so it gets destroyed afterwards
+    FileOutputByteStream fb;
+    Owner<OutputCharStream> os;
+    StringC systemId;
+  };
+  IList<OpenFile> openFileStack_;
+  bool xml_;
+  enum ReState {
+    stateMiddle,
+    stateStartOfElement,
+    statePendingRe
+  };
+  ReState state_;
+  bool preserveSdata_;
+  char RE_[2];
+  char SP_[2];
+  // Really Vector<bool>
+  StringC preserveSdataStack_;
+};
+
+FOTBuilder *makeTransformFOTBuilder(CmdLineApp *app,
+                                   bool xml,
+                                   const Vector<StringC> &options,
+                                   const FOTBuilder::Extension *&ext)
+{
+  static const TransformFOTBuilder::ProcessingInstructionFlowObj pi;
+  static const TransformFOTBuilder::ElementFlowObj element;
+  static const TransformFOTBuilder::EmptyElementFlowObj emptyElement;
+  static const TransformFOTBuilder::EntityFlowObj entity;
+  static const TransformFOTBuilder::EntityRefFlowObj entityRef;
+  static const TransformFOTBuilder::DocumentTypeFlowObj documentType;
+  static const FOTBuilder::Extension extensions[] = {
+    {
+      "UNREGISTERED::James Clark//Flow Object Class::processing-instruction",
+      0,
+      0,
+      0,
+      0,
+      &pi
+    },
+    {
+      "UNREGISTERED::James Clark//Flow Object Class::element",
+      0,
+      0,
+      0,
+      0,
+      &element
+    },
+    {
+      "UNREGISTERED::James Clark//Flow Object Class::empty-element",
+      0,
+      0,
+      0,
+      0,
+      &emptyElement
+    },
+    {
+      "UNREGISTERED::James Clark//Flow Object Class::entity",
+      0,
+      0,
+      0,
+      0,
+      &entity
+    },
+    {
+      "UNREGISTERED::James Clark//Flow Object Class::entity-ref",
+      0,
+      0,
+      0,
+      0,
+      &entityRef
+    },
+    {
+      "UNREGISTERED::James Clark//Flow Object Class::document-type",
+      0,
+      0,
+      0,
+      0,
+      &documentType
+    },
+    {
+      "UNREGISTERED::James Clark//Characteristic::preserve-sdata?",
+      (void (FOTBuilder::*)(bool))&TransformFOTBuilder::setPreserveSdata,
+      0,
+      0,
+      0,
+      0
+    },
+    { 0 }
+  };
+  ext = extensions;
+  return new TransformFOTBuilder(app, xml, options);
+}
+
+static
+void outputNumericCharRef(OutputCharStream &os, Char c)
+{
+  os << "&#" << (unsigned long)c << ';';
+}
+
+TransformFOTBuilder::TransformFOTBuilder(CmdLineApp *app, bool xml,
+                                        const Vector<StringC> &options)
+: app_(app),
+  xml_(xml),
+  topOs_(new RecordOutputCharStream(app->makeStdOut())),
+  state_(stateMiddle),
+  preserveSdata_(0)
+{
+  undefGi_ = app_->systemCharset().execToDesc("#UNDEF");
+  topOs_->setEscaper(outputNumericCharRef);
+  os_ = topOs_.pointer();
+  preserveSdataStack_ += 0;
+  RE_[0] = RE;
+  RE_[1] = 0;
+  SP_[0] = RE;
+  SP_[1] = 0;
+  for (size_t i = 0; i < options.size(); i++) {
+    if (options[i] == app_->systemCharset().execToDesc("raw")) {
+      RE_[0] = 0;
+      SP_[0] = ' ';
+    }
+  }
+}
+
+TransformFOTBuilder::~TransformFOTBuilder()
+{
+}
+
+static bool contains(const StringC &str, Char c)
+{
+  for (size_t i = 0; i < str.size(); i++)
+    if (str[i] == c)
+       return 1;
+  return 0;
+}
+
+void TransformFOTBuilder::documentType(const DocumentTypeNIC &nic)
+{
+  flushPendingRe();
+  if (nic.name.size()) {
+    os() << "<!DOCTYPE " << nic.name;
+    if (nic.publicId.size())
+      os() << " PUBLIC \"" << nic.publicId << '"';
+    else 
+      os() << " SYSTEM";
+    if (nic.systemId.size()) {
+      if (nic.publicId.size()) {
+       os() << ' ';
+      }
+      char quote = contains(nic.systemId, '"') ? '\'' : '"';
+      os() << quote << nic.systemId << quote;
+    }
+    os() << '>' << RE;
+  }
+  atomic();
+}
+
+void TransformFOTBuilder::attributes(const Vector<StringC> &atts)
+{
+  for (size_t i = 0; i < atts.size(); i += 2) {
+    os() << SP_ << atts[i] << '=';
+    const StringC &s = atts[i + 1];
+    char quoteChar = 0;
+
+    if (!contains(s, '&'))
+      if (!contains(s, '"'))
+        quoteChar = '"';
+      else if (!contains(s, '\''))
+        quoteChar = '\'';
+
+    if (quoteChar)
+      os() << quoteChar << s << quoteChar;
+    else {
+      os() << '"';
+      for (size_t j = 0; j < s.size(); j++) {
+        if (s[j] == '"') {
+         if (xml_)
+           os() << "&quot;";
+         else
+           outputNumericCharRef(os(), '"');
+       }
+       else
+       if (s[j] == '&' ) {
+          if (xml_)
+            os() << "&amp;";
+         else
+            outputNumericCharRef(os(), '&');
+       }
+        else
+          os().put(s[j]);
+      }
+      os() << '"';
+    }
+  }
+}
+
+void TransformFOTBuilder::startElement(const ElementNIC &nic)
+{
+  flushPendingRe();
+  os() << "<";
+  const StringC &s = nic.gi.size() == 0 ? undefGi_ : nic.gi;
+  os() << s;
+  attributes(nic.attributes);
+  os() << RE_ << '>';
+  openElements_.push_back(s);
+  start();
+  state_ = stateStartOfElement;
+}
+
+void TransformFOTBuilder::emptyElement(const ElementNIC &nic)
+{
+  flushPendingRe();
+  os() << "<";
+  const StringC &s = nic.gi.size() == 0 ? undefGi_ : nic.gi;
+  os() << s;
+  attributes(nic.attributes);
+  if (xml_)
+    os() << "/>";
+  else
+    os() << '>';
+  atomic();
+  state_ = stateMiddle;
+}
+void TransformFOTBuilder::endElement()
+{
+  flushPendingReCharRef();
+  os() << "</" << openElements_.back();
+  os() << RE_ << '>';
+  openElements_.resize(openElements_.size() - 1);
+  end();
+  state_ = stateMiddle;
+}
+
+void TransformFOTBuilder::processingInstruction(const StringC &s)
+{
+  flushPendingReCharRef();
+  os() << "<?" << s;
+  if (xml_)
+    os() << "?>";
+  else
+    os() << '>';
+  atomic();
+}
+
+void TransformFOTBuilder::formattingInstruction(const StringC &s)
+{
+  flushPendingRe();
+  os() << s;
+}
+
+void TransformFOTBuilder::entityRef(const StringC &s)
+{
+  flushPendingRe();
+  os() << "&" << s << ";";
+}
+
+void TransformFOTBuilder::startEntity(const StringC &systemId)
+{
+  flushPendingRe();
+  OpenFile *ofp = new OpenFile;
+  openFileStack_.insert(ofp);
+  ofp->systemId = systemId;
+  ofp->saveOs = os_;
+  String<CmdLineApp::AppChar> filename;
+#ifdef SP_WIDE_SYSTEM
+  filename = systemId;
+#else
+  filename = app_->codingSystem()->convertOut(systemId);
+#endif
+  if (filename.size()) {
+    filename += 0;
+    if (!ofp->fb.open(filename.data())) {
+      app_->message(CmdLineApp::openFileErrorMessage(),
+                   StringMessageArg(systemId),
+                   ErrnoMessageArg(errno));
+    }
+    else {
+      ofp->os
+       = new RecordOutputCharStream(
+             new EncodeOutputCharStream(&ofp->fb,
+                                        app_->outputCodingSystem()));
+      ofp->os->setEscaper(outputNumericCharRef);
+      os_ = ofp->os.pointer();
+    }
+  }
+}
+
+void TransformFOTBuilder::endEntity()
+{
+  flushPendingRe();
+  OpenFile &of = *openFileStack_.head();
+  if (of.os) {
+    errno = 0;
+    of.os->flush();
+    if (!of.fb.close())
+      app_->message(CmdLineApp::closeFileErrorMessage(),
+                   StringMessageArg(of.systemId),
+                   ErrnoMessageArg(errno));
+  }
+  os_ = of.saveOs;
+  delete openFileStack_.get();
+}
+
+inline
+OutputCharStream &operator<<(OutputCharStream &os, GroveString &str)
+{
+  return os.write(str.data(), str.size());
+}
+
+void TransformFOTBuilder::charactersFromNode(const NodePtr &nd, const Char *s, size_t n)
+{
+  GroveString name;
+  if (preserveSdata_ && n == 1 && nd->getEntityName(name) == accessOK) {
+    flushPendingRe();
+    os() << "&" << name << ';';
+  }
+  else
+    TransformFOTBuilder::characters(s, n);
+}
+
+void TransformFOTBuilder::characters(const Char *s, size_t n)
+{
+  if (n == 0)
+    return;
+  flushPendingRe();
+  if (state_ == stateStartOfElement && *s == RE) {
+    s++;
+    n--;
+    os() << "&#13;";
+    if (n == 0) {
+      state_ = stateMiddle;
+      return;
+    }
+  }
+  if (s[n - 1] == RE) {
+    n--;
+    state_ = statePendingRe;
+  }
+  else
+    state_ = stateMiddle;
+  for (; n > 0; n--, s++) {
+    switch (*s) {
+    case '&':
+      if (xml_)
+       os() << "&amp;";
+      else
+       outputNumericCharRef(os(), *s);
+      break;
+    case '<':
+      if (xml_)
+       os() << "&lt;";
+      else
+       outputNumericCharRef(os(), *s);
+      break;
+    case '>':
+      if (xml_)
+       os() << "&gt;";
+      else
+       outputNumericCharRef(os(), *s);
+      break;
+    default:
+      os().put(*s);
+      break;
+    }
+  }
+}
+
+void TransformFOTBuilder::extension(const ExtensionFlowObj &fo, const NodePtr &nd)
+{
+  ((const TransformExtensionFlowObj &)fo).atomic(*this, nd);
+}
+
+void TransformFOTBuilder::startExtensionSerial(const CompoundExtensionFlowObj &fo, const NodePtr &nd)
+{
+  ((const TransformCompoundExtensionFlowObj &)fo).start(*this, nd);
+}
+
+void TransformFOTBuilder::endExtensionSerial(const CompoundExtensionFlowObj &fo)
+{
+  ((const TransformCompoundExtensionFlowObj &)fo).end(*this);
+}
+
+void TransformFOTBuilder::setPreserveSdata(bool b)
+{
+  preserveSdata_ = b;
+}
+
+void TransformFOTBuilder::start()
+{
+  preserveSdataStack_ += Char(preserveSdata_);
+}
+
+void TransformFOTBuilder::end()
+{
+  preserveSdataStack_.resize(preserveSdataStack_.size() - 1);
+  preserveSdata_ = bool(preserveSdataStack_[preserveSdataStack_.size() - 1]);
+}
+
+TransformFOTBuilder::OpenFile::~OpenFile()
+{
+}
+
+TransformFOTBuilder::DocumentTypeNIC::~DocumentTypeNIC()
+{
+}
+
+TransformFOTBuilder::ElementNIC::~ElementNIC()
+{
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#include "TransformFOTBuilder_inst.cxx"
diff --git a/jade/TransformFOTBuilder.h b/jade/TransformFOTBuilder.h
new file mode 100644 (file)
index 0000000..f34df29
--- /dev/null
@@ -0,0 +1,23 @@
+// Copyright (c) 1997 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef TransformFOTBuilder_INCLUDED
+#define TransformFOTBuilder_INCLUDED 1
+
+#include "FOTBuilder.h"
+#include "CmdLineApp.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+FOTBuilder *makeTransformFOTBuilder(CmdLineApp *app,
+                                   bool xml,
+                                   const Vector<StringC> &options,
+                                   const FOTBuilder::Extension *&);
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not TransformFOTBuilder_INCLUDED */
diff --git a/jade/TransformFOTBuilder_inst.m4 b/jade/TransformFOTBuilder_inst.m4
new file mode 100644 (file)
index 0000000..bc7cc35
--- /dev/null
@@ -0,0 +1,22 @@
+// Copyright (c) 1997 James Clark
+// See the file COPYING for copying permission.
+
+#include "config.h"
+
+#ifdef SP_MANUAL_INST
+
+#define SP_DEFINE_TEMPLATES
+#include "IList.h"
+#undef SP_DEFINE_TEMPLATES
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+__instantiate(IList<TransformFOTBuilder::OpenFile>)
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* SP_MANUAL_INST */
diff --git a/jade/jade.cxx b/jade/jade.cxx
new file mode 100644 (file)
index 0000000..9ae6f23
--- /dev/null
@@ -0,0 +1,195 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#include "config.h"
+#include "DssslApp.h"
+#include "SgmlFOTBuilder.h"
+#include "RtfFOTBuilder.h"
+#include "TeXFOTBuilder.h"
+#include "TransformFOTBuilder.h"
+#ifdef JADE_HTML
+#include "HtmlFOTBuilder.h"
+#endif
+#ifdef JADE_MIF
+#include "MifFOTBuilder.h"
+#endif
+#include "OutputCharStream.h"
+#include "macros.h"
+#include "sptchar.h"
+#include "JadeMessages.h"
+#include "ErrnoMessageArg.h"
+#include "OutputByteStream.h"
+
+#include <errno.h>
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class JadeApp : public DssslApp {
+public:
+  enum { u = 72000 };
+  JadeApp();
+  void processOption(AppChar opt, const AppChar *arg);
+  FOTBuilder *makeFOTBuilder(const FOTBuilder::Extension *&);
+private:
+  enum OutputType { fotType, rtfType,
+#ifdef JADE_HTML
+                    htmlType,
+#endif
+                   texType,
+#ifdef JADE_MIF
+                    mifType,
+#endif
+                    sgmlType, xmlType };
+  static const AppChar *const outputTypeNames[];
+  OutputType outputType_;
+  String<AppChar> outputFilename_;
+  Vector<StringC> outputOptions_;
+  FileOutputByteStream outputFile_;
+};
+
+const JadeApp::AppChar *const JadeApp::outputTypeNames[] = {
+  SP_T("fot"),
+  SP_T("rtf"),
+#ifdef JADE_HTML
+  SP_T("html"),
+#endif
+  SP_T("tex"),
+#ifdef JADE_MIF
+  SP_T("mif"),
+#endif
+  SP_T("sgml"),
+  SP_T("xml")
+};
+
+JadeApp::JadeApp()
+: DssslApp(u), outputType_(fotType)
+{
+  registerOption('t',
+#ifdef JADE_MIF
+                 SP_T("(fot|rtf|tex|mif|sgml|xml)")
+#else
+                 SP_T("(fot|rtf|tex|sgml|xml)")
+#endif
+                );
+  registerOption('o', SP_T("output_file"));
+}
+
+void JadeApp::processOption(AppChar opt, const AppChar *arg)
+{
+  switch (opt) {
+  case 't':
+    {
+      const AppChar *sub = tcschr(arg, SP_T('-'));
+      size_t len = sub ? sub - arg : tcslen(arg);
+      for (size_t i = 0;; i++) {
+        if (i >= SIZEOF(outputTypeNames)) {
+         message(JadeMessages::unknownType, StringMessageArg(convertInput(arg)));
+         break;
+       }
+       if (tcsncmp(arg, outputTypeNames[i], len) == 0) {
+         outputType_ = OutputType(i);
+         break;
+       }
+      }
+      if (sub) {
+       StringC tem(convertInput(sub));
+       StringC arg;
+       for (size_t i = 0; i < tem.size(); i++) {
+         if (tem[i] == '-') {
+           if (arg.size())
+             outputOptions_.push_back(arg);
+           arg.resize(0);
+         }
+         else
+           arg += tem[i];
+       }
+       if (arg.size())
+         outputOptions_.push_back(arg);
+      }
+    }
+    break;
+  case 'o':
+    if (*arg == 0)
+      message(JadeMessages::emptyOutputFilename);
+    else
+      outputFilename_.assign(arg, tcslen(arg));
+    break;
+  default:
+    DssslApp::processOption(opt, arg);
+    break;
+  }
+}
+
+FOTBuilder *JadeApp::makeFOTBuilder(const FOTBuilder::Extension *&exts)
+{
+  if (outputFilename_.size() == 0) {
+    if (defaultOutputBasename_.size() != 0) {
+#ifdef SP_WIDE_SYSTEM
+      outputFilename_ = defaultOutputBasename_;
+#else
+      outputFilename_ = codingSystem()->convertOut(defaultOutputBasename_);
+      // convertOut adds a nul
+      outputFilename_.resize(outputFilename_.size() - 1);
+#endif
+    }
+    else
+      outputFilename_.assign(SP_T("jade-out"), 8);
+    outputFilename_ += SP_T('.');
+    const AppChar *ext = outputTypeNames[outputType_];
+    outputFilename_.append(ext, tcslen(ext));
+  }
+  switch (outputType_) {
+#ifdef JADE_HTML
+  case htmlType:
+#endif
+  case sgmlType:
+  case xmlType:
+    break;
+  default:
+    outputFilename_ += 0;
+    if (!outputFile_.open(outputFilename_.data())) {
+      message(JadeMessages::cannotOpenOutputError,
+             StringMessageArg(CmdLineApp::convertInput(outputFilename_.data())),
+             ErrnoMessageArg(errno));
+      return 0;
+    }
+    break;
+  }
+  switch (outputType_) {
+  case rtfType:
+    unitsPerInch_ = 20*72; // twips
+    return makeRtfFOTBuilder(&outputFile_, outputOptions_, entityManager(), systemCharset(), this, exts);
+  case texType:
+    return makeTeXFOTBuilder(&outputFile_, this, exts);
+#ifdef JADE_HTML
+  case htmlType:
+    return makeHtmlFOTBuilder(outputFilename_, this, exts);
+#endif /* JADE_HTML */
+#ifdef JADE_MIF
+  case mifType:
+    return makeMifFOTBuilder(outputFilename_, entityManager(), systemCharset(), this, exts);
+#endif /* JADE_MIF */
+  case fotType:
+    return makeSgmlFOTBuilder(new RecordOutputCharStream(new EncodeOutputCharStream(&outputFile_,
+                                                        outputCodingSystem_)));
+  case sgmlType:
+  case xmlType:
+    return makeTransformFOTBuilder(this, outputType_ == xmlType, outputOptions_, exts);
+  default:
+    break;
+  }
+  CANNOT_HAPPEN();
+  return 0;
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#ifdef DSSSL_NAMESPACE
+SP_DEFINE_APP(DSSSL_NAMESPACE::JadeApp)
+#else
+SP_DEFINE_APP(JadeApp)
+#endif
diff --git a/jade/jade.dsp b/jade/jade.dsp
new file mode 100644 (file)
index 0000000..7ba659f
--- /dev/null
@@ -0,0 +1,571 @@
+# Microsoft Developer Studio Project File - Name="jade" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=jade - Win32 Release
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "jade.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "jade.mak" CFG="jade - Win32 Release"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "jade - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "jade - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "jade - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir ".\Release"
+# PROP BASE Intermediate_Dir ".\Release"
+# PROP BASE Target_Dir "."
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir ".\Release"
+# PROP Intermediate_Dir ".\Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir "."
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "JADE_HTML" /D "JADE_MIF" /YX /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\include" /I "..\style" /I "..\grove" /I "..\spgrove" /D "_CONSOLE" /D "NDEBUG" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D "SP_MULTI_BYTE" /D "JADE_HTML" /D "JADE_MIF" /YX /FD /c
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"..\bin\openjade.exe"
+# SUBTRACT LINK32 /profile /map
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir ".\Debug"
+# PROP BASE Intermediate_Dir ".\Debug"
+# PROP BASE Target_Dir "."
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir ".\Debug"
+# PROP Intermediate_Dir ".\Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir "."
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "JADE_HTML" /D "JADE_MIF" /YX /c
+# ADD CPP /nologo /MDd /W3 /GX /ZI /Od /I "..\include" /I "..\style" /I "..\grove" /I "..\spgrove" /D "_CONSOLE" /D "_DEBUG" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D "SP_MULTI_BYTE" /D "JADE_HTML" /D "JADE_MIF" /YX /FD /c
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"..\dbgbin\openjade.exe"
+# SUBTRACT LINK32 /incremental:no
+
+!ENDIF 
+
+# Begin Target
+
+# Name "jade - Win32 Release"
+# Name "jade - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat;for;f90"
+# Begin Source File
+
+SOURCE=..\dsssl\fot.dtd
+# End Source File
+# Begin Source File
+
+SOURCE=.\HtmlFOTBuilder.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\HtmlFOTBuilder_inst.m4
+
+!IF  "$(CFG)" == "jade - Win32 Release"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\HtmlFOTBuilder_inst.m4
+InputName=HtmlFOTBuilder_inst
+
+"$(InputDir)\$(InputName).cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       del /f $(InputDir)\$(InputName).cxx 
+       perl ..\lib\instmac.pl $(InputPath) >$(InputDir)\$(InputName).cxx 
+       attrib +r $(InputDir)\$(InputName).cxx 
+       
+# End Custom Build
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Debug"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\HtmlFOTBuilder_inst.m4
+InputName=HtmlFOTBuilder_inst
+
+"$(InputDir)\$(InputName).cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       del /f $(InputDir)\$(InputName).cxx 
+       perl ..\lib\instmac.pl $(InputPath) >$(InputDir)\$(InputName).cxx 
+       attrib +r $(InputDir)\$(InputName).cxx 
+       
+# End Custom Build
+
+!ENDIF 
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\HtmlMessages.msg
+
+!IF  "$(CFG)" == "jade - Win32 Release"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\HtmlMessages.msg
+InputName=HtmlMessages
+
+"$(InputDir)\$(InputName).h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       perl -w ..\msggen.pl $(InputPath)
+
+# End Custom Build
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Debug"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\HtmlMessages.msg
+InputName=HtmlMessages
+
+"$(InputDir)\$(InputName).h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       perl -w ..\msggen.pl $(InputPath)
+
+# End Custom Build
+
+!ENDIF 
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\jade.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\JadeMessages.msg
+
+!IF  "$(CFG)" == "jade - Win32 Release"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\JadeMessages.msg
+InputName=JadeMessages
+
+"$(InputDir)\$(InputName).h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       perl -w ..\msggen.pl $(InputPath)
+
+# End Custom Build
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Debug"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\JadeMessages.msg
+InputName=JadeMessages
+
+"$(InputDir)\$(InputName).h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       perl -w ..\msggen.pl $(InputPath)
+
+# End Custom Build
+
+!ENDIF 
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\MifFOTBuilder.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\MifFOTBuilder_inst.m4
+
+!IF  "$(CFG)" == "jade - Win32 Release"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\MifFOTBuilder_inst.m4
+InputName=MifFOTBuilder_inst
+
+"$(InputDir)\$(InputName).cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       del /f $(InputDir)\$(InputName).cxx 
+       perl ..\lib\instmac.pl $(InputPath) >$(InputDir)\$(InputName).cxx 
+       attrib +r $(InputDir)\$(InputName).cxx 
+       
+# End Custom Build
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Debug"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\MifFOTBuilder_inst.m4
+InputName=MifFOTBuilder_inst
+
+"$(InputDir)\$(InputName).cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       del /f $(InputDir)\$(InputName).cxx 
+       perl ..\lib\instmac.pl $(InputPath) >$(InputDir)\$(InputName).cxx 
+       attrib +r $(InputDir)\$(InputName).cxx 
+       
+# End Custom Build
+
+!ENDIF 
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\MifMessages.msg
+
+!IF  "$(CFG)" == "jade - Win32 Release"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\MifMessages.msg
+InputName=MifMessages
+
+"$(InputDir)\$(InputName).h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       perl -w ..\msggen.pl $(InputPath)
+
+# End Custom Build
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Debug"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\MifMessages.msg
+InputName=MifMessages
+
+"$(InputDir)\$(InputName).h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       perl -w ..\msggen.pl $(InputPath)
+
+# End Custom Build
+
+!ENDIF 
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\RtfFOTBuilder.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\RtfFOTBuilder_inst.m4
+
+!IF  "$(CFG)" == "jade - Win32 Release"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\RtfFOTBuilder_inst.m4
+InputName=RtfFOTBuilder_inst
+
+"$(InputDir)\$(InputName).cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       del /f $(InputDir)\$(InputName).cxx 
+       perl ..\lib\instmac.pl $(InputPath) >$(InputDir)\$(InputName).cxx 
+       attrib +r $(InputDir)\$(InputName).cxx 
+       
+# End Custom Build
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Debug"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\RtfFOTBuilder_inst.m4
+InputName=RtfFOTBuilder_inst
+
+"$(InputDir)\$(InputName).cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       del /f $(InputDir)\$(InputName).cxx 
+       perl ..\lib\instmac.pl $(InputPath) >$(InputDir)\$(InputName).cxx 
+       attrib +r $(InputDir)\$(InputName).cxx 
+       
+# End Custom Build
+
+!ENDIF 
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\RtfMessages.msg
+
+!IF  "$(CFG)" == "jade - Win32 Release"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\RtfMessages.msg
+InputName=RtfMessages
+
+"$(InputDir)\$(InputName).h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       perl -w ..\msggen.pl $(InputPath)
+
+# End Custom Build
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Debug"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\RtfMessages.msg
+InputName=RtfMessages
+
+"$(InputDir)\$(InputName).h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       perl -w ..\msggen.pl $(InputPath)
+
+# End Custom Build
+
+!ENDIF 
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\RtfOle.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\SgmlFOTBuilder.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\TeXFOTBuilder.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\TeXFOTBuilder_inst.m4
+
+!IF  "$(CFG)" == "jade - Win32 Release"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\TeXFOTBuilder_inst.m4
+InputName=TeXFOTBuilder_inst
+
+"$(InputDir)\$(InputName).cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       del /f $(InputDir)\$(InputName).cxx 
+       perl ..\lib\instmac.pl $(InputPath) >$(InputDir)\$(InputName).cxx 
+       attrib +r $(InputDir)\$(InputName).cxx 
+       
+# End Custom Build
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Debug"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\TeXFOTBuilder_inst.m4
+InputName=TeXFOTBuilder_inst
+
+"$(InputDir)\$(InputName).cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       del /f $(InputDir)\$(InputName).cxx 
+       perl ..\lib\instmac.pl $(InputPath) >$(InputDir)\$(InputName).cxx 
+       attrib +r $(InputDir)\$(InputName).cxx 
+       
+# End Custom Build
+
+!ENDIF 
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\TeXMessages.msg
+
+!IF  "$(CFG)" == "jade - Win32 Release"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\TeXMessages.msg
+InputName=TeXMessages
+
+"$(InputDir)\$(InputName).h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       perl -w ..\msggen.pl $(InputPath)
+
+# End Custom Build
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Debug"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\TeXMessages.msg
+InputName=TeXMessages
+
+"$(InputDir)\$(InputName).h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       perl -w ..\msggen.pl $(InputPath)
+
+# End Custom Build
+
+!ENDIF 
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\TransformFOTBuilder.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\TransformFOTBuilder_inst.m4
+
+!IF  "$(CFG)" == "jade - Win32 Release"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\TransformFOTBuilder_inst.m4
+InputName=TransformFOTBuilder_inst
+
+"$(InputDir)\$(InputName).cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       del /f $(InputDir)\$(InputName).cxx 
+       perl ..\lib\instmac.pl $(InputPath) >$(InputDir)\$(InputName).cxx 
+       attrib +r $(InputDir)\$(InputName).cxx 
+       
+# End Custom Build
+
+!ELSEIF  "$(CFG)" == "jade - Win32 Debug"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\TransformFOTBuilder_inst.m4
+InputName=TransformFOTBuilder_inst
+
+"$(InputDir)\$(InputName).cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       del /f $(InputDir)\$(InputName).cxx 
+       perl ..\lib\instmac.pl $(InputPath) >$(InputDir)\$(InputName).cxx 
+       attrib +r $(InputDir)\$(InputName).cxx 
+       
+# End Custom Build
+
+!ENDIF 
+
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd"
+# Begin Source File
+
+SOURCE=.\HtmlMessages.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\JadeMessages.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\MifFOTBuilder.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\MifMessages.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\RtfFOTBuilder.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\RtfMessages.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\RtfOle.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\TeXFOTBuilder.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\TeXMessages.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\TmpOutputByteStream.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\TransformFOTBuilder.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"
+# Begin Source File
+
+SOURCE=..\style\DssslAppMessages.rc
+# PROP Exclude_From_Build 1
+# End Source File
+# Begin Source File
+
+SOURCE=.\HtmlMessages.rc
+# PROP Exclude_From_Build 1
+# End Source File
+# Begin Source File
+
+SOURCE=..\style\InterpreterMessages.rc
+# PROP Exclude_From_Build 1
+# End Source File
+# Begin Source File
+
+SOURCE=.\jade.rc
+# ADD BASE RSC /l 0x809 /i "jade"
+# ADD RSC /l 0x809 /i "." /i "..\style" /i "jade" /d "JADE_MIF"
+# End Source File
+# Begin Source File
+
+SOURCE=.\JadeMessages.rc
+# PROP Exclude_From_Build 1
+# End Source File
+# Begin Source File
+
+SOURCE=.\RtfMessages.rc
+# PROP Exclude_From_Build 1
+# End Source File
+# Begin Source File
+
+SOURCE=.\TeXMessages.rc
+# PROP Exclude_From_Build 1
+# End Source File
+# End Group
+# Begin Source File
+
+SOURCE=.\HtmlFOTBuilder_inst.cxx
+# PROP Ignore_Default_Tool 1
+# End Source File
+# Begin Source File
+
+SOURCE=.\MifFOTBuilder_inst.cxx
+# PROP Ignore_Default_Tool 1
+# End Source File
+# Begin Source File
+
+SOURCE=.\RtfFOTBuilder_inst.cxx
+# PROP Ignore_Default_Tool 1
+# End Source File
+# Begin Source File
+
+SOURCE=.\TeXFOTBuilder_inst.cxx
+# PROP Ignore_Default_Tool 1
+# End Source File
+# Begin Source File
+
+SOURCE=.\TransformFOTBuilder_inst.cxx
+# PROP Ignore_Default_Tool 1
+# End Source File
+# End Target
+# End Project
diff --git a/jade/jade.rc b/jade/jade.rc
new file mode 100644 (file)
index 0000000..603d483
--- /dev/null
@@ -0,0 +1,12 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#include "InterpreterMessages.rc"
+#include "JadeMessages.rc"
+#include "DssslAppMessages.rc"
+#include "HtmlMessages.rc"
+#include "RtfMessages.rc"
+#include "TeXMessages.rc"
+#ifdef JADE_MIF
+#include "MifMessages.rc"
+#endif
diff --git a/jadedist/bin-files.txt b/jadedist/bin-files.txt
new file mode 100644 (file)
index 0000000..ed69e78
--- /dev/null
@@ -0,0 +1,71 @@
+doc\archform.htm
+doc\build.htm
+doc\catalog.htm
+doc\charset.htm
+doc\features.htm
+doc\generic.htm
+doc\ideas.htm
+doc\index.htm
+doc\new.htm
+doc\nsgmls.htm
+doc\sgmldecl.htm
+doc\sgmlnorm.htm
+doc\sgmlsout.htm
+doc\spam.htm
+doc\spent.htm
+doc\sx.htm
+doc\sysdecl.htm
+doc\sysid.htm
+doc\xml.htm
+dsssl\builtins.dsl
+dsssl\extensions.dsl
+dsssl\style-sheet.dtd
+dsssl\fot.dtd
+dsssl\dsssl.dtd
+dsssl\demo.sgm
+dsssl\demo.dsl
+dsssl\catalog
+dsssl\jadetex.dtx
+dsssl\jadetex.ini
+dsssl\jadetex.ins
+dsssl\pdfjadetex.ini
+dsssl\Makefile.jadetex
+bin\sp133.dll
+bin\style.dll
+bin\spgrove.dll
+bin\grove.dll
+bin\groveoa.dll
+bin\jade.exe
+bin\nsgmls.exe
+bin\spam.exe
+bin\sgmlnorm.exe
+bin\spent.exe
+bin\sx.exe
+bin\MSVCRT.DLL
+jadedoc\copying.txt
+jadedoc\dsssl2.htm
+jadedoc\jade.htm
+jadedoc\TeX.htm
+jadedoc\mif.htm
+jadedoc\transform.htm
+pubtext\ISOlat1.ent
+pubtext\ISOlat1.sgm
+pubtext\html.soc
+pubtext\html-1.dtd
+pubtext\html-1s.dtd
+pubtext\html-s.dtd
+pubtext\html.dcl
+pubtext\html.dtd
+pubtext\HTML32.dcl
+pubtext\HTML32.dtd
+pubtext\HTML32.soc
+pubtext\HTML4.dcl
+pubtext\HTML4-s.dtd
+pubtext\HTML4.dtd
+pubtext\HTML4-f.dtd
+pubtext\HTML4.soc
+pubtext\HTMLlat1.ent
+pubtext\HTMLspec.ent
+pubtext\HTMLsym.ent
+pubtext\xml.dcl
+pubtext\xml.soc
diff --git a/jadedist/files.txt b/jadedist/files.txt
new file mode 100644 (file)
index 0000000..96d6ac1
--- /dev/null
@@ -0,0 +1,180 @@
+grove/LocNode.h
+grove/LocNode.cxx
+grove/Node.h
+grove/Node.cxx
+groveoa/CGroveBuilder.cxx
+groveoa/CGroveBuilder.h
+groveoa/GroveBuilder.rgs
+groveoa/GroveNode.cxx
+groveoa/GroveNode.h
+groveoa/StdAfx.cxx
+groveoa/StdAfx.h
+groveoa/groveoa.cxx
+groveoa/groveoa.def
+groveoa/groveoa.dsp
+groveoa/groveoa.idl
+groveoa/groveoa.rc
+groveoa/resource.h
+spgrove/GroveApp.h
+spgrove/GroveBuilder.h
+spgrove/SdNode.cxx
+spgrove/SdNode.h
+spgrove/threads.h
+style/charNames.h
+style/Collector.h
+style/DssslApp.h
+style/DssslSpecEventHandler.h
+style/dsssl_ns.h
+style/ELObj.h
+style/ELObjMessageArg.h
+style/EvalContext.h
+style/Expression.h
+style/FOTBuilder.h
+style/GroveManager.h
+style/Insn.h
+style/Insn2.h
+style/Interpreter.h
+style/InterpreterMessages.h
+style/jade_version.h
+style/MacroFlowObj.h
+style/NumberCache.h
+style/primitive.h
+style/Pattern.h
+style/ProcessContext.h
+style/ProcessingMode.h
+style/SchemeParser.h
+style/sdata.h
+style/SosofoObj.h
+style/Style.h
+style/StyleEngine.h
+style/stylelib.h
+style/style_pch.h
+style/VM.h
+style/Collector.cxx
+style/DssslApp.cxx
+style/DssslSpecEventHandler.cxx
+style/ELObj.cxx
+style/ELObjMessageArg.cxx
+style/Expression.cxx
+style/FOTBuilder.cxx
+style/GroveManager.cxx
+style/Insn.cxx
+style/Interpreter.cxx
+style/InterpreterMessages.cxx
+style/MacroFlowObj.cxx
+style/NumberCache.cxx
+style/primitive.cxx
+style/primitive_inst.cxx
+style/primitive_inst.m4
+style/Pattern.cxx
+style/ProcessContext.cxx
+style/ProcessingMode.cxx
+style/SchemeParser.cxx
+style/Style.cxx
+style/StyleEngine.cxx
+style/stylelib.cxx
+style/style_inst.cxx
+spgrove/GroveApp.cxx
+spgrove/GroveBuilder.cxx
+spgrove/grove_inst.cxx
+spgrove/grove_inst.m4
+style/style_inst.m4
+style/DssslAppMessages.h
+style/DssslAppMessages.msg
+style/DssslAppMessages.rc
+style/InterpreterMessages.msg
+style/InterpreterMessages.rc
+style/FlowObj.cxx
+style/InheritedC.cxx
+style/FlowObj_inst.m4
+style/FlowObj_inst.cxx
+style/common_inst.m4
+style/common_inst.cxx
+grove/Makefile.sub
+grove/grove.dsp
+spgrove/Makefile.sub
+spgrove/spgrove.dsp
+style/Makefile.sub
+style/style.dsp
+jade/jade.cxx
+jade/Makefile.sub
+jade/jade.dsp
+all/all.dsp
+jade/RtfFOTBuilder.cxx
+jade/RtfFOTBuilder.h
+jade/SgmlFOTBuilder.cxx
+jade/SgmlFOTBuilder.h
+jade/TransformFOTBuilder.cxx
+jade/TransformFOTBuilder.h
+jade/TransformFOTBuilder_inst.cxx
+jade/TransformFOTBuilder_inst.m4
+jade.mak
+jade.dsw
+dsssl/demo.dsl
+dsssl/demo.sgm
+dsssl/style-sheet.dtd
+dsssl/dsssl.dtd
+dsssl/fot.dtd
+dsssl/catalog
+dsssl/jadetex.dtx
+dsssl/jadetex.ini
+dsssl/jadetex.ins
+dsssl/pdfjadetex.ini
+dsssl/Makefile.jadetex
+jade/HtmlFOTBuilder.cxx
+jade/HtmlFOTBuilder.h
+jade/HtmlFOTBuilder_inst.cxx
+jade/HtmlFOTBuilder_inst.m4
+jade/JadeMessages.msg
+jade/JadeMessages.h
+jade/JadeMessages.rc
+jade/jade.rc
+jade/HtmlMessages.h
+jade/HtmlMessages.msg
+jade/HtmlMessages.rc
+jade/RtfFOTBuilder_inst.cxx
+jade/RtfFOTBuilder_inst.m4
+jade/RtfMessages.h
+jade/RtfMessages.msg
+jade/RtfMessages.rc
+jade/RtfOle.cxx
+jade/RtfOle.h
+jade/TeXFOTBuilder.cxx
+jade/TeXFOTBuilder.h
+jade/TeXFOTBuilder_inst.cxx
+jade/TeXFOTBuilder_inst.m4
+jade/TeXMessages.h
+jade/TeXMessages.msg
+jade/TeXMessages.rc
+jade/TmpOutputByteStream.h
+jade/MifFOTBuilder.cxx
+jade/MifFOTBuilder.h
+jade/MifFOTBuilder_inst.cxx
+jade/MifFOTBuilder_inst.m4
+jade/MifMessages.h
+jade/MifMessages.msg
+jade/MifMessages.rc
+jadedoc/autoconf.htm
+jadedoc/copying.txt
+jadedoc/dsssl2.htm
+jadedoc/jade.htm
+jadedoc/TeX.htm
+jadedoc/mif.htm
+jadedoc/transform.htm
+jadedist/bin-files.txt
+jadedist/files.txt
+jadedist/makedist.bat
+jadedist/jadedist.dsp
+jade-generate.mak
+Makefile.comm.in
+Makefile.in
+Makefile.lib.in
+Makefile.prog.in
+config/configure.in
+config/config.guess
+config/config.sub
+config/ltconfig
+config/ltmain.sh
+config/aclocal.m4
+config/install.sh
+configure
diff --git a/jadedist/jadedist.dsp b/jadedist/jadedist.dsp
new file mode 100644 (file)
index 0000000..506c801
--- /dev/null
@@ -0,0 +1,76 @@
+# Microsoft Developer Studio Project File - Name="jadedist" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) External Target" 0x0106
+
+CFG=jadedist - Win32 Release
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "jadedist.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "jadedist.mak" CFG="jadedist - Win32 Release"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "jadedist - Win32 Release" (based on "Win32 (x86) External Target")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir ".\Release"
+# PROP BASE Intermediate_Dir ".\Release"
+# PROP BASE Cmd_Line "NMAKE /f jadedist.mak"
+# PROP BASE Rebuild_Opt "/a"
+# PROP BASE Target_File "jadedist\jadedist.exe"
+# PROP BASE Bsc_Name "jadedist\jadedist.bsc"
+# PROP BASE Target_Dir "."
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir ".\Release"
+# PROP Intermediate_Dir ".\Release"
+# PROP Cmd_Line "makedist"
+# PROP Rebuild_Opt ""
+# PROP Target_File "jadedist\jade.zip"
+# PROP Bsc_Name ""
+# PROP Target_Dir "."
+# Begin Target
+
+# Name "jadedist - Win32 Release"
+
+!IF  "$(CFG)" == "jadedist - Win32 Release"
+
+!ENDIF 
+
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat;for;f90"
+# Begin Source File
+
+SOURCE=".\jadedist\bin-files.txt"
+# End Source File
+# Begin Source File
+
+SOURCE=.\jadedist\files.txt
+# End Source File
+# Begin Source File
+
+SOURCE=.\jadedist\makedist.bat
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/jadedist/makedist.bat b/jadedist/makedist.bat
new file mode 100644 (file)
index 0000000..4c98c56
--- /dev/null
@@ -0,0 +1,6 @@
+copy files.txt+..\FILES all-files.txt
+cd ..
+del jadedist\jade.zip
+del jadedist\jadew.zip
+zip -q -@ <jadedist\all-files.txt jadedist\jade.zip
+zip -q -j -@ <jadedist\bin-files.txt jadedist\jadew.zip
diff --git a/jadedoc/autoconf.htm b/jadedoc/autoconf.htm
new file mode 100644 (file)
index 0000000..dfb0c38
--- /dev/null
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<title>Jade autoconf support</title>
+<body bgcolor="#ffffff">
+<h1>Jade autoconf support</h1>
+<h4>(originally by Cees de Groot <A href="mailto:cg@sgmltools.org">cg@sgmltools.org</A>)</h4>
+
+<p>With <code>./configure</code>, you'll have an alternate method to
+prepare the source distribution for building. This support is
+experimental, and I'd like to receive feedback and patches for your
+operating system. If a build with autoconf doesn't work, you can
+always revert to the original Makefile which is saved by configure to
+<code>Makefile.dist</code>. <code>make mrproper</code> will undo
+everything that has been modified by <code>./configure</code>.</p>
+
+<h2>Usage</h2>
+
+<pre>
+% ./configure; make; make install
+</pre>
+
+<h2>configure options</h2>
+
+<dl>
+
+<dt><code>--help</code></dt>
+
+<dd>Print a full list of options. This document only deals with the 
+non-standard options.</dd>
+
+<dt><code>--enable-http</code></dt>
+<dd>This enables the built-in HTTP client so that you can use HTTP as
+a method for getting to system identifiers.</dd>
+
+<dt><code>--enable-default-catalog=<var>pathlist</var></code></dt>
+<dd>Provide the built-in definition for <code>SGML_CATALOG_FILES</code>.</dd>
+
+<dt><code>--enable-default-search-path=<var>pathlist</var></code>
+<dd>Provide a built-in definition for <code>SGML_SEARCH_PATH</code>.</dd>
+
+<dt><code>--disable-mif</code>
+<dd>Don't build the MIF backend.</dd>
+
+<dt><code>--disable-html</code>
+<dd>Don't build the HTML backend.</dd>
+
+</dl>
+
+<h2>Local defines</h2>
+
+<p>If you have some extra additions to OpenJade, you can set
+CFLAGS/CXXFLAGS and/or LDFLAGS/LIBS at configure time:</p>
+
+<pre>
+CXXFLAGS=-Dmyhacks LDFLAGS=-L/opt/myhacks LIBS=-lmyhacks ./configure
+</pre>
+
+<p>Check the invocation of ld in Makefile.comm for the exact semantics
+of LDFLAGS and LIBS.</p>
+
+<h2>Tested platforms</h2>
+
+<ul>
+<li>RedHat Linux 5.2 (egcs 1.0.3, glibc 2.0.7)</li>
+<li>RedHat Linux 6.0 (gcc 2.95.1, glibc 2.1.1)</li>
+<li>SuSE Linux 5.3 (gcc 2.7.2.1, libc 5.5.46)</li>
+<li>Solaris 2.6 (gcc 2.8.1)</li>
+</ul>
+
+<h2>Shared library support</h2>
+
+<p>By default, <code>./configure</code> attempts to build shared
+libraries and link against them. This is done via the
+<code>libtool</code> utility, a utility that knows how to build shared
+libraries on a number of platforms.</p>
+    
+<p>By default, only shared libraries are built. If you have
+difficulties building shared libraries, or you want to build static
+versions, you can use the
+<code>--{enable,disable}{shared,static}</code> options to configure
+libtool to your likings.</p>
+
+<p>According to the libtool 1.2 docs, shared libraries work on:</p>
+<ul>
+<li>AIX 3.x (*-*-aix3*)</li>
+<li>AIX 4.x (*-*-aix4*)</li>
+<li>AmigaOS (*-*-amigaos*)</li>
+<li>Digital/UNIX 3.x, 4.x, a.k.a. OSF/1 (*-*-osf3*, *-*-osf4*)</li>
+<li>FreeBSD 2.x, 3.x (*-*-freebsd2*, *-*-freebsd3*)</li>
+<li>GNU/Linux ELF (*-*-linux-gnu*, except aout, coff, and oldld)</li>
+<li>HP-UX 9.x, 10.x (*-*-hpux9*, *-*-hpux10*) [see note]</li>
+<li>IRIX 5.x, 6.x (*-*-irix5*, *-*-irix6*)</li>
+<li>NetBSD 1.x (*-*-netbsd*)</li>
+<li>OpenBSD 2.x (*-*-openbsd*)</li>
+<li>OS/2 using EMX (*-*-os2*)</li>
+<li>SCO OpenServer 5.x (*-*-sco3.2v5*)</li>
+<li>Solaris 2.x (*-*-solaris2*)</li>
+<li>SunOS 4.x, a.k.a. Solaris 1.x  (*-*-sunos4*)</li>
+<li>UnixWare 2.x (*-*-sysv4.2uw2*)</li>
+<li>UTS 4.x (*-*-uts4*)</li>
+<li>All ELF targets that use both the GNU C compiler (gcc) and GNU ld</li>
+</ul>
+
+<p>One more note from the libtool documentation: the HP/UX sed seems
+to be badly broken, install GNU sed before attempting to build -
+libtool depends on a working sed.</p>
+
+</body>
+</html>
diff --git a/jadedoc/contributors.htm b/jadedoc/contributors.htm
new file mode 100644 (file)
index 0000000..ee6b119
--- /dev/null
@@ -0,0 +1,101 @@
+<!-- -*- sgml -*- -->
+<html>
+
+<head>
+<meta http-equiv="Content-Type"
+content="text/html; charset=iso-8859-1">
+<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
+<title>Using Jade for SGML transformations</title>
+</head>
+
+<body background="images/background.gif" bgcolor="#FFFFFF">
+
+<p><font face="Geneva, Arial"><img src="images/dsssltitle.gif"
+alt="OpenJade" vspace="10" width="750" height="60"> </font></p>
+<div align="left">
+
+<table border="0" width="780">
+    <tr>
+        <td><font face="Geneva, Arial"><img
+        src="images/space.gif" alt="" width="145" height="10"></font></td>
+        <td><h1><font face="Arial">Contributors</font></h1>
+        <dl>
+            <dt><font face="Arial"><strong>James Clark:</strong></font></dt>
+            <dd><font face="Arial">The father of Jade. James made
+                the first version called Jade. He was
+                instrumental to the idea of a single set of flow
+                objects and multiple backend formats. James
+                carried the Jade project for several years until
+                it became a group project and got renamed
+                OpenJade. He is no longer participating to the
+                OpenJade project but his spirit still and will
+                always remain with us. He created most of the
+                Openjade code and the SGML/XML and the RTF
+                backends. But it is shorter to tell what he didn't
+                do than what he did :-)</font></dd>
+            <dt><font face="Arial"><strong>Matthias Clasen:</strong></font></dt>
+            <dd><font face="Arial">I am an old-time LaTeX user
+                and a scheme lover. My first jade hacking
+                experience was trying to use dsssl to produce
+                properly formatted indexes, realizing the need
+                for language-dependent string sorting. That code
+                is now part of OpenJade. Since I think that the
+                full power of DSSSL can only be explored with a
+                reasonably complete implementation, I am working
+                to fill the gaps in jade's coverage of the
+                standard.</font></dd>
+            <dt><font face="Arial"><strong>Avi Kivity:</strong></font></dt>
+            <dd><font face="Arial">I stumbled on Jade after
+                attempts to format SGML documents using C++
+                proved too cumbersome. I was impressed by the
+                power of DSSSL and the functional programming
+                style, which I hadn't used before. My main
+                interest is fully-integrated backends; that is,
+                formatters which do the layout themselves and do
+                not depend on external layout engines like TeX or
+                Word. I also maintain the CVS repository and
+                perform builds and releases. </font></dd>
+            <dt><font face="Arial"><strong>Didier PH Martin:</strong></font></dt>
+            <dd><font face="Arial">I encountered Jade simply by
+                browsing to find new ways to process XML/SGML
+                documents. I had to learn it without a book and
+                with minimal documentation. The more I know about
+                this environment the more I learn to appreciate
+                it. This is why, I am a fervant advocate of DSSSL,
+                OpenJade and work hard to provide to members of
+                the OpenJade community, a rich environment, an
+                adequate documentation, a future to this language.</font>
+            <p><font face="Arial">After more than 20 years in
+                the computer business, I still enjoy creating and
+                learning. As a canadian member of the ISO
+                Document Description and Processing Languages
+                comittee, my goal is to make a DSSSL-2 possible
+                reality. </font></dd>
+        <dt><font face="Arial"><strong>Peter Nilsson:</strong></font></dt>
+        <dd>The man behind braifo.</dd>
+        <dt><font face="Arial"><strong>Sebastian Ratz:</strong></font></dt>
+        <dd><font face="Arial">You have a question about Tex?
+        Sebastian is the right guy to answer to your question. He
+        created the Tex backend processor with David and Kathleen.</font></dd>
+        <dt><font face="Arial"><strong>Kathleen Marszalek:</strong></font></dt>
+        <dd><font face="Arial">She is the bee, working
+        hard and methodical. She created the Tex and MIF backends
+        with other members of the team.</font></dd>
+        <dt><font face="Arial"><strong>Paul Prescod:</strong></font></dt>
+        <dd><font face="Arial">Paul has always a good
+        comment to bring to the table. He created the MIF backend
+        with Kathleen.</font></dd>
+        <dt><font face="Arial"><strong>David Megginson:</strong></font></dt>
+        <dd><font face="Arial">An other fellow canadian
+        that is bringing every day to the XML community ideas,
+        new code, its commitment. He created the Tex backend with
+        Kathleen and Sebastian.</font></dd>
+        </dl>
+        </td>
+    </tr>
+</table>
+</div>
+
+<p>&nbsp;</p>
+</body>
+</html>
diff --git a/jadedoc/copying.txt b/jadedoc/copying.txt
new file mode 100644 (file)
index 0000000..31f290f
--- /dev/null
@@ -0,0 +1,26 @@
+Copyright (c) 1994, 1995, 1996 James Clark
+Copyright (c) 1999 The OpenJade group
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+``Software''), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL JAMES CLARK BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of James Clark shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from James Clark.
diff --git a/jadedoc/dsssl2.htm b/jadedoc/dsssl2.htm
new file mode 100644 (file)
index 0000000..c5590e9
--- /dev/null
@@ -0,0 +1,457 @@
+<!-- -*- sgml -*- -->
+<html>
+
+<head>
+<meta http-equiv="Content-Type"
+content="text/html; charset=iso-8859-1">
+<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
+<title>Experimental DSSSL extensions for XSL</title>
+</head>
+
+<body background="images/background.gif" bgcolor="#FFFFFF">
+
+<p><font face="Arial"><img src="images/dsssltitle.gif"
+alt="OpenJade" vspace="10" width="750" height="60"> </font></p>
+<div align="left">
+
+<table border="0" width="780">
+    <tr>
+        <td valign="top"><font face="Arial"><img
+        src="images/space.gif" alt="" width="145" height="10"></font></td>
+        <td><h1><font face="Arial">Experimental DSSSL extensions</font></h1>
+        <h2><font face="Arial">Contents</font></h2>
+        <ul>
+            <li><a href="#Introduction"><font face="Arial">Introduction</font></a><font
+                face="Arial"> </font></li>
+            <li><a href="#Imperative programming"><font
+                face="Arial">Imperative programming</font></a><font
+                face="Arial"> </font></li>
+            <li><a href="#Style rules"><font face="Arial">Style
+                rules</font></a><font face="Arial"> </font></li>
+            <li><a href="#ExtendedPatterns"><font face="Arial">Extended
+                Patterns</font></a><font face="Arial"> </font></li>
+            <li><a href="#Multiple patterns per rule"><font
+                face="Arial">Multiple patterns per rule</font></a><font
+                face="Arial"> </font></li>
+            <li><a href="#Flow object macros"><font face="Arial">Flow
+                object macros</font></a><font face="Arial"> </font></li>
+            <li><a href="#Characteristic value conversion"><font
+                face="Arial">Characteristic value convertion</font></a><font
+                face="Arial"> </font></li>
+            <li><a href="#Characteristic names"><font
+                face="Arial">Characteristic names</font></a><font
+                face="Arial"> </font></li>
+        </ul>
+        <h2><a name="Introduction"><font face="Arial">Introduction</font></a></h2>
+        <p><font face="Arial">This document descibes some
+        experimental extensions to DSSSL that are implemented in OpenJade. 
+       These are designed so that, with these extensions, DSSSL provides a 
+        superset of the semantics </font><a
+        href="http://www.w3.org/TR/NOTE-XSL-970910"><font
+        face="Arial">XSL</font></a><font face="Arial"> for flow
+        object tree construction. OpenJade has a <code>-2</code>
+        option that enables these extensions. </font></p>
+        <p><font face="Arial">These extensions do not include the
+        additional flow object classes and characteristics that
+        will be needed for XSL; in particular they do not include
+        the HTML/CSS flow object classes. </font></p>
+        <p><a href="#top"><font face="Arial"><img
+        src="images/top-of-page.gif" alt="Up" border="0"
+        width="11" height="15"></font></a><a href="#top"><font
+        size="2" face="Arial">Back to top</font></a><font
+        size="2" face="Arial">&nbsp;</font><font face="Arial"> </font></p>
+        <h2><a name="Imperative programming"><font face="Arial">Imperative
+        programming</font></a></h2>
+        <p><font face="Arial">The following features come from R4RS:
+        </font></p>
+        <ul>
+            <li><font face="Arial">assignment (<code>set!</code>)
+                expressions (with </font><a href="#read-only"><font
+                face="Arial">restrictions</font></a><font
+                face="Arial">) </font></li>
+            <li><font face="Arial">vectors (with </font><a
+                href="#read-only"><font face="Arial">restrictions</font></a><font
+                face="Arial">) </font></li>
+            <li><font face="Arial"><code>call-with-current-continuation</code>
+                (with </font><a href="#call/cc"><font
+                face="Arial">restrictions</font></a><font
+                face="Arial">) </font></li>
+            <li><font face="Arial"><code>begin</code> expressions
+                </font></li>
+            <li><font face="Arial">multiple expressions in
+                procedure bodies, <code>cond</code> clauses </font></li>
+            <li><font face="Arial">alternate in <code>if</code>
+                expression optional </font></li>
+            <li><font face="Arial">it is not an error when
+                nothing matches in <code>cond</code> or <code>case</code>
+                expression </font></li>
+            <li><font face="Arial"><code>eqv?</code> and <code>memv</code>
+                procedures; these behave as specified in R4RS for
+                vectors but behave the same as <code>equal?</code>
+                for strings and lists </font><p><font
+                face="Arial">This is so that case expressions can
+                use <code>eqv?</code> as required by R4RS without
+                breaking compatibility with existing DSSSL code
+                which assumes case expressions with strings and
+                lists will use <code>equal?</code>. R4RS
+                specifies that <code>eqv?</code> should return #t
+                when its arguments &quot;should normally be
+                regarded as the same object&quot;. R4RS treats
+                strings and lists as mutable and its
+                specification of <code>eqv?</code> for strings
+                and lists is consistent with this. So long as
+                DSSSL keeps strings and lists as immutable data-types
+                with value semantics, it is more consistent to
+                define <code>eqv?</code> to behave like <code>equal?</code>
+                for them. </font></p>
+            </li>
+        </ul>
+        <p><font face="Arial">The use of side-effects is
+        restricted. Assignment to top-level variables is not
+        allowed. There is also the concept that a memory location
+        can be read-only. When a memory location is read-only, it
+        is an error to change that location. An memory location
+        can be recursively marked as read-only; this means that
+        the memory location along with all memory locations
+        reachable from that memory location become read-only. A
+        memory location is recursively marked as read-only when: </font></p>
+        <ul>
+            <li><font face="Arial">an object stored in that
+                memory location is bound to a top-level variable </font></li>
+            <li><font face="Arial">an expression specifying a
+                characteristic is evaluated and a variable that
+                names that memory location occurs free in that
+                expression; for example, this would be an error: </font><pre><font
+face="Arial">
+(let ((x 10pt))
+  (make paragraph
+    font-size: (begin (set! x 12pt) x)))
+</font></pre>
+            </li>
+            <li><font face="Arial">an object stored in that
+                memory location is returned by a <code>(inherited-</code><code><var>C</var></code><code>)</code>
+                or <code>(actual-</code><code><var>C</var></code><code>)</code>
+                procedure </font></li>
+            <li><font face="Arial">an object stored in that
+                memory location is passed as the first argument
+                to the <code>node-list-map</code> procedure </font></li>
+        </ul>
+        <p><font face="Arial">A continuation created with <code>call-with-current-continuation</code>
+        cannot be called if it is read-only, and can only be used
+        to return to a stack frame in the current call chain (sometimes
+        referred to as upwards only). </font></p>
+        <p><font face="Arial">There's a <code>void</code> data
+        type with a single value which can be written as <code>#v</code>.
+        This is returned by <code>cond</code>, <code>case</code>
+        and <code>if</code> expressions which don't match. </font></p>
+        <p><a href="#top"><font face="Arial"><img
+        src="images/top-of-page.gif" alt="Up" border="0"
+        width="11" height="15"></font></a><a href="#top"><font
+        size="2" face="Arial">Back to top</font></a><font
+        size="2" face="Arial">&nbsp;</font><font face="Arial"> </font></p>
+        <h2><a name="Style rules"><font face="Arial">Style rules</font></a></h2>
+        <p><font face="Arial">When a construction rule has a
+        keyword argument list instead of a construct expression
+        it is treated as a style rule. For example, </font></p>
+        <pre><font face="Arial">
+(element H1
+  font-size: 14pt
+  font-weight: 'bold)
+</font></pre>
+        <p><font face="Arial">The keyword argument list can
+        include a <code>use:</code> keyword just as with <code>style</code>
+        expressions. See the </font><a
+        href="http://www.w3.org/TR/NOTE-XSL-970910"><font
+        face="Arial">XSL proposal</font></a><font face="Arial">
+        for the semantics of style rules. </font></p>
+        <p><a href="#top"><font face="Arial"><img
+        src="images/top-of-page.gif" alt="Up" border="0"
+        width="11" height="15"></font></a><a href="#top"><font
+        size="2" face="Arial">Back to top</font></a><font
+        size="2" face="Arial">&nbsp;</font><font face="Arial"> </font></p>
+        <h2><a name="ExtendedPatterns"><font face="Arial">Extended
+        patterns</font></a></h2>
+        <p><font face="Arial">The syntax for element patterns is
+        extended. These provide provide a superset of the
+        semantics of XSL patterns. They are allowed both in
+        element construction rules and in contexts where a <code>match-element?</code>
+        pattern is currently allowed (eg <code>select-elements</code>,
+        <code>process-matching-children</code>, <code>process-first-descendant</code>).
+        </font></p>
+        <p><font face="Arial">A pattern is either a single gi or
+        a list. A list consists of a sequence of gis, where each
+        gi can be followed by one or more keyword/value pairs (where
+        the value is always a single datum). A gi can be #t, a
+        string or a symbol. The following keywords are allowed: </font></p>
+        <dl>
+            <dt><font face="Arial"><code>id:</code> </font></dt>
+            <dd><font face="Arial">followed by a string or symbol
+                </font></dd>
+            <dt><font face="Arial"><code>class:</code> </font></dt>
+            <dd><font face="Arial">followed by a string or symbol
+                </font></dd>
+            <dt><font face="Arial"><code>repeat:</code> </font></dt>
+            <dd><font face="Arial">followed by one of the symbols
+                <code>*</code>, <code>+</code>, <code>?</code> </font></dd>
+            <dt><font face="Arial"><code>only:</code> </font></dt>
+            <dd><font face="Arial">followed by one of the symbols
+                <code>of-type</code>, <code>of-any</code> </font></dd>
+            <dt><font face="Arial"><code>position:</code> </font></dt>
+            <dd><font face="Arial">followed by one of the symbols
+                <code>first-of-type</code>, <code>first-of-any</code>,
+                <code>last-of-type</code>, <code>last-of-any</code>
+                </font></dd>
+            <dt><font face="Arial"><code>attributes:</code> </font></dt>
+            <dd><font face="Arial">followed by a list of name/value
+                pairs; for backward compatibility with <code>match-element?</code>
+                patterns in the current DSSSL standard the <code>attributes:</code>
+                keyword can be omitted; #t and #f can be used as
+                a value to test for presence or absence of
+                attributes. </font></dd>
+            <dt><font face="Arial"><code>children:</code> </font></dt>
+            <dd><font face="Arial">followed by a pattern; each of
+                the elements in the pattern must occur as child; <code>repeat:</code>
+                is not allowed in children patterns; the <code>children:</code>
+                qualifier is allowed on any gi in a pattern not
+                just the last element </font></dd>
+            <dt><font face="Arial"><code>priority:</code> </font></dt>
+            <dd><font face="Arial">followed by an integer;
+                multiple <code>priority:</code> qualifiers are
+                allowed in a pattern and will be added together </font></dd>
+            <dt><font face="Arial"><code>importance:</code> </font></dt>
+            <dd><font face="Arial">followed by an integer;
+                multiple <code>importance:</code> qualifiers are
+                allowed and will be added together </font></dd>
+        </dl>
+        <p><font face="Arial">Class attribute names are declared
+        using </font></p>
+        <pre><font face="Arial">
+(declare-class-attribute &quot;<var>class</var>&quot;)
+</font></pre>
+        <p><font face="Arial">or </font></p>
+        <pre><font face="Arial">
+(declare-class-attribute <var>class</var>)
+</font></pre>
+        <p><font face="Arial">Id attribute names can be declared
+        similarily using <code>declare-id-attribute</code>. </font></p>
+        <p><font face="Arial">Some examples: </font></p>
+        <pre><font face="Arial">
+(element (E importance: 42) <var>...</var>)
+
+(element (E attributes: (A1 V1)) <var>...</var>)
+
+(element (P E children: C) <var>...</var>)
+
+(element (P children: C priority: -11
+          E children: C attributes: (A1 V1 A2 V2))
+ <var>...</var>)
+
+(element (P E children: (A children: C B children: C)) <var>...</var>)
+</font></pre>
+        <p><font face="Arial">The last is equivalent to the
+        following in XSL syntax: </font></p>
+        <pre><font face="Arial">
+&lt;element type=&quot;P&quot;&gt;
+  &lt;target-element type=&quot;E&quot;&gt;
+     &lt;element type=&quot;A&quot;&gt;
+       &lt;element type=&quot;C&quot;/&gt;
+     &lt;/element&gt;
+     &lt;element type=&quot;B&quot;&gt;
+       &lt;element type=&quot;C&quot;/&gt;
+     &lt;/element&gt;
+  &lt;/target-element&gt;
+&lt;/element&gt;
+</font></pre>
+        <pre><a href="#top"><font face="Arial"><img
+src="images/top-of-page.gif" alt="Up" border="0" width="11"
+height="15"></font></a><a href="#top"><font size="3" face="Arial">Back to top</font></a><font
+size="3" face="Arial">&nbsp;</font></pre>
+        <h2><a name="Multiple patterns per rule"><font
+        face="Arial">Multiple patterns per rule</font></a></h2>
+        <p><font face="Arial">An <code>or-element</code>
+        construction rule has the syntax </font></p>
+        <pre><font face="Arial">
+(or-element (<var>pattern</var>+) <var>expression</var>)
+</font></pre>
+        <p><font face="Arial">where <code><var>pattern</var></code>
+        is any pattern that could be allowed in an element
+        construction rule. It is equivalent to a sequence of
+        element construction rules. </font></p>
+        <p><font face="Arial">For example, </font></p>
+        <pre><font face="Arial">
+(or-element (H1 H2 H3)
+  font-weight: 'bold)
+
+(or-element ((H1 TITLE) (H2 TITLE) (H3 TITLE))
+  font-weight: 'bold)
+</font></pre>
+        <p><font face="Arial">is equivalent to </font></p>
+        <pre><font face="Arial">
+(element H1
+  font-weight: 'bold)
+
+(element H2
+  font-weight: 'bold)
+
+(element H3
+  font-weight: 'bold)
+
+(element (H1 TITLE)
+  font-weight: 'bold)
+
+(element (H2 TITLE)
+  font-weight: 'bold)
+
+(element (H3 TITLE)
+  font-weight: 'bold)
+</font></pre>
+        <pre><a href="#top"><font face="Arial"><img
+src="images/top-of-page.gif" alt="Up" border="0" width="11"
+height="15"></font></a><a href="#top"><font size="3" face="Arial">Back to top</font></a><font
+size="2" face="Arial">&nbsp;</font></pre>
+        <h2><a name="Flow object macros"><font face="Arial">Flow
+        object macros</font></a></h2>
+        <p><font face="Arial">A flow object macro can be defined
+        like this: </font></p>
+        <p align="left"><font face="Arial">&nbsp; </font></p>
+        <div align="left"><table border="0" width="546"
+        bgcolor="#FFFFBB">
+            <tr>
+                <td width="542"><dl>
+                    <dt><font face="Arial">(declare-flow-object-macro
+                        list-item ((indent 1in) (marker &quot;\bullet&quot;)
+                        #!contents contents)<br>
+                        &nbsp; (make paragraph<br>
+                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                        first-line-start-indent: (- indent)<br>
+                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                        start-indent: (+ indent (inherited-start-indent))<br>
+                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (make
+                        line-field<br>
+                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                        field-width: indent<br>
+                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                        (literal marker)</font></dt>
+                    <dt><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                        )<br>
+                        &nbsp; contents</font></dt>
+                    <dt><font face="Arial">&nbsp; )</font></dt>
+                    <dt><font face="Arial">)<br>
+                        <br>
+                        (root<br>
+                        &nbsp;&nbsp;&nbsp; (make simple-page-sequence<br>
+                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                        (make paragraph<br>
+                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                        (literal &quot;Para 1&quot;)</font></dt>
+                    <dt><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                        )<br>
+                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                        (make list-item<br>
+                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                        (literal &quot;Item 1&quot;)<br>
+                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                        (make list-item<br>
+                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                        indent: .5in<br>
+                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                        marker: &quot;\black-circle&quot;<br>
+                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                        (literal &quot;Sub item 1.1&quot;)</font></dt>
+                    <dt><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                        )</font></dt>
+                    <dt><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                        )<br>
+                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                        (make list-item<br>
+                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                        font-weight: 'bold<br>
+                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                        (literal &quot;Item 2&quot;)<br>
+                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                        (make list-item<br>
+                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                        (literal &quot;Sub item 2.1&quot;)</font></dt>
+                    <dt><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                        )</font></dt>
+                    <dt><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                        )<br>
+                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                        (make paragraph<br>
+                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                        (literal &quot;Para 2&quot;)</font></dt>
+                    <dt><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                        )</font></dt>
+                    <dt><font face="Arial">&nbsp;&nbsp;&nbsp; )</font></dt>
+                    <dt><font face="Arial">)</font></dt>
+                </dl>
+                </td>
+            </tr>
+        </table>
+        </div><p><font face="Arial">If the formal argument list
+        includes <code>#!contents</code> the flow object behaves
+        like a compound flow object, otherwise like an atomic
+        flow object. Inherited characteristics can be specified;
+        these are applied to a sequence flow object which is
+        automatically wrapped around what is returned by the body
+        of the flow object macro. The preceding formal arguments
+        are the non-inherited characteristics; like keyword
+        arguments they can be specified either as <code><var>id</var></code>
+        (in which case they default to #f), or as <code>(</code><code><var>id</var></code><code>
+        </code><code><var>init-expression</var></code><code>)</code>.
+        </font></p>
+        <p><font face="Arial">Note that flow object macros are
+        quite different from ordinary procedures in that the
+        macro body is not evaluated when the make expression is
+        evaluated, but rather when the flow object is to be added
+        to the tree; this allows <code>(inherited-</code><code><var>c</var></code><code>)</code>
+        and <code>(actual-</code><code><var>c</var></code><code>)</code>
+        procedures to be used in flow object macro
+        characteristics, non-inherited as well as inherited, just
+        as with normal flow objects. It is also possible to use <code>(inherited-</code><code><var>c</var></code><code>)</code>
+        and <code>(actual-</code><code><var>c</var></code><code>)</code>
+        procedures in the body of the flow object macro; they
+        will return the same result as if they were used in the
+        specification of a characteristic on the invocation of
+        the flow object macro. </font></p>
+        <p><font face="Arial">For an example of a library built
+        with the macro facility read: </font><a
+        href="../DSSSL/HTML%20Sample.html"><font face="Arial">Simple
+        XML to HTML Conversion and Rendition Example</font></a><font
+        face="Arial"> </font></p>
+        <p><a href="#top"><font face="Arial"><img
+        src="images/top-of-page.gif" alt="Up" border="0"
+        width="11" height="15"></font></a><a href="#top"><font
+        size="2" face="Arial">Back to top</font></a><font
+        size="2" face="Arial">&nbsp;</font><font face="Arial"> </font></p>
+        <h2><a name="Characteristic value conversion"><font
+        face="Arial">Characteristic value conversion</font></a></h2>
+        <p><font face="Arial">Most characteristic values can now
+        be specified as strings and will be converted
+        appropriately. For boolean valued characteristics any of
+        the strings <code>&quot;true&quot;</code>, <code>&quot;false&quot;</code>,
+        <code>&quot;yes&quot;</code> and <code>&quot;no&quot;</code>
+        are acceptable. </font></p>
+        <p><a href="#top"><font face="Arial"><img
+        src="images/top-of-page.gif" alt="Up" border="0"
+        width="11" height="15"></font></a><a href="#top"><font
+        size="2" face="Arial">Back to top</font></a><font
+        size="2" face="Arial">&nbsp;</font><font face="Arial"> </font></p>
+        <h2><a name="Characteristic names"><font face="Arial">Characteristic
+        names</font></a></h2>
+        <p><font face="Arial">The question mark that can be
+        omitted from those DSSSL characteristic names that end
+        with a question mark. This is because the question mark
+        is not (and cannot reasonably be made) a legal XML name
+        character. </font></p>
+        <p><a href="#top"><font face="Arial"><img
+        src="images/top-of-page.gif" alt="Up" border="0"
+        width="11" height="15"></font></a><a href="#top"><font
+        size="2" face="Arial">Back to top</font></a><font
+        size="2" face="Arial">&nbsp;</font><font face="Arial"> </font></p>
+        </td>
+    </tr>
+</table>
+</div>
+</body>
+</html>
diff --git a/jadedoc/images/background.gif b/jadedoc/images/background.gif
new file mode 100644 (file)
index 0000000..0b4f934
Binary files /dev/null and b/jadedoc/images/background.gif differ
diff --git a/jadedoc/images/dsssltitle.gif b/jadedoc/images/dsssltitle.gif
new file mode 100644 (file)
index 0000000..81e9ddc
Binary files /dev/null and b/jadedoc/images/dsssltitle.gif differ
diff --git a/jadedoc/images/space.gif b/jadedoc/images/space.gif
new file mode 100644 (file)
index 0000000..a538d98
Binary files /dev/null and b/jadedoc/images/space.gif differ
diff --git a/jadedoc/images/top-of-page.gif b/jadedoc/images/top-of-page.gif
new file mode 100644 (file)
index 0000000..583fb67
Binary files /dev/null and b/jadedoc/images/top-of-page.gif differ
diff --git a/jadedoc/index.htm b/jadedoc/index.htm
new file mode 100644 (file)
index 0000000..5eef6cc
--- /dev/null
@@ -0,0 +1,743 @@
+<html>
+
+<head>
+<meta http-equiv="Content-Type"
+content="text/html; charset=iso-8859-1">
+<meta name="ProgId" content="FrontPage.Editor.Document">
+<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
+<title>OpenJade</title>
+</head>
+
+<body background="images/background.gif">
+
+<p><font face="Arial"><img src="images/dsssltitle.gif" 
+  alt="OpenJade" vspace="10" width="750" 
+  height="60"> &nbsp; </font></p>
+
+<p><font face="Arial">&nbsp; </font></p>
+
+<table border="0" cellpadding="0" cellspacing="0" width="773">
+<TBODY>    <tr>
+        <td valign="top" width="141"><font face="Arial"><img
+        src="images/space.gif" alt="" width="145" height="10"></font></td>
+        <td valign="top"><h1><font face="Geneva, Arial">OpenJade</font></h1>
+       <h2><font face="Arial">Contents</font></h2>
+        <ul>
+            <li><a
+                href="#whatis"><font
+                face="Arial">What is OpenJade?</font></a></li>
+            <li><a
+                href="#copyright"><font
+                face="Arial">Copyright</font></a></li>
+            <li><a
+                href="http://jade-cvs.avionitek.com/download.html"><font
+                face="Arial">Getting OpenJade</font></a></li>
+            <li><a
+                href="#build"><font
+                face="Arial">Building OpenJade</font></a></li>
+            <li><a
+                href="#install"><font
+                face="Arial">Installing OpenJade</font></a></li>
+            <li><a
+                href="#using"><font
+                face="Arial">Using OpenJade</font></a></li>
+            <li><a
+                href="#extensions"><font
+                face="Arial">OpenJade Extensions</font></a></li>
+            <li><a
+                href="#limitations"><font
+                face="Arial">Current OpenJade Limitations</font></a></li>
+            <li><a href="../NEWS"><font
+                face="Arial">New additions to previous versions</font></a></li>
+            <li><a href="dsssl2.htm"><font face="Arial">Experimental
+                DSSSL extensions</font></a></li>
+            <li><font face="Arial">Backends</font>
+                <ul>
+                    <li><a href="rtf.htm"><font face="Arial">RTF</font></a></li>
+                    <li><a href="xmlfo.htm"><font face="Arial">XML
+                        Flow Object Tree</font></a></li>
+                    <li><a href="tex.htm"><font face="Arial">TeX</font></a></li>
+                    <li><a href="mif.htm"><font face="Arial">MIF</font></a></li>
+                    <li><a href="transform.htm"><font
+                        face="Arial">SGML Transformation</font></a></li>
+                </ul>
+            </li>
+            <li><a
+                href="#source"><font
+                face="Arial">About OpenJade sources</font></a></li>
+            <li><a href="http://jade-cvs.avionitek.com/bugs.html"><font
+                face="Arial">Reporting bugs in OpenJade</font></a></li>
+            <li><a href="contributors.htm"><font face="Arial">OpenJade
+                contributors</font></a></li>
+        </ul>
+        <h2><a name="whatis"><font face="Arial">What is OpenJade?</font></a></h2>
+        <p><font face="Arial">OpenJade is an implementation of
+        the ISO/IEC 10179:1996 standard DSSSL language. It is
+        based on the </font><a href="http://www.jclark.com/"><font
+        face="Arial">James Clark</font></a><font face="Arial">
+        implementation of DSSSL named </font><a
+        href="http://www.jclark.com/jade/"><font face="Arial">Jade</font></a><font
+        face="Arial">. OpenJade is now developed and maintained
+        by the OpenJade team. The current version is 1.3. </font></p>
+        <p><font face="Arial">For general information about DSSSL,
+        see the </font><a href="http://www.netfolder.com/DSSSL/"><font
+        face="Arial">OpenJade home page</font></a><font
+        face="Arial">. The OpenJade home page contains useful
+        resources such as links to articles, tutorials, libraries,
+        etc. </font></p>
+        <p><font face="Arial">Another site with lots of in-depth
+        information about DSSSL is that of </font><a
+        href="http://www.mulberrytech.com/dsssl/"><font
+        face="Arial">Mulberry Technologies</font></a><font
+        face="Arial">. Among other things, it hosts the DSSSL
+        Users mailing list.</font></p>
+        <p><font face="Arial">OpenJade is a command line
+        application and a set of components. The DSSSL engine
+        receives as input an SGML or XML document and transforms
+        it into formats like: </font></p>
+        <ul>
+            <li><font face="Arial">XML representation of the flow
+                object tree. </font></li>
+            <li><font face="Arial">RTF format that can be
+                rendered and printed with Microsoft's free </font><a
+                href="http://www.microsoft.com/word/internet/viewer/"><font
+                face="Arial">Word Viewer 97</font></a></li>
+            <li><font face="Arial">TeX format </font></li>
+            <li><font face="Arial">MIF format that can be
+                rendered and printed with </font><a
+                href="http://www.adobe.com/prodindex/framemaker/main.html/"><font
+                face="Arial">Framemaker</font></a></li>
+            <li><font face="Arial">SGML or XML format. This is
+                used in conjunction with non-standard flow object
+                classes to generate SGML, thus allowing OpenJade
+                to be used for SGML/XML transformations.<br>
+                </font></li>
+        </ul>
+        <p><a href="#top"><font
+        face="Arial"><img src="images/top-of-page.gif"
+        alt="Up" border="0" width="11" height="15"></font></a><a
+        href="#top"><font
+        size="2" face="Arial">Back to top</font></a><font
+        size="2" face="Arial">&nbsp;</font></p>
+        <h2><a name="copyright"><font face="Arial">Copyright</font></a></h2>
+        <p><font face="Arial">OpenJade is licensed with almost no
+        restrictions even for commercial use (</font><a
+        href="copying.txt"><font
+        face="Arial">see license terms</font></a><font
+        face="Arial">). </font></p>
+        <p><font face="Arial">If you do use OpenJade in a
+        commercial product, we ask you, as a courtesy, to
+        acknowledge the use of OpenJade. </font></p>
+        <p><a href="#top"><font face="Arial"><img src="images/top-of-page.gif"
+        alt="Up" border="0" width="11" height="15"></font></a><a
+        href="#top"><font size="2" face="Arial">Back to top</font></a></p>
+
+        <h2><a name="build"><font face="Arial">Building OpenJade</font></a></h2>
+
+<basefont face="Arial">
+<h3><A NAME=building-win32>Win32</A></h3>
+<p>
+Only Microsoft Visual C++ 6.0 is supported. Also, Perl 5 is required; the
+executable must be on your PATH.
+</p>
+<p>
+To build on the command line, ensure that the directories
+containing <code>msdev</code> and <code>nmake</code> are in your path,
+typically by executing
+the command:
+<pre>
+path C:/Program Files/Microsoft Visual Studio/Common/MSDev98/Bin;
+    C:/Program Files/Microsoft Visual Studio/VC98/Bin;%path%
+</pre>
+<p>
+(all in one long line) then run the command:
+<pre>
+build-win32.bat
+</pre>
+<p>
+To build using the Visual
+Studio GUI, open the workspace <code>jade.dsw</code> and build the
+<code>Win32&nbsp;Release</code> configuration of the <code>all</code>
+project.  You must first do a command-line build, however, to get
+the perl-generated files.
+</p>
+<h3><A NAME=building-unix>Unix</A></h3>
+<p>
+The following compilers should work:
+<ul>
+<li>gcc 2.95.1
+<li>egcs 1.1.2
+<li>egcs 1.0.2
+<li>gcc 2.8.1
+<li>gcc 2.7.2
+</ul>
+<p>Only the first two have been recently tested.
+<p>
+If you use gcc 2.7.2 with -O on an x86 processor you must use
+-fno-strength-reduce. gcc 2.7.2.1 fixes this problem.
+<p>
+Edit <code>Makefile</code>, then build with <code>make</code>.  Note
+that you must use -DSP_MULTI_BYTE. If you plan to do any development,
+also do <code>make depend</code>.
+Alternatively you can build using the <a
+HREF="autoconf.htm">experimental autoconf support</a>. This
+will soon be the recommended method.
+
+               <p><a href="#top"><font face="Arial"><img src="images/top-of-page.gif"
+        alt="Up" border="0" width="11" height="15"></font></a><a
+        href="#top"><font size="2" face="Arial">Back to top</font></a></p>
+
+        <h2><a name="install"><font face="Arial">Installing OpenJade</font></a></h2>
+
+<h3><A NAME=install-win32>Win32</A></h3>
+<p>
+OpenJade requires the file <code>dsssl/builtins.dsl</code> to operate.
+You can tell OpenJade where this file is in one of two ways:
+<ul>
+<li>By including a SYSTEM catalog entry for "builtins.dsl" pointing to this
+file. See <code>dsssl/catalog</code> for an example.</li>
+<li>By including the <code>dsssl/catalog</code> catalog with the
+<code>-c</code> command line option or the <code>SGML_CATALOG_FILES</code>
+environment variable.</li>
+</ul>
+<h3><A NAME=install-unix>Unix</A></h3>
+<p>
+Run
+<pre>
+make install
+</pre>
+as <code>root</code>.
+
+        <p><a href="#top"><font face="Arial"><img src="images/top-of-page.gif"
+        alt="Up" border="0" width="11" height="15"></font></a><a
+        href="#top"><font size="2" face="Arial">Back to top</font></a></p>
+
+        <h2><a name="using"><font face="Arial">Using OpenJade</font></a></h2>
+        <p><font face="Arial">Add the directory containing the
+        OpenJade binary to your path, change directory to the
+        dsssl directory, and do </font></p>
+        <pre><font face="Arial">
+openjade demo.sgm
+</font></pre>
+        <p><font face="Arial">If everything is working, there
+        should be a well-formed XML file <code>demo.fot</code>
+        created. </font></p>
+        <p><font face="Arial">The system identifier of the
+        document to be processed is specified as an argument to
+        OpenJade. If this is omitted, standard input will be read.
+        </font></p>
+        <p><font face="Arial">OpenJade determines the system
+        identifier for the DSSSL specification as follows: </font></p>
+        <ol>
+            <li><font face="Arial">If the <code>-d</code> option
+                is specified, it will use the argument as the
+                system identifier. </font></li>
+            <li><font face="Arial">Otherwise, it will look for
+                processing instructions in the prolog of the
+                document. Two kinds of processing instruction are
+                recognized: </font><dl>
+                    <dt><font face="Arial"><code>&lt;?stylesheet
+                        href=&quot;</code><code><var>sysid</var></code><code>&quot;
+                        type=&quot;text/dsssl&quot;&gt;</code></font></dt>
+                    <dd><font face="Arial">The system data of the
+                        processing instruction is parsed like an
+                        SGML start-tag. It will be parsed using
+                        the reference concrete syntax whatever
+                        the actual concrete syntax of the
+                        document. The name that starts the
+                        processing instruction can be either <code>stylesheet</code>,
+                        <code>xml-stylesheet</code> or <code>xml:stylesheet</code>.
+                        The processing instruction will be
+                        ignored unless the value of the <code>type</code>
+                        attribute is one of <code>text/dsssl</code>,
+                        <code>text/x-dsssl</code>, <code>application/dsssl</code>,
+                        or <code>application/x-dsssl</code>. The
+                        value of <code>href</code> attribute is
+                        the system identifier of the DSSSL
+                        specification. </font></dd>
+                    <dt><font face="Arial"><code>&lt;?dsssl </code><code><var>sysid</var></code><code>&gt;</code>
+                        </font></dt>
+                    <dd><font face="Arial">The system identifier
+                        is the portion of the system data of the
+                        processing instruction following the
+                        initial name and any whitespace. </font></dd>
+                </dl>
+                <p><font face="Arial">Although the processing
+                instruction is only recognized in the prolog, it
+                need not occur in the document entity. For
+                example, it could occur in a DTD. The system
+                identifier will be interpreted relative to where
+                the the processing instruction occurs. </font></p>
+            </li>
+            <li><font face="Arial">Otherwise, it will use the
+                system identifier of the document with any
+                extension changed to <code>.dsl</code>. </font></li>
+        </ol>
+        <p><font face="Arial">A DSSSL specification document can
+        contain more than one style-specification. If the system
+        identifier of the DSSSL specification is followed by <code>#</code><code><var>id</var></code>,
+        then OpenJade will use the style-specification whose
+        unique identifier is <code><var>id</var></code>. This is
+        allowed both with the <code>-d</code> option and with the
+        processing instructions. </font></p>
+        <p><font face="Arial">The DSSSL specification must be an
+        SGML document conforming to the DSSSL architecture. For
+        an example, see <code>dsssl/demo.dsl</code>. </font></p>
+        <p><font face="Arial">OpenJade supports the following
+        options in addition to the normal SP options (note that
+        all options are case-sensitive, ie <code>-g</code> and <code>-G</code>
+        are different options):</font></p>
+        <dl>
+            <dt><font face="Arial"><code>-d</code> <i>dsssl_spec</i></font>
+            </dt>
+            <dd><font face="Arial">This specifies that <i>dsssl_spec</i>
+                is the system identifier of the DSSSL
+                specification to be used.</font> </dd>
+            <dt><font face="Arial"><code>-G</code></font></dt>
+            <dd><font face="Arial">Debug mode. When an error
+                occurs in the evaluation of an expression,
+                OpenJade will display a stack trace. Note that
+                this disables tail-call optimization.</font></dd>
+            <dt><font face="Arial"><code>-c</code> <i>filename</i></font></dt>
+            <dd><font face="Arial">The <i>filename</i> arguments
+                specify catalog files rather than the document
+                entity. The document entity is specified by the
+                first <samp>DOCUMENT</samp> entry in the catalog
+                files.</font></dd>
+            <dt><font face="Arial"><code>-s</code></font></dt>
+            <dd><font face="Arial">Strict compliance mode.
+                Currently the only effect is that jade doesn't
+                use any predefined character names, sdata-entity
+                mappings or name-characters. This is useful for
+                checking that your stylesheet is portable to
+                other DSSSL implementations and that it is
+                strictly compliant to the DSSSL specifications.</font></dd>
+            <dt><font face="Arial"><code>-t</code> <i>output_type</i></font></dt>
+            <dd><font face="Arial"><i>output_type</i> specifies
+                the type of output as follows:</font> <dl compact>
+                    <dt><font face="Arial"><code>fot</code></font></dt>
+                    <dd><font face="Arial">An XML representation
+                        of the flow object tree </font></dd>
+                    <dt><font face="Arial"><code>rtf</code> <code>rtf-95</code>
+                        </font></dt>
+                    <dd><font face="Arial">RTF (used for SGML/XML
+                        to RTF transformations)</font></dd>
+                    <dd><font face="Arial">Microsoft's Rich Text
+                        Format. <code>rtf-95</code> produces
+                        output optimized for Word 95 rather than
+                        Word 97.</font></dd>
+                    <dt><font face="Arial"><code>tex</code></font></dt>
+                    <dd><font face="Arial">TeX (used for SGML/XML
+                        to TeX transformations)</font></dd>
+                    <dt><font face="Arial"><code>sgml</code> <code>sgml-raw</code>
+                        </font></dt>
+                    <dd><font face="Arial">SGML (used for SGML/XML
+                        to SGML transformations). 
+                        <code>sgml-raw</code> doesn't emit linebreaks in tags.
+                        </font></dd>
+                    <dt><font face="Arial"><code>xml</code> <code>xml-raw</code>
+                        </font></dt>
+                    <dd><font face="Arial">XML (used for SGML/XML
+                        to XML transformations).
+                        <code>xml-raw</code> doesn't emit linebreaks in tags.
+                        </font></dd>
+                    <dt><font face="Arial">html</font> </dt>
+                    <dd><font face="Arial">HTML (used for SGML/XML
+                        to HTML transformations)</font></dd>
+                    <dt><font face="Arial"><code>mif</code></font></dt>
+                    <dd><font face="Arial">MIF (used for SGML/XML
+                        to MIF transformations)</font></dd>
+                </dl>
+            </dd>
+            <dt><font face="Arial"><code>-o</code> <i>output_file</i>
+                </font></dt>
+            <dd><font face="Arial">Write output to <i>output_file</i>
+                instead of the default. The default filename is
+                the name of the last input file with its
+                extension replaced by the name of the type of
+                output. If there is no input filename, then the
+                extension is added onto <i>jade-out</i>. </font></dd>
+            <dt><font face="Arial"><code>-V</code> <i>variable</i>
+                </font></dt>
+            <dd><font face="Arial">This is equivalent to doing <code>(define
+                variable #t)</code> except that this definition
+                will take priority over any definition of
+                variable in a style-sheet. </font></dd>
+            <dt><font face="Arial"><code>-V</code> <i>variable=value</i>
+                </font></dt>
+            <dd><font face="Arial">This is equivalent to doing <code>(define
+                variable &quot;value&quot;)</code> except that
+                this definition will take priority over any
+                definition of variable in a style-sheet. </font></dd>
+            <dt><font face="Arial"><code>-V</code> <i>(define
+                variable value)</i></font></dt>
+            <dd><font face="Arial">This is equivalent to doing <code>(define
+                variable value)</code> except that this
+                definition will take priority over any definition
+                of variable in a style-sheet. Note that you will probably
+                have to use some escaping mechanism for the spaces to get 
+                the entire scheme expression parsed as one cmdline argument.</font></dd>
+            <dt><a name="optw"><font face="Arial"><code>-wtype</code></font></a><font
+                face="Arial"> (examples: wxml, wmixed, wsgmldecl,
+                etc.) </font></dt>
+            <dd><font face="Arial">Control warnings and errors.
+                Multiple <samp>-w</samp> options are allowed. The
+                following values of <samp><var>type</var></samp>
+                enable warnings: </font><dl>
+                    <dt><font face="Arial"><samp>xml</samp></font></dt>
+                    <dd><font face="Arial">Warn about constructs
+                        that are not allowed by </font><a
+                        href="http://www.w3.org/TR/1998/REC-xml-19980210"><font
+                        face="Arial">XML</font></a><font
+                        face="Arial">.</font></dd>
+                    <dt><font face="Arial"><samp>mixed</samp></font></dt>
+                    <dd><font face="Arial">Warn about mixed
+                        content models that do not allow #pcdata
+                        anywhere.</font></dd>
+                    <dt><font face="Arial"><samp>sgmldecl</samp></font></dt>
+                    <dd><font face="Arial">Warn about various
+                        dubious constructions in the SGML
+                        declaration.</font></dd>
+                    <dt><font face="Arial"><samp>should</samp></font></dt>
+                    <dd><font face="Arial">Warn about various
+                        recommendations made in ISO 8879 that the
+                        document does not comply with. (Recommendations
+                        are expressed with ``should'', as
+                        distinct from requirements which are
+                        usually expressed with ``shall''.)</font></dd>
+                    <dt><font face="Arial"><samp>default</samp></font></dt>
+                    <dd><font face="Arial">Warn about defaulted
+                        references.</font></dd>
+                    <dt><font face="Arial"><samp>duplicate</samp>
+                        </font></dt>
+                    <dd><font face="Arial">Warn about duplicate
+                        entity declarations.</font></dd>
+                    <dt><font face="Arial"><samp>undefined</samp>
+                        </font></dt>
+                    <dd><font face="Arial">Warn about undefined
+                        elements: elements used in the DTD but
+                        not defined.</font></dd>
+                    <dt><font face="Arial"><samp>unclosed</samp></font></dt>
+                    <dd><font face="Arial">Warn about unclosed
+                        start and end-tags.</font></dd>
+                    <dt><font face="Arial"><samp>empty</samp></font></dt>
+                    <dd><font face="Arial">Warn about empty start
+                        and end-tags.</font></dd>
+                    <dt><font face="Arial"><samp>net</samp></font></dt>
+                    <dd><font face="Arial">Warn about net-enabling
+                        start-tags and null end-tags.</font></dd>
+                    <dt><font face="Arial"><samp>min-tag</samp></font></dt>
+                    <dd><font face="Arial">Warn about minimized
+                        start and end-tags. Equivalent to
+                        combination of <samp>unclosed</samp>, <samp>empty</samp>
+                        and <samp>net</samp> warnings.</font></dd>
+                    <dt><font face="Arial"><samp>unused-map</samp></font></dt>
+                    <dd><font face="Arial">Warn about unused
+                        short reference maps: maps that are
+                        declared with a short reference mapping
+                        declaration but never used in a short
+                        reference use declaration in the DTD.</font></dd>
+                    <dt><font face="Arial"><samp>unused-param</samp></font></dt>
+                    <dd><font face="Arial">Warn about parameter
+                        entities that are defined but not used in
+                        a DTD. Unused internal parameter entities
+                        whose text is <samp>INCLUDE</samp> or <samp>IGNORE</samp>
+                        won't get the warning.</font></dd>
+                    <dt><font face="Arial"><samp>notation-sysid</samp></font></dt>
+                    <dd><font face="Arial">Warn about notations
+                        for which no system identifier could be
+                        generated.</font></dd>
+                    <dt><font face="Arial"><samp>all</samp></font></dt>
+                    <dd><font face="Arial">Warn about conditions
+                        that should usually be avoided (in the
+                        opinion of the author). Equivalent to: <samp>mixed</samp>,
+                        <samp>should</samp>, <samp>default</samp>,
+                        <samp>undefined</samp>, <samp>sgmldecl</samp>,
+                        <samp>unused-map</samp>, <samp>unused-param</samp>,
+                        <samp>empty</samp> and <samp>unclosed</samp>.
+                        </font></dd>
+                </dl>
+                <p><font face="Arial">A warning can be disabled
+                by using its name prefixed with <samp>no-</samp>.
+                Thus <samp>-wall -wno-duplicate</samp> will
+                enable all warnings except those about duplicate
+                entity declarations.</font></p>
+                <p><font face="Arial">The following values for <samp><var>warning_type</var></samp>
+                disable errors:</font></p>
+                <dl>
+                    <dt><font face="Arial"><samp>no-idref</samp></font></dt>
+                    <dd><font face="Arial">Do not give an error
+                        for an ID reference value which no
+                        element has as its ID. The effect will be
+                        as if each attribute declared as an ID
+                        reference value had been declared as a
+                        name.</font></dd>
+                    <dt><font face="Arial"><samp>no-significant</samp>
+                        </font></dt>
+                    <dd><font face="Arial">Do not give an error
+                        when a character that is not a
+                        significant character in the reference
+                        concrete syntax occurs in a literal in
+                        the SGML declaration. This may be useful
+                        in conjunction with certain buggy test
+                        suites.</font></dd>
+                    <dt><font face="Arial"><samp>no-valid</samp></font></dt>
+                    <dd><font face="Arial">Do not require the
+                        document to be type-valid. This has the
+                        effect of changing the SGML declaration
+                        to specify <samp>VALIDITY NOASSERT</samp>
+                        and <samp>IMPLYDEF ATTLIST YES ELEMENT
+                        YES</samp>. An option of <samp>-wvalid</samp>
+                        has the effect of changing the SGML
+                        declaration to specify <samp>VALIDITY
+                        TYPE</samp> and <samp>IMPLYDEF ATTLIST NO
+                        ELEMENT NO</samp>. If neither <samp>-wvalid</samp>
+                        nor <samp>-wno-valid</samp> are specified,
+                        then the <samp>VALIDITY</samp> and <samp>IMPLYDEF</samp>
+                        specified in the SGML declaration will be
+                        used.</font></dd>
+                </dl>
+            </dd>
+        </dl>
+        <p><font face="Arial">OpenJade ignores the <samp>SP_CHARSET_FIXED</samp>
+        and <samp>SP_SYSTEM_CHARSET</samp> environment variables
+        and always uses Unicode as its internal character set, as
+        if <samp>SP_CHARSET_FIXED</samp> was 1 and <samp>SP_SYSTEM_CHARSET</samp>
+        was unset. Thus only the <samp>SP_ENCODING</samp>
+        environment variable is relevant to OpenJade's handling
+        of character sets.</font></p>
+        <p><a href="#top"><font
+        face="Arial"><img src="images/top-of-page.gif"
+        alt="Up" border="0" width="11" height="15"></font></a><a
+        href="#top"><font
+        size="2" face="Arial">Back to top</font></a><font
+        size="2" face="Arial">&nbsp;</font></p>
+        <h2><a name="extensions"><font face="Arial">OpenJade
+        Extensions</font></a></h2>
+        <p><font face="Arial">The following external procedures
+        are available. These external procedures are defined by a
+        prototype in the same manner as in the standard. To use
+        one of these external procedures, you must make use of
+        the standard <code>external-procedure</code> procedure,
+        using a public identifier of <code>&quot;UNREGISTERED::James
+        Clark//Procedure::</code><code><var>name</var></code><code>&quot;</code>
+        where <code><var>name</var></code> is the name given here,
+        typically by including the following in the DSSSL
+        specification:</font></p>
+        <pre><font face="Arial">
+(define <var>name</var>
+  (external-procedure &quot;UNREGISTERED::James Clark//Procedure::<var>name</var>&quot;))
+</font></pre>
+        <p><font face="Arial">Note that <code>external-procedure</code>
+        returns <code>#f</code> if it doesn't know about the
+        specified public identifier. You can use this to enable
+        your DSSSL specifications to work gracefully with other
+        implementations which do not support these extensions. </font></p>
+        <p><font face="Arial">For external procedures added by
+        the OpenJade team, use a public identifier of the form <code>&quot;UNREGISTERED::OpenJade//Procedure::</code><code><var>name</var></code><code>&quot;</code>.
+        </font></p>
+        <p><font face="Arial">An easy way to get access to all
+        external procedures is to use the style specification
+        <code>dsssl/extensions.dsl#procedures</code>. The file
+        <code>dsssl/extensions.dsl</code> also contains style
+        specifications which make the nonstandard flow object classes
+        and inherited characteristics supported by the backends 
+        available in a convenient way.
+        </font></p>
+        <h3><font face="Arial">Debugging</font></h3>
+        <pre><font face="Arial">
+(debug <var>obj</var>)
+</font></pre>
+        <p><font face="Arial">Generates a message including the
+        value of <code><var>obj</var></code> and then returns <code><var>obj</var></code>.
+        </font></p>
+        <h3><font face="Arial">Simple-page-sequence header/footer
+        control</font></h3>
+        <pre><font face="Arial">
+(if-first-page <var>sosofo1</var> <var>sosofo2</var>)
+</font></pre>
+        <p><font face="Arial">This can be used only in the
+        specification of the value of one of the header/footer
+        characteristics of simple-page-sequence. It returns a
+        sosofo that will display as <code><var>sosofo1</var></code>
+        if the page is the first page of the simple-page-sequence
+        and as <code><var>sosofo2</var></code> otherwise.</font></p>
+        <pre><font face="Arial">
+
+(if-front-page <var>sosofo1</var> <var>sosofo2</var>)
+</font></pre>
+        <p><font face="Arial">This can be used only in the
+        specification of the value of one of the header/footer
+        characteristics of simple-page-sequence. It returns a
+        sosofo that will display as <code><var>sosofo1</var></code>
+        if the page is a front (ie recto, odd-numbered) page and
+        as <code><var>sosofo2</var></code> if it is a back (ie
+        verso, even-numbered) page.</font></p>
+        <h3><font face="Arial">Numbering</font></h3>
+        <pre><font face="Arial">
+(all-element-number)
+(all-element-number <var>osnl</var>)
+</font></pre>
+        <p><font face="Arial">This is the same as <code>element-number</code>
+        except it counts elements with any generic identifier. If
+        <code><var>osnl</var></code> is not an element returns #f,
+        otherwise returns 1 plus the number of elements that
+        started before <code><var>osnl</var></code>. This
+        provides an efficient way of creating a unique identifier
+        for any element in a document.</font></p>
+        <h3><font face="Arial">External entity access</font></h3>
+        <pre><font face="Arial">
+(read-entity <var>string</var>)
+</font></pre>
+        <p><font face="Arial">This returns a string containing
+        the contents of the external entity with system
+        identifier <code><var>string</var></code>. This should be
+        used only for textual entities (CDATA and SDATA), and not
+        for binary entities (NDATA).</font></p>
+        <h3><font face="Arial">POSIX locale access</font></h3>
+        <pre><font face="Arial">
+(language <var>lang</var> <var>country</var>)
+</font></pre>
+        <p><font face="Arial">This procedure returns an
+        object of type <code>language</code>, if the system
+        supports the specified language. <code><var>lang</var></code>
+        is a string or symbol giving the two letter language code.
+        <code><var>country</var></code> is a string or symbol
+        giving the two letter country code.</font></p>
+        <p><font face="Arial">This procedure uses POSIX
+        locales. It is an OpenJade addition.</font></p>
+        <h3><font face="Arial">Extended standard procedures</font></h3>
+        <pre><font face="Arial">
+(sgml-parse <var>sysid</var> #!key <var>active:</var> <var>parent:</var> <var>architecture:</var>)
+</font></pre>
+        <p><font face="Arial">This allows you to specify an SGML
+        architecture with respect to which the document should be
+        parsed. It is an OpenJade addition.</font></p>
+        <pre><font face="Arial">
+
+(expt <var>q</var> <var>k</var>)
+</font></pre>
+        <p><font face="Arial">This allows you to raise a quantity
+        to an integral power. It is an OpenJade addition.</font></p>
+        <p><a href="#top"><font
+        face="Arial"><img src="images/top-of-page.gif"
+        alt="Up" border="0" width="11" height="15"></font></a><a
+        href="#top"><font
+        size="2" face="Arial">Back to top</font></a><font
+        size="2" face="Arial">&nbsp;</font></p>
+        <h2><a name="limitations"><font face="Arial">Current
+        OpenJade Limitations</font></a></h2>
+        <p><font face="Arial">This section describes the
+        limitations of the front-end (the general-purpose DSSSL
+        engine); each backend also has its own limitations. </font></p>
+        <p><font face="Arial">OpenJade doesn't allow internal definions
+        at the beginning of bodies and the <code>(test
+        =&gt; recipient)</code> variant of cond clauses.</font></p>
+        <p><font face="Arial">OpenJade supports only a single,
+        fixed grove plan which comprises the following modules:</font></p>
+        <ul>
+            <li><font face="Arial">baseabs</font></li>
+            <li><font face="Arial">prlgabs0</font></li>
+            <li><font face="Arial">prlgabs1</font></li>
+            <li><font face="Arial">instabs</font></li>
+            <li><font face="Arial">basesds0</font></li>
+            <li><font face="Arial">instsds0</font></li>
+            <li><font face="Arial">subdcabs</font></li>
+        </ul>
+        <p><font face="Arial">It doesn't implement the following
+        parts of SDQL: HyTime support, auxiliary parsing, node
+        regular expressions.</font></p>
+        <p><font face="Arial">Query rules, sosofo synchronisation,
+        indirect sosofos, reference values, decoration areas and
+        font properties are not supported.</font></p>
+        <p><font face="Arial">Note that only inherited
+        characteristics that are applicable to some supported
+        flow object can be specified.</font></p>
+        <h3><font face="Arial">Character/glyph handling</font></h3>
+        <p><font face="Arial">It only supports a single pre-defined
+        character repertoire. A character name of the form <code>U-</code><code><var>XXXX</var></code>
+        where <code><var>XXXX</var></code> are four upper-case
+        hexadecimal digits, is recognized as referring to the
+        Unicode character with that code. For many characters, it
+        is also possible to use the ISO/IEC 10646 name in lower-case
+        with words separated by hyphens.</font></p>
+        <p><font face="Arial">Some common SDATA entity names from
+        the ISO entity sets are recognized and mapped to
+        characters. In addition an SDATA entity name of the form <code>U-</code><code><var>XXXX</var></code>,
+        where <code><var>XXXX</var></code> are four upper-case
+        hexadecimal digits, is mapped to the Unicode character
+        with that code.</font></p>
+        <p><font face="Arial">OpenJade now supports the standard-chars,
+        map-sdata-entity, add-name-chars, add-separator-chars and
+        char-repertoire declaration element forms, allowing a
+        style-sheet to define additional character names, sdata
+        entity mappings, name characters (i.e. characters allowed
+        in identifiers) and separator characters. Currently the
+        only recognized character repertoire is the built-in
+        repertoire. It has the public identifier 
+        <code>&quot;UNREGISTERED::OpenJade//Character Repertoire::OpenJade&quot;</code>.</font></p>
+        <h3><font face="Arial">Validation</font></h3>
+        <p><font face="Arial">Several things that it would be
+        desirable to have checked aren't checked: </font></p>
+        <ul>
+            <li><font face="Arial">When the allowed value of an
+                inherited characteristic is a symbol, OpenJade
+                checks only that the value is a symbol that is
+                allowed as the value of some characteristic; #t
+                and #f are treated as a special kind of symbol in
+                this case.</font></li>
+            <li><font face="Arial">OpenJade doesn't check whether
+                a flow object is occurring in a context where it
+                is allowed.</font></li>
+            <li><font face="Arial">OpenJade does not prevent flow
+                objects being attached to the principal port of a
+                flow object when the flow object shouldn't have a
+                principal port.</font></li>
+            <li><font face="Arial">Most type-checking is done at
+                run-time not compile-time.</font></li>
+            <li><font face="Arial">OpenJade does not check for
+                non-inherited characteristics that are required
+                to be specified.</font></li>
+            <li><font face="Arial">It doesn't check that optional
+                features that have been used were declared in the
+                features form.</font></li>
+        </ul>
+        <h3><font face="Arial">Other limitations</font></h3>
+        <p><font face="Arial">The following primitives are just
+        stubs:</font></p>
+        <dl>
+            <dt><font face="Arial"><code>char-script-case</code></font></dt>
+            <dd><font face="Arial">Always returns last argument.</font></dd>
+            <dt><font face="Arial"><code>address-visited?</code></font></dt>
+            <dd><font face="Arial">Always returns #f.</font></dd>
+        </dl>
+        <p><a href="#top"><font face="Arial"><img src="images/top-of-page.gif"
+        alt="Up" border="0" width="11" height="15"></font></a><a 
+        href="#top"><font size="2" face="Arial">Back to top</font></a></p>
+        <h2><a name="source"><font face="Arial">About OpenJade
+        sources</font></a></h2>
+        <p><font face="Arial">The source of OpenJade is available
+        via CVS from </font><a href="http://jade-cvs.avionitek.com"><font face="Arial">jade-cvs.avionitek.com</font></a><font face="Arial">. See the
+        </font><a href="http://www.netfolder.com/DSSSL/"><font
+        face="Arial">OpenJade home page</font></a><font
+        face="Arial"> for more details.</font></p>
+        <p><a href="#top"><font face="Arial"><img src="images/top-of-page.gif"
+        alt="Up" border="0" width="11" height="15"></font></a><a 
+        href="#top"><font size="2" face="Arial">Back to top</font></a></p>
+        <hr size="1" noshade>
+        <p><font size="1" face="Arial">All trademarks herein are
+        the property of their respective owners.&nbsp; <br>
+        Copyright Â©&nbsp; 1999 OpenJade project, All rights
+        reserved. Created by Didier PH Martin, modified: September
+        9, 1999</font></p>
+        </td>
+    </tr>
+    <tr>
+        <td valign="top" width="141">&nbsp;</td>
+        <td valign="top">&nbsp;</td>
+    </tr>
+</TBODY></table>
+
+<p><font face="Arial">&nbsp; </font></p>
+</body>
+</html>
diff --git a/jadedoc/mif.htm b/jadedoc/mif.htm
new file mode 100644 (file)
index 0000000..b57bb4b
--- /dev/null
@@ -0,0 +1,1068 @@
+<html>
+
+<head>
+<meta http-equiv="Content-Type"
+content="text/html; charset=iso-8859-1">
+<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
+<title>The OpenJade MIF backend</title>
+</head>
+
+<body background="images/background.gif">
+
+<p align="left"><font face="Geneva, Arial"><img
+src="images/dsssltitle.gif" alt="OpenJade" vspace="10"
+width="750" height="60"> </font></p>
+
+<p align="left">&nbsp; </p>
+<div align="left">
+
+<table border="0">
+    <tr>
+        <td><img src="images/space.gif" alt="" width="145" height="10"></td>
+        <td><h1><font face="Geneva, Arial">The OpenJade MIF backend</font></h1>
+        <h3><font face="Geneva, Arial">Created by Kathleen
+        Marszalek and Paul Prescod<br>
+        Sponsored by ISOGEN International Corp</font></h3>
+
+        <h2><font face="Geneva, Arial">Contents</font></h2>
+        <ul>
+            <li><font face="Geneva, Arial">Supported Flow Objects</font>
+                <ul>
+                    <li><a href="#character"><font
+                        face="Geneva, Arial">character</font></a></li>
+                    <li><a href="#display-group"><font
+                        face="Geneva, Arial">display-group</font></a></li>
+                    <li><a href="#rule"><font
+                        face="Geneva, Arial">rule</font></a></li>
+                    <li><a href="#score"><font
+                        face="Geneva, Arial">score</font></a></li>
+                    <li><a href="#line-field"><font
+                        face="Geneva, Arial">line-field</font></a></li>
+                    <li><a href="#leader"><font
+                        face="Geneva, Arial">leader</font></a></li>
+                    <li><a href="#link"><font
+                        face="Geneva, Arial">link</font></a></li>
+                    <li><a href="#index-entry"><font
+                        face="Geneva, Arial">index-entry</font></a></li>
+                    <li><font face="Geneva, Arial">sequence</font></li>
+                    <li><a href="#external-graphic"><font
+                        face="Geneva, Arial">external-graphic</font></a></li>
+                    <li><a href="#paragraph"><font
+                        face="Geneva, Arial">paragraph</font></a></li>
+                    <li><a href="#paragraph-break"><font
+                        face="Geneva, Arial">paragraph-break</font></a></li>
+                    <li><a href="#simple-page-sequence"><font
+                        face="Geneva, Arial">simple-page-sequence</font></a></li>
+                    <li><a href="#table"><font
+                        face="Geneva, Arial">table</font></a></li>
+                    <li><a href="#table-part"><font
+                        face="Geneva, Arial">table-part</font></a></li>
+                    <li><a href="#table-column"><font
+                        face="Geneva, Arial">table-column</font></a></li>
+                    <li><font face="Geneva, Arial">table-row</font></li>
+                    <li><a href="#table-cell"><font
+                        face="Geneva, Arial">table-cell</font></a></li>
+                    <li><a href="#table-border"><font
+                        face="Geneva, Arial">table-border</font></a></li>
+                </ul>
+            </li>
+            <li><a href="#problems_and_limitations"><font
+                face="Geneva, Arial">Problems &amp; Limitations</font></a>
+                <ul>
+                    <li><a href="#table_border_resolution"><font
+                        face="Geneva, Arial">Table border
+                        resolution</font></a></li>
+                    <li><a href="#external_graphic_width"><font
+                        face="Geneva, Arial">External graphic
+                        width and height</font></a></li>
+                    <li><a href="#space_before_non-paragraph"><font
+                        face="Geneva, Arial">Space before non-paragraph
+                        displayed objects</font></a></li>
+                    <li><a href="#the_vertical_positioning"><font
+                        face="Geneva, Arial">The vertical
+                        positioning of the displayed rule flow
+                        object</font></a></li>
+                    <li><a href="#the_box_flow_object"><font
+                        face="Geneva, Arial">The box flow object</font></a></li>
+                </ul>
+            </li>
+            <li><a href="#tips"><font face="Geneva, Arial">Tips</font></a>
+                <ul>
+                    <li><a href="#using_hypertext"><font
+                        face="Geneva, Arial">Creating hypertext
+                        documents</font></a> </li>
+                    <li><a href="#updating_page_numbering"><font
+                        face="Geneva, Arial">Updating page
+                        numbering</font></a> </li>
+                    <li><a href="#using_colors"><font
+                        face="Geneva, Arial">Specifying colors</font></a>
+                    </li>
+                </ul>
+            </li>
+        </ul>
+        <h2><font face="Geneva, Arial">Supported Flow Objects</font></h2>
+
+       <!..........................................................
+                the character flow object
+       ...........................................................>
+        <table border="1" cellpadding="5" cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080" size="+1">
+                  <p align="center"><a name="character">
+                     <font color="#FFFFFF">character</font></a>
+                  </p>
+                </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top"><ul>
+                    <li>font-weight </li>
+                    <li>font-posture </li>
+                    <li>font-name </li>
+                    <li>font-size </li>
+                    <li>input-whitespace-treatment </li>
+                    <li>position-point-shift </li>
+                    <li>language </li>
+                    <li>country </li>
+                    <li>color </li>
+                </ul>
+                </td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the display-group flow object
+       ...........................................................>
+        <div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a
+                name="display-group"><font color="#FFFFFF">display-group</font>
+                </a></th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top">&nbsp;</td>
+                <td valign="top"><ul>
+                    <li>space-before </li>
+                    <li>space-after </li>
+                    <li>keep-with-previous? </li>
+                    <li>keep-with-next? </li>
+                    <li>break-before (#f, page) </li>
+                    <li>break-after (#f, page) </li>
+                    <li>keep (#f, page) </li>
+                    <li>may-violate-keep-before? </li>
+                    <li>may-violate-keep-after? </li>
+                </ul>
+                </td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the rule flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a name="rule"><font
+                color="#FFFFFF">rule</font></a> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top"><ul>
+                    <li>line-cap </li>
+                    <li>line-thickness </li>
+                    <li>line-repeat </li>
+                    <li>line-sep </li>
+                    <li>position-point-shift </li>
+                    <li>display-alignment (start, end, center) </li>
+                    <li>start-indent </li>
+                    <li>end-indent </li>
+                    <li>span (spans all columns if &gt; 1) </li>
+                    <li>color </li>
+                </ul>
+                </td>
+                <td valign="top"><ul>
+                    <li>orientation (horizontal, escapement) </li>
+                    <li>length </li>
+                    <li>space-before </li>
+                    <li>space-after </li>
+                    <li>keep-with-previous? </li>
+                    <li>keep-with-next? </li>
+                    <li>break-before (#f, page) </li>
+                    <li>break-after (#f, page) </li>
+                    <li>keep (#f, page) </li>
+                    <li>may-violate-keep-before? </li>
+                    <li>may-violate-keep-after? </li>
+                </ul>
+                </td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the score flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a name="score"><font
+                color="#FFFFFF">score</font></a> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top"><ul>
+                    <li>line-repeat (1 for type of before and
+                        through, 1 or 2 for after)</li>
+                </ul>
+                </td>
+                <td valign="top"><ul>
+                    <li>type (before, through, after)</li>
+                </ul>
+                </td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the line-field flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a
+                name="line-field"><font color="#FFFFFF">line-field</font></a><font
+                color="#FFFFFF"><sup>*</sup></font> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top"><ul>
+                    <li>field-width </li>
+                    <li>field-align </li>
+                </ul>
+                </td>
+                <td valign="top">&nbsp;</td>
+            </tr>
+            <tr>
+                <td colspan="2"><font size="2"><sup>*</sup></font>
+                At the beginning of paragraph only. </td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the leader flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a name="leader"><font
+                color="#FFFFFF">leader</font><font
+                color="#FFFFFF" size="2"><sup>*</sup></font> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top">&nbsp;</td>
+                <td valign="top">&nbsp;</td>
+            </tr>
+            <tr>
+                <td colspan="2"><font size="2"><sup>*</sup></font>
+                <p>On the last line of paragraph only. The principal
+                port (the leader string itself) can contain
+                characters only. </p>
+                   <p>The content of the flow object is ignored: 
+                   a dotted leader will always be used. The specified length is ignored: 
+                 it always fills out the line. </p> </td
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the link flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a name="link"><font
+                color="#FFFFFF">link</font> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top">&nbsp;</td>
+                <td valign="top"><ul>
+                    <li>destination [#f, objects returned by (idref-address
+                        ...) and (current-node-address ...)] </li>
+                </ul>
+                </td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the link flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a name="index-entry"><font
+                color="#FFFFFF">index-entry</font> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top">&nbsp;</td>
+                <td valign="top"><ul>
+                    <li>components </li>
+                    <li>page-number? </li>
+                    <li>sort-string </li>
+                    <li>starts-page-range? </li>
+                    <li>ends-page-range? </li>
+                </ul>
+                </td>
+            </tr>
+            <tr>
+                <td valign="top" colspan="2"><dl>
+                    <dt><b>components</b> </dt>
+                    <dd>is a list of strings that represent index
+                        entry levels. This characteristic is not
+                        inherited and shall be specified. </dd>
+                    <dt><b>page-number?</b> </dt>
+                    <dd>is a boolean specifying whether this
+                        index entry should contain page number
+                        information. This characteristic is not
+                        inherited. The default is #t. </dd>
+                    <dt><b>sort-string</b> </dt>
+                    <dd>is either #f, specifying that this index
+                        entry's components should be used for
+                        sorting the index, or a string that
+                        should be used for sorting. This
+                        characteristic is not inherited. The
+                        default is #f. </dd>
+                    <dt><b>starts-page-range?</b> </dt>
+                    <dd>is a boolean specifying whether the index
+                        entry starts a page range. This
+                        characteristic is not inherited. The
+                        default is #f. </dd>
+                    <dt><b>ends-page-range?</b> </dt>
+                    <dd>is a boolean specifying whether the index
+                        entry starts a page range. This
+                        characteristic is not inherited. The
+                        default is #f. </dd>
+                </dl>
+                </td>
+            </tr>
+            <tr>
+                <td valign="top" colspan="2"><b>Here's how to
+                enable the above extension:</b><br>
+                (declare-flow-object-class index-entry<br>
+                &nbsp;&nbsp;&nbsp; &quot;UNREGISTERED::ISOGEN//Flow
+                Object Class::index-entry&quot;)<br>
+                &nbsp; </td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the external-graphic flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a name="external-graphic"><font
+                color="#FFFFFF">external-graphic</font> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top"><ul>
+                    <li>space-before </li>
+                    <li>space-after </li>
+                </ul>
+                </td>
+                <td valign="top"><ul>
+                    <li>display? </li>
+                    <li>scale (max) </li>
+                    <li>max-width </li>
+                    <li>max-height </li>
+                    <li>entity-system-id </li>
+                    <li>display-alignment </li>
+                    <li>start-indent </li>
+                    <li>end-indent </li>
+                    <li>span (spans all columns if &gt; 1) </li>
+                    <li>space-before </li>
+                    <li>space-after </li>
+                    <li>keep-with-previous? </li>
+                    <li>keep-with-next? </li>
+                    <li>break-before (#f, page) </li>
+                    <li>break-after (#f, page) </li>
+                    <li>keep (#f, page) </li>
+                    <li>may-violate-keep-before? </li>
+                    <li>may-violate-keep-after? </li>
+                </ul>
+                </td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the paragraph flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a name="paragraph"><font
+                color="#FFFFFF">paragraph</font> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top"><ul>
+                    <li>lines (wrap, asis-wrap) </li>
+                    <li>hyphenation-ladder-count </li>
+                    <li>hyphenation-remain-char-count </li>
+                    <li>hyphenation-push-char-count </li>
+                    <li>font-weight </li>
+                    <li>font-posture </li>
+                    <li>font-name </li>
+                    <li>font-size </li>
+                    <li>quadding </li>
+                    <li>widow-count </li>
+                    <li>orphan-count </li>
+                    <li>language </li>
+                    <li>country </li>
+                </ul>
+                </td>
+                <td valign="top"><ul>
+                    <li>span (spans all columns if &gt; 1) </li>
+                    <li>space-before </li>
+                    <li>space-after </li>
+                    <li>keep-with-previous? </li>
+                    <li>keep-with-next? </li>
+                    <li>break-before (#f, page) </li>
+                    <li>break-after (#f, page) </li>
+                    <li>keep (#f, page) </li>
+                    <li>may-violate-keep-before? </li>
+                    <li>may-violate-keep-after? </li>
+                    <li>line-spacing </li>
+                    <li>min-leading (#f or 0 for proportional
+                        line spacing) </li>
+                    <li>first-line-start-indent </li>
+                </ul>
+                </td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the paragraph-break flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a name="paragraph-break"><font
+                color="#FFFFFF">paragraph-break</font> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top">Same as for paragraph </td>
+                <td valign="top">Same as for paragraph </td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the simple-page-sequence flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a name="simple-page-sequence"><font
+                color="#FFFFFF">simple-page-sequence</font> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top"><ul>
+                    <li>page-width </li>
+                    <li>page-height </li>
+                    <li>left-margin </li>
+                    <li>right-margin </li>
+                    <li>top-margin </li>
+                    <li>bottom-margin </li>
+                    <li>header-margin </li>
+                    <li>footer-margin </li>
+                </ul>
+                </td>
+                <td valign="top"><ul>
+                    <li>left-header </li>
+                    <li>center-header </li>
+                    <li>right-header </li>
+                    <li>left-footer </li>
+                    <li>center-footer </li>
+                    <li>right-footer </li>
+                </ul>
+                </td>
+            </tr>
+            <tr>
+                <td valign="top" colspan="2"><dl>
+                    <dt><b>(page-number-sosofo)</b> </dt>
+                    <dt><b>(current-node-page-number-sosofo)</b> </dt>
+                    <dt><b>&quot;UNREGISTERED::James Clark//Procedure::if-first-page&quot;</b>
+                    </dt>
+                    <dd>This can be used only in the
+                        specification of the value of one of the
+                        header/footer characteristics of simple-page-sequence.
+                        It returns a sosofo that will display as
+                        sosofo1 if the page is the first page of
+                        the simple-page-sequence and as sosofo2
+                        otherwise. </dd>
+                    <dt><b>&quot;UNREGISTERED::James Clark//Procedure::if-front-page&quot;</b>
+                    </dt>
+                    <dd>This can be used only in the
+                        specification of the value of one of the
+                        header/footer characteristics of simple-page-sequence.
+                        It returns a sosofo that will display as
+                        sosofo1 if the page is a front (ie recto,
+                        odd-numbered) page and as sosofo2 if it
+                        is a back (i.e. verso, even-numbered)
+                        page. </dd>
+                    <dt><b>&quot;UNREGISTERED::James Clark//Characteristic::page-n-columns&quot;</b>
+                    </dt>
+                    <dd>Value is a strictly positive integer,
+                        specifying the number of columns. The
+                        initial value is 1. </dd>
+                    <dt><b>&quot;UNREGISTERED::James Clark//Characteristic::page-column-sep&quot;</b>
+                    </dt>
+                    <dd>Value is a length, specifying the
+                        separation between columns. The initial
+                        value is .5in. </dd>
+                    <dt><b>&quot;UNREGISTERED::James Clark//Characteristic::page-balance-columns?&quot;</b>
+                    </dt>
+                    <dd>Value is a boolean. If true, the columns
+                        on the final page of the page-sequence
+                        should be balanced. The initial value is
+                        #f. </dd>
+                </dl>
+                </td>
+            </tr>
+            <tr>
+                <td valign="top" colspan="2"><b>Here's how to
+                enable the above extensions:</b><br>
+                (define if-first-page (external-procedure<br>
+                &nbsp;&nbsp;&nbsp; &quot;UNREGISTERED::James
+                Clark//Procedure::if-first-page&quot;))<br>
+                (define if-front-page (external-procedure&nbsp;&nbsp;
+                <br>
+                &nbsp;&nbsp;&nbsp; &quot;UNREGISTERED::James
+                Clark//Procedure::if-front-page&quot;))<br>
+                (declare-characteristic page-n-columns<br>
+                &nbsp;&nbsp;&nbsp; &quot;UNREGISTERED::James
+                Clark//Characteristic::page-n-columns&quot; 1)<br>
+                (declare-characteristic page-n-columns<br>
+                &nbsp;&nbsp;&nbsp; &quot;UNREGISTERED::James
+                Clark//Characteristic::page-column-gap&quot; (*
+                36 1pt))<br>
+                (declare-characteristic page-balance-columns?<br>
+                &nbsp;&nbsp;&nbsp; &quot;UNREGISTERED::James
+                Clark//Characteristic::page-balance-columns?&quot;
+                #f)<br>
+                &nbsp; </td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the table flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a name="table"><font
+                color="#FFFFFF">table</font> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top"><ul>
+                    <li>table-border </li>
+                    <li>display-alignment </li>
+                    <li>start-indent </li>
+                    <li>end-indent </li>
+                </ul>
+                </td>
+                <td valign="top"><ul>
+                    <li>table-width </li>
+                    <li>before-row-border </li>
+                    <li>after-row-border </li>
+                    <li>before-column-border </li>
+                    <li>after-column-border </li>
+                    <li>span (spans all columns if &gt; 1) </li>
+                    <li>space-before </li>
+                    <li>space-after </li>
+                    <li>keep-with-previous? </li>
+                    <li>keep-with-next? </li>
+                    <li>break-before (#f, page) </li>
+                    <li>break-after (#f, page) </li>
+                    <li>keep (#f, page) </li>
+                    <li>may-violate-keep-before? </li>
+                    <li>may-violate-keep-after? </li>
+                </ul>
+                </td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the table-part flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a name="table-part"><font
+                color="#FFFFFF">table-part</font> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top">&nbsp;</td>
+                <td valign="top"><ul>
+                    <li>space-before </li>
+                    <li>space-after </li>
+                    <li>keep-with-previous? </li>
+                    <li>keep-with-next? </li>
+                    <li>break-before (#f, page) </li>
+                    <li>break-after (#f, page) </li>
+                    <li>keep (#f, page) </li>
+                    <li>may-violate-keep-before? </li>
+                    <li>may-violate-keep-after? </li>
+                </ul>
+                </td>
+            </tr>
+            <tr>
+                <td valign="top" colspan="2"><ul>
+                    <li>header </li>
+                    <li>footer </li>
+                </ul>
+                </td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the table-column flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a name="table-column"><font
+                color="#FFFFFF">table-column</font> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top"><ul>
+                    <li>start-indent </li>
+                    <li>end-indent </li>
+                </ul>
+                </td>
+                <td valign="top"><ul>
+                    <li>column-number </li>
+                    <li>n-columns-spanned </li>
+                    <li>width </li>
+                </ul>
+                </td>
+            </tr>
+            <tr>
+                <td valign="top" colspan="2"><ul>
+                    <li>(table-unit <i>k</i>) </li>
+                </ul>
+                </td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the table-cell flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a name="table-cell"><font
+                color="#FFFFFF">table-cell</font> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top"><ul>
+                    <li>cell-before-row-margin </li>
+                    <li>cell-after-row-margin </li>
+                    <li>cell-before-column-margin </li>
+                    <li>cell-after-column-margin </li>
+                    <li>cell-row-alignment </li>
+                    <li>cell-before-row-border </li>
+                    <li>cell-after-row-border </li>
+                    <li>cell-before-column-border </li>
+                    <li>cell-after-column-border </li>
+                    <li>cell-background? </li>
+                    <li>background-color </li>
+                </ul>
+                </td>
+                <td valign="top"><ul>
+                    <li>column-number </li>
+                    <li>n-columns-spanned </li>
+                    <li>n-rows-spanned </li>
+                    <li>starts-row? </li>
+                    <li>ends-row? </li>
+                </ul>
+                </td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the table-border flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a name="table-border"><font
+                color="#FFFFFF">table-border</font> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top"><ul>
+                    <li>border-present? </li>
+                    <li>line-thickness </li>
+                    <li>line-repeat (0, 1, or 2) </li>
+                    <li>line-sep </li>
+                    <li>color </li>
+                </ul>
+                </td>
+                <td valign="top">&nbsp;</td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+        </div><h2>Problems &amp; Limitations</h2>
+        <p><a name="table_border_resolution"></a> </p>
+        <h3><b>Table border resolution</b></h3>
+        <p>It's not clear how to predictably enforce cell borders
+        that have mixed line styles. I've posted a question about
+        this to comp.text.frame, but there were no responses so
+        far.</p>
+        <p><a name="external_graphic_width"></a> </p>
+        <h3><b>External graphic width and height</b></h3>
+        <p>In order to place external graphics inside a text flow
+        one must use an anchored frame containing the &lt;ImportObject...&gt;
+        statement. The ImportObject within the frame can shrink-wrap
+        the referenced graphics, however the anchored frame
+        itself cannot - in general the size of an anchored frame
+        has to be specified explicitly. I've asked about this in
+        comp.text.frame, but the only solutions involved using
+        external programs to read the graphic size from graphic
+        files.</p>
+        <p><a name="space_before_non-paragraph"></a> </p>
+        <h3><b>Space before non-paragraph displayed objects</b></h3>
+        <p>Flow objects like external-graphic need to be anchored
+        to empty paragraphs so that that frame can determine
+        their position on the page automatically. Since the
+        smallest paragraph height is 2pt (smallest font size that
+        can be used), the total space before such objects should
+        be larger than that. This does not apply to the paragraph
+        flow objects themselves, and to the rule flow object. The
+        rule flow object has the placement direction display size
+        of 0 and it's possible to use negative PgfLeading to let
+        the next paragraph move up if necessary.</p>
+        <p><a name="the_vertical_positioning"></a> </p>
+        <h3><b>The vertical positioning of the displayed rule
+        flow object</b></h3>
+        <p>Since the rule is position using inlined anchored
+        frame, the placement is relative to the font baseline. It's
+        assumed that the baseline is 1/3 the font size from the
+        bottom.</p>
+        <p><a name="the_box_flow_object"></a> </p>
+        <h3><b>The box flow object</b></h3>
+        <p>Not sure how to implement it since anchored frames
+        must have fixed height. Maybe using tables would work
+        here(?)</p>
+        <p><a name="tips"></a> </p>
+        <h2>Tips</h2>
+        <p><a name="using_hypertext"></a> </p>
+        <h3>Creating hypertext documents</h3>
+        <p>You must decide on the filename extension you'll use
+        at the stage when you run jade. If you don't want the .mif
+        extension for your final document, feel free to use other
+        extension when specifying the file name using the <b>-o</b>
+        option.</p>
+        <ol>
+            <li>Open the book file. </li>
+            <li>While holding <i>SHIFT</i>, select <b>File-&gt;Open
+                All Files in Book</b> from the menu. </li>
+            <li>Save each file using <b>View Only</b> format -
+                make sure you use original filenames. </li>
+        </ol>
+        <p><a name="updating_page_numbering"></a> </p>
+        <h3>Updating page numbering</h3>
+        <ol>
+            <li>Open the book file. </li>
+            <li>While holding <i>SHIFT</i>, select <b>File-&gt;Open
+                All Files in Book</b> from the menu. </li>
+            <li>Select <b>File-&gt;Generate/Update...</b> and
+                then press <b>Update</b>. </li>
+        </ol>
+        <p><a name="using_colors"></a> </p>
+        <h3>Specifying colors</h3>
+        <p>OpenJade supports all color spaces specified in DSSSL. 
+        The following example uses the RGB color space to create
+        a red rule:</p>
+        <div align="center"><center><table border="0"
+        cellpadding="10" bgcolor="#CCCCCC">
+            <tr>
+                <td>(make rule<br>
+                &nbsp;&nbsp;&nbsp; color: (color (color-space
+                &quot;ISO/IEC 10179:1996//Color-Space Family::Device
+                RGB&quot;)<br>
+                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                1 0 0)<br>
+                &nbsp;&nbsp;&nbsp; ...<br>
+                )</td>
+            </tr>
+        </table>
+        </center></div></td>
+    </tr>
+</table>
+</div>
+</body>
+</html>
diff --git a/jadedoc/rtf.htm b/jadedoc/rtf.htm
new file mode 100644 (file)
index 0000000..b411ab6
--- /dev/null
@@ -0,0 +1,1102 @@
+<html>
+
+<head>
+<meta http-equiv="Content-Type"
+content="text/html; charset=iso-8859-1">
+<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
+<title>The OpenJade RTF backend</title>
+</head>
+
+<body background="images/background.gif">
+
+<p align="left"><font face="Geneva, Arial"><img
+src="images/dsssltitle.gif" alt="OpenJade" vspace="10"
+width="750" height="60"> </font></p>
+
+<p align="left">&nbsp; </p>
+<div align="left"> <table border="0" width="780">
+    <tr>
+        <td><img src="images/space.gif" alt="" width="145" height="10"></td>
+        <td><h1><font face="Arial">The OpenJade RTF backend</font></h1>
+        <h3><font face="Arial">Created by James Clark</font></h3>
+       
+       <!.......................................................
+               table of content
+       .........................................................>
+       <h2><font face="Geneva, Arial">Contents</font></h2>
+        <ul>
+            <li><font face="Geneva, Arial">Supported Flow Objects</font>
+                <ul>
+                    <li><a href="#character"><font
+                        face="Geneva, Arial">character</font></a></li>
+                    <li><a href="#display-group"><font
+                        face="Geneva, Arial">display-group</font></a></li>
+                    <li><a href="#rule"><font
+                        face="Geneva, Arial">rule</font></a></li>
+                    <li><a href="#score"><font
+                        face="Geneva, Arial">score</font></a></li>
+                    <li><a href="#line-field"><font
+                        face="Geneva, Arial">line-field</font></a></li>
+                    <li><a href="#leader"><font
+                        face="Geneva, Arial">leader</font></a></li>
+                    <li><a href="#link"><font
+                        face="Geneva, Arial">link</font></a></li>
+                         <li><a href="#box"><font
+                        face="Geneva, Arial">box</font></a></li>
+                    <li><font face="Geneva, Arial">sequence</font></li>
+                    <li><a href="#external-graphic"><font
+                        face="Geneva, Arial">external-graphic</font></a></li>
+                    <li><a href="#paragraph"><font
+                        face="Geneva, Arial">paragraph</font></a></li>
+                    <li><a href="#paragraph-break"><font
+                        face="Geneva, Arial">paragraph-break</font></a></li>
+                    <li><a href="#simple-page-sequence"><font
+                        face="Geneva, Arial">simple-page-sequence</font></a></li>
+                    <li><a href="#table"><font
+                        face="Geneva, Arial">table</font></a></li>
+                    <li><a href="#table-part"><font
+                        face="Geneva, Arial">table-part</font></a></li>
+                    <li><a href="#table-column"><font
+                        face="Geneva, Arial">table-column</font></a></li>
+                    <li><font face="Geneva, Arial">table-row</font></li>
+                    <li><a href="#table-cell"><font
+                        face="Geneva, Arial">table-cell</font></a></li>
+                    <li><a href="#table-border"><font
+                        face="Geneva, Arial">table-border</font></a></li>
+                         <li><a href="#table-border"><font
+                        face="Geneva, Arial">table-border</font></a></li>
+                         <li><a href="#table-border"><font
+                        face="Geneva, Arial">math objects to be included</font></a></li>
+
+
+                       
+                </ul>
+            </li>
+         </ul>
+
+      <h2><font face="Geneva, Arial">Supported Flow Objects</font></h2>
+
+
+       <!..........................................................
+                the character flow object
+       ...........................................................>
+        <table border="1" cellpadding="5" cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080" size="+1">
+                  <p align="center"><a name="character">
+                     <font color="#FFFFFF">character</font></a>
+                  </p>
+                </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top"><ul>
+                    <li>font-weight </li>
+                    <li>font-posture </li>
+                    <li>font-name </li>
+                    <li>font-size </li>
+                    <li>input-whitespace-treatment </li>
+                    <li>position-point-shift </li>
+                    <li>language </li>
+                    <li>country </li>
+                    <li>color </li>
+                </ul>
+                </td>
+                <td valign="top">&nbsp;</td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the display-group flow object
+       ...........................................................>
+        <div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a
+                name="display-group"><font color="#FFFFFF">display-group</font>
+                </a></th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top">&nbsp;</td>
+                <td valign="top"><ul>
+                    <li>space-before </li>
+                    <li>space-after </li>
+                    <li>keep-with-previous? </li>
+                    <li>keep-with-next? </li>
+                    <li>break-before (#f, page) </li>
+                    <li>break-after (#f, page) </li>
+                    <li>keep (#f, page) </li>
+                    <li>may-violate-keep-before? </li>
+                    <li>may-violate-keep-after? </li>
+                </ul>
+                </td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the rule flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a name="rule"><font
+                color="#FFFFFF">rule</font></a> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top"><ul>
+                    <li>line-cap </li>
+                    <li>line-thickness </li>
+                    <li>line-repeat </li>
+                    <li>line-sep </li>
+                    <li>position-point-shift </li>
+                    <li>display-alignment (start, end, center) </li>
+                    <li>start-indent </li>
+                    <li>end-indent </li>
+                    <li>span (spans all columns if &gt; 1) </li>
+                    <li>color </li>
+                </ul>
+                </td>
+                <td valign="top"><ul>
+                    <li>orientation (horizontal, escapement) </li>
+                    <li>length </li>
+                    <li>space-before </li>
+                    <li>space-after </li>
+                    <li>keep-with-previous? </li>
+                    <li>keep-with-next? </li>
+                    <li>break-before (#f, page) </li>
+                    <li>break-after (#f, page) </li>
+                    <li>keep (#f, page) </li>
+                    <li>may-violate-keep-before? </li>
+                    <li>may-violate-keep-after? </li>
+                </ul>
+                </td>
+            </tr>
+            <tr><td valign="top" colspan="2">
+                   <P>Only the horizontal orientation is supported. Rules only show up in Page Layout View</P>
+                </td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the score flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a name="score"><font
+                color="#FFFFFF">score</font></a> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top"><ul>
+                    <li>line-repeat (1 for type of before and
+                        through, 1 or 2 for after)</li>
+                </ul>
+                </td>
+                <td valign="top"><ul>
+                    <li>type (before, through, after)</li>
+                </ul>
+                </td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the line-field flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a
+                name="line-field"><font color="#FFFFFF">line-field</font></a><font
+                color="#FFFFFF"><sup>*</sup></font> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top"><ul>
+                    <li>field-width </li>
+                    <li>field-align </li>
+                </ul>
+                </td>
+                <td valign="top">&nbsp;</td>
+            </tr>
+            <tr>
+                <td colspan="2"><font size="2"><sup>*</sup></font>
+                At the beginning of paragraph only. </td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the leader flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a name="leader"><font
+                color="#FFFFFF">leader</font><font
+                color="#FFFFFF" size="2"><sup>*</sup></font> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top">&nbsp;</td>
+                <td valign="top">&nbsp;</td>
+            </tr>
+            <tr>
+                <td colspan="2"><font size="2"><sup>*</sup></font>
+                On the last line of paragraph only. The principal
+                port (the leader string itself) can contain
+                characters only. 
+                   <p>The content of the flow object is ignored: 
+                    a dotted leader will always be used. The specified length 
+                    is ignored: it always fills out the line.</p> </td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the link flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a name="link"><font
+                color="#FFFFFF">link</font> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top">&nbsp;</td>
+                <td valign="top"><ul>
+                    <li>destination [#f, objects returned by (idref-address
+                        ...) and (current-node-address ...)] </li>
+                </ul>
+                </td>
+            </tr>
+               <tr>
+                <td colspan="2"><font size="2"><sup>*</sup></font>
+                Only destinations that are
+                single elements in the same RTF output file. </td>
+            </tr>
+
+
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the link flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a name="index-entry"><font
+                color="#FFFFFF">index-entry</font> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top">&nbsp;</td>
+                <td valign="top"><ul>
+                    <li>components </li>
+                    <li>page-number? </li>
+                    <li>sort-string </li>
+                    <li>starts-page-range? </li>
+                    <li>ends-page-range? </li>
+                </ul>
+                </td>
+            </tr>
+            <tr>
+                <td valign="top" colspan="2"><dl>
+                    <dt><b>components</b> </dt>
+                    <dd>is a list of strings that represent index
+                        entry levels. This characteristic is not
+                        inherited and shall be specified. </dd>
+                    <dt><b>page-number?</b> </dt>
+                    <dd>is a boolean specifying whether this
+                        index entry should contain page number
+                        information. This characteristic is not
+                        inherited. The default is #t. </dd>
+                    <dt><b>sort-string</b> </dt>
+                    <dd>is either #f, specifying that this index
+                        entry's components should be used for
+                        sorting the index, or a string that
+                        should be used for sorting. This
+                        characteristic is not inherited. The
+                        default is #f. </dd>
+                    <dt><b>starts-page-range?</b> </dt>
+                    <dd>is a boolean specifying whether the index
+                        entry starts a page range. This
+                        characteristic is not inherited. The
+                        default is #f. </dd>
+                    <dt><b>ends-page-range?</b> </dt>
+                    <dd>is a boolean specifying whether the index
+                        entry starts a page range. This
+                        characteristic is not inherited. The
+                        default is #f. </dd>
+                </dl>
+                </td>
+            </tr>
+            <tr>
+                <td valign="top" colspan="2">Only destinations that are
+                single elements in the same RTF output file.</td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the external-graphic flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a name="external-graphic"><font
+                color="#FFFFFF">external-graphic</font> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top"><ul>
+                    <li>space-before </li>
+                    <li>space-after </li>
+                </ul>
+                </td>
+                <td valign="top"><ul>
+                    <li>display? </li>
+                    <li>scale (max) </li>
+                    <li>max-width </li>
+                    <li>max-height </li>
+                    <li>entity-system-id </li>
+                    <li>display-alignment </li>
+                    <li>start-indent </li>
+                    <li>end-indent </li>
+                    <li>span (spans all columns if &gt; 1) </li>
+                    <li>space-before </li>
+                    <li>space-after </li>
+                    <li>keep-with-previous? </li>
+                    <li>keep-with-next? </li>
+                    <li>break-before (#f, page) </li>
+                    <li>break-after (#f, page) </li>
+                    <li>keep (#f, page) </li>
+                    <li>may-violate-keep-before? </li>
+                    <li>may-violate-keep-after? </li>
+                </ul>
+                </td>
+               </tr>
+               <tr>
+                <td valign="top" colspan="2"><p>On Windows platforms, this can
+                be used to embed OLE objects, by making the the
+                value of the <code>notation-system-id:</code> a
+                formal system identifier whose storage manager is
+                <code>CLSID</code> and whose storage object
+                identifier is the COM CLSID (including
+                surrounding braces). The system identifier may
+                also be just <code>&lt;CLSID&gt;</code> (that is,
+                the storage object identifier may be empty); in
+                this case, the OLE default CLSID for the file (usually
+                chosen based on the file's extension) will be
+                used.</p>
+                &nbsp; </td>
+            </tr>
+
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the paragraph flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a name="paragraph"><font
+                color="#FFFFFF">paragraph</font> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top"><ul>
+                    <li>lines (wrap, asis-wrap) </li>
+                    <li>hyphenation-ladder-count </li>
+                    <li>hyphenation-remain-char-count </li>
+                    <li>hyphenation-push-char-count </li>
+                    <li>font-weight </li>
+                    <li>font-posture </li>
+                    <li>font-name </li>
+                    <li>font-size </li>
+                    <li>quadding </li>
+                    <li>widow-count </li>
+                    <li>orphan-count </li>
+                    <li>language </li>
+                    <li>country </li>
+                </ul>
+                </td>
+                <td valign="top"><ul>
+                    <li>span (spans all columns if &gt; 1) </li>
+                    <li>space-before </li>
+                    <li>space-after </li>
+                    <li>keep-with-previous? </li>
+                    <li>keep-with-next? </li>
+                    <li>break-before (#f, page) </li>
+                    <li>break-after (#f, page) </li>
+                    <li>keep (#f, page) </li>
+                    <li>may-violate-keep-before? </li>
+                    <li>may-violate-keep-after? </li>
+                    <li>line-spacing </li>
+                    <li>min-leading (#f or 0 for proportional
+                        line spacing) </li>
+                    <li>first-line-start-indent </li>
+                </ul>
+                </td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the paragraph-break flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a name="paragraph-break"><font
+                color="#FFFFFF">paragraph-break</font> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top">Same as for paragraph </td>
+                <td valign="top">Same as for paragraph </td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the simple-page-sequence flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a name="simple-page-sequence"><font
+                color="#FFFFFF">simple-page-sequence</font> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top"><ul>
+                    <li>page-width </li>
+                    <li>page-height </li>
+                    <li>left-margin </li>
+                    <li>right-margin </li>
+                    <li>top-margin </li>
+                    <li>bottom-margin </li>
+                    <li>header-margin </li>
+                    <li>footer-margin </li>
+                </ul>
+                </td>
+                <td valign="top"><ul>
+                    <li>left-header </li>
+                    <li>center-header </li>
+                    <li>right-header </li>
+                    <li>left-footer </li>
+                    <li>center-footer </li>
+                    <li>right-footer </li>
+                </ul>
+                </td>
+            </tr>
+            <tr>
+                <td valign="top" colspan="2"><dl>
+                    <dt><b>(page-number-sosofo)</b> </dt>
+                    <dt><b>(current-node-page-number-sosofo)</b> </dt>
+                    <dt><b>&quot;UNREGISTERED::James Clark//Procedure::if-first-page&quot;</b>
+                    </dt>
+                    <dd>This can be used only in the
+                        specification of the value of one of the
+                        header/footer characteristics of simple-page-sequence.
+                        It returns a sosofo that will display as
+                        sosofo1 if the page is the first page of
+                        the simple-page-sequence and as sosofo2
+                        otherwise. </dd>
+                    <dt><b>&quot;UNREGISTERED::James Clark//Procedure::if-front-page&quot;</b>
+                    </dt>
+                    <dd>This can be used only in the
+                        specification of the value of one of the
+                        header/footer characteristics of simple-page-sequence.
+                        It returns a sosofo that will display as
+                        sosofo1 if the page is a front (ie recto,
+                        odd-numbered) page and as sosofo2 if it
+                        is a back (i.e. verso, even-numbered)
+                        page. </dd>
+                    <dt><b>&quot;UNREGISTERED::James Clark//Characteristic::page-n-columns&quot;</b>
+                    </dt>
+                    <dd>Value is a strictly positive integer,
+                        specifying the number of columns. The
+                        initial value is 1. </dd>
+                    <dt><b>&quot;UNREGISTERED::James Clark//Characteristic::page-column-sep&quot;</b>
+                    </dt>
+                    <dd>Value is a length, specifying the
+                        separation between columns. The initial
+                        value is .5in. </dd>
+                    <dt><b>&quot;UNREGISTERED::James Clark//Characteristic::page-balance-columns?&quot;</b>
+                    </dt>
+                    <dd>Value is a boolean. If true, the columns
+                        on the final page of the page-sequence
+                        should be balanced. The initial value is
+                        #f. </dd>
+                </dl>
+                </td>
+            </tr>
+            <tr>
+                <td valign="top" colspan="2"><b>Here's how to
+                enable the above extensions:</b><br>
+                (define if-first-page (external-procedure<br>
+                &nbsp;&nbsp;&nbsp; &quot;UNREGISTERED::James
+                Clark//Procedure::if-first-page&quot;))<br>
+                (define if-front-page (external-procedure&nbsp;&nbsp;
+                <br>
+                &nbsp;&nbsp;&nbsp; &quot;UNREGISTERED::James
+                Clark//Procedure::if-front-page&quot;))<br>
+                (declare-characteristic page-n-columns<br>
+                &nbsp;&nbsp;&nbsp; &quot;UNREGISTERED::James
+                Clark//Characteristic::page-n-columns&quot; 1)<br>
+                (declare-characteristic page-n-columns<br>
+                &nbsp;&nbsp;&nbsp; &quot;UNREGISTERED::James
+                Clark//Characteristic::page-column-gap&quot; (*
+                36 1pt))<br>
+                (declare-characteristic page-balance-columns?<br>
+                &nbsp;&nbsp;&nbsp; &quot;UNREGISTERED::James
+                Clark//Characteristic::page-balance-columns?&quot;
+                #f)<br>
+                &nbsp; </td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the table flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a name="table"><font
+                color="#FFFFFF">table</font> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top"><ul>
+                    <li>table-border </li>
+                    <li>display-alignment </li>
+                    <li>start-indent </li>
+                    <li>end-indent </li>
+                </ul>
+                </td>
+                <td valign="top"><ul>
+                    <li>table-width </li>
+                    <li>before-row-border </li>
+                    <li>after-row-border </li>
+                    <li>before-column-border </li>
+                    <li>after-column-border </li>
+                    <li>span (spans all columns if &gt; 1) </li>
+                    <li>space-before </li>
+                    <li>space-after </li>
+                    <li>keep-with-previous? </li>
+                    <li>keep-with-next? </li>
+                    <li>break-before (#f, page) </li>
+                    <li>break-after (#f, page) </li>
+                    <li>keep (#f, page) </li>
+                    <li>may-violate-keep-before? </li>
+                    <li>may-violate-keep-after? </li>
+                </ul>
+                </td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the table-part flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a name="table-part"><font
+                color="#FFFFFF">table-part</font> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top">&nbsp;</td>
+                <td valign="top"><ul>
+                    <li>space-before </li>
+                    <li>space-after </li>
+                    <li>keep-with-previous? </li>
+                    <li>keep-with-next? </li>
+                    <li>break-before (#f, page) </li>
+                    <li>break-after (#f, page) </li>
+                    <li>keep (#f, page) </li>
+                    <li>may-violate-keep-before? </li>
+                    <li>may-violate-keep-after? </li>
+                </ul>
+                </td>
+            </tr>
+            <tr>
+                <td valign="top" colspan="2"><ul>
+                    <li>header </li>
+                    <li>footer </li>
+                </ul>
+                </td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the table-column flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a name="table-column"><font
+                color="#FFFFFF">table-column</font> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top"><ul>
+                    <li>start-indent </li>
+                    <li>end-indent </li>
+                </ul>
+                </td>
+                <td valign="top"><ul>
+                    <li>column-number </li>
+                    <li>n-columns-spanned </li>
+                    <li>width </li>
+                </ul>
+                </td>
+            </tr>
+            <tr>
+                <td valign="top" colspan="2"><ul>
+                    <li>(table-unit <i>k</i>) </li>
+                </ul>
+                </td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the table-cell flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a name="table-cell"><font
+                color="#FFFFFF">table-cell</font> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top"><ul>
+                    <li>cell-before-row-margin </li>
+                    <li>cell-after-row-margin </li>
+                    <li>cell-before-column-margin </li>
+                    <li>cell-after-column-margin </li>
+                    <li>cell-row-alignment </li>
+                    <li>cell-before-row-border </li>
+                    <li>cell-after-row-border </li>
+                    <li>cell-before-column-border </li>
+                    <li>cell-after-column-border </li>
+                    <li>cell-background? </li>
+                    <li>background-color </li>
+                </ul>
+                </td>
+                <td valign="top"><ul>
+                    <li>column-number </li>
+                    <li>n-columns-spanned </li>
+                    <li>n-rows-spanned </li>
+                    <li>starts-row? </li>
+                    <li>ends-row? </li>
+                </ul>
+                </td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+       <!..........................................................
+                the table-border flow object
+       ...........................................................>
+        </div><div align="left"><table border="1" cellpadding="5"
+        cellspacing="0" width="90%">
+            <tr>
+                <th colspan="2" bgcolor="#808080"><a name="table-border"><font
+                color="#FFFFFF">table-border</font> </th>
+            </tr>
+            <tr>
+                <td align="center"><font size="2"><b>Inherited
+                characteristics</b></font> </td>
+                <td align="center"><font size="2"><b>Non-inherited
+                characteristics</b></font> </td>
+            </tr>
+            <tr>
+                <td valign="top"><ul>
+                    <li>border-present? </li>
+                    <li>line-thickness </li>
+                    <li>line-repeat (0, 1, or 2) </li>
+                    <li>line-sep </li>
+                    <li>color </li>
+                </ul>
+                </td>
+                <td valign="top">&nbsp;</td>
+            </tr>
+        </table>
+
+       <!.. top of page ..>
+       <p>
+               <a href="#top"><img src="images/top-of-page.gif" alt="Up"
+                                                border="0" width="11" height="15">
+               </a>
+               <a href="#top"><font size="2" face="Arial">Back to top</font>
+               </a>
+               &nbsp;
+       </p>
+
+
+
+
+         
+
+        <p><font face="Arial">Many DSSSL characteristics cannot
+        be implemented in RTF. The backend does the best it can. </font></p>
+        <p><font face="Arial">In order to get correct page
+        numbers in Microsoft Word, type the following after
+        opening the document: </font></p>
+        <ol>
+            <li><font face="Arial">CTRL+END </font></li>
+            <li><font face="Arial">CTRL+A </font></li>
+            <li><font face="Arial">F9 </font></li>
+        </ol>
+        <p><font face="Arial">In Word Viewer 97, you must instead
+        do: </font></p>
+        <ol>
+            <li><font face="Arial">CTRL+END </font></li>
+            <li><font face="Arial">ALT </font></li>
+            <li><font face="Arial">V </font></li>
+            <li><font face="Arial">N </font></li>
+            <li><font face="Arial">ALT </font></li>
+            <li><font face="Arial">V </font></li>
+            <li><font face="Arial">P </font></li>
+        </ol>
+        <p><font face="Arial">Page numbers also get updated
+        automatically when you print. </font></p>
+        <p><font face="Arial">We also ship a perl script 
+        <code>contrib/rtf2doc</code> for this purpose.</font></p>
+        <p><font face="Arial">The RTF backend supports some
+        additional characteristics. To use a characteristic named
+        here as <code><var>C</var></code>, declare it using <code>declare-characteristic</code>
+        with the public identifier: </font></p>
+        <pre>&quot;UNREGISTERED::James Clark//Characteristic::<var>C</var>&quot;
+</pre>
+        <dl>
+            <dt><font size="4"><code>heading-level</code> </font></dt>
+            <dd><font face="Arial">Value is an integer. It
+                applies to paragraph flow objects. If the value
+                is between 1 and 9, then the paragraph is output
+                as a header of this level, otherwise it is output
+                as body text. Using this characteristic allows
+                Word to provide useful outline views and a
+                document map. (Note that Word's handling of
+                document maps for RTF documents is buggy: if you
+                load an RTF document, and the previous document
+                was using the Online Layout view, then RTF will
+                attempt to guess what paragraphs are headings,
+                which it will almost always do wrong. To avoid
+                this, switch to the Normal view before loading an
+                RTF document.) The initial value is <code>0</code>
+                </font></dd>
+            <dt><font size="4"><code>page-number-format</code> </font></dt>
+            <dd><font face="Arial">Value is a string as for
+                format-number procedure. This controls the format
+                of the number used by page-number-sosofo and
+                current-page-number-sosofo for references to
+                pages in the simple-page-sequence. The initial
+                value is <code>&quot;1&quot;</code>. It applies
+                to simple-page-sequence flow objects. </font></dd>
+            <dt><font size="4"><code>page-number-restart?</code> </font></dt>
+            <dd><font face="Arial">Value is a boolean. If true,
+                then for the purposes of page-number-sosofo and
+                current-page-number-sosofo, the page numbers for
+                this simple-page-sequence will restart from 1.
+                The initial value is <code>#f</code>. It applies
+                to simple-page-sequence flow objects. </font></dd>
+            <dt><font size="4"><code>page-n-columns</code></font>
+            </dt>
+            <dd><font face="Arial">Value is a strictly positive
+                integer, specifying the number of columns. The
+                initial value is 1. It applies to simple-page-sequence
+                flow objects. </font></dd>
+            <dt><font size="4"><code>page-column-sep</code> </font></dt>
+            <dd><font face="Arial">Value is a length, specifying
+                the separation between columns. The initial value
+                is <code>.5in</code>. It applies to simple-page-sequence
+                flow objects. </font></dd>
+            <dt><font size="4"><code>page-balance-columns?</code>
+                </font></dt>
+            <dd><font face="Arial">Value is a boolean. If true,
+                the columns on the final page of the page-sequence
+                should be balanced. The initial value is <code>#f</code>.
+                It applies to simple-page-sequence flow objects. </font></dd>
+            <dt><font size="4"><code>superscript-height</code> </font></dt>
+            <dd><font face="Arial">Value is a length. Specifies
+                the height of the baseline of a superscript above
+                its parent's baseline. It applies to superscript
+                and script flow objects. </font></dd>
+            <dt><font size="4"><code>subscript-depth</code> </font></dt>
+            <dd><font face="Arial">Value is a length. Specifies
+                the depth of the baseline of a subscript below
+                its parent's baseline. It applies to subscript
+                and script flow objects. </font></dd>
+            <dt><font size="4"><code>over-mark-height</code> </font></dt>
+            <dd><font face="Arial">Value is a length. Specifies
+                the height of the baseline of the contents of the
+                over-mark area of a mark flow object above the
+                baseline of the contents of the main area. It
+                also controls the height of the contents of the
+                mid-sup area of the script flow object. It
+                applies to mark and script flow objects. </font></dd>
+            <dt><font size="4"><code>under-mark-depth</code> </font></dt>
+            <dd><font face="Arial">Value is a length. Specifies
+                the depth of the baseline of the contents of the
+                under-mark area of a mark flow object below the
+                baseline of the contents of the main area. It
+                also controls the depth of the contents of the
+                mid-sub area of the script flow object. It
+                applies to mark and script flow objects. </font></dd>
+            <dt><font size="4"><code>grid-row-sep</code> </font></dt>
+            <dd><font face="Arial">Value is a length. Specifies
+                the separation between rows of a grid flow object.
+                </font></dd>
+            <dt><font size="4"><code>grid-column-sep</code> </font></dt>
+            <dd><font face="Arial">Value is a length. Specifies
+                the separation between columns of a grid flow
+                object. </font></dd>
+        </dl>
+        </td>
+    </tr>
+</table>
+</div>
+</body>
+</html>
diff --git a/jadedoc/tex.htm b/jadedoc/tex.htm
new file mode 100644 (file)
index 0000000..b2d9521
--- /dev/null
@@ -0,0 +1,1243 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
+
+<html>
+<head>
+<title>The OpenJade TeX backend</title>
+</head>
+<body background="images/background.gif">
+<p>
+<font face="Geneva, Arial">
+<IMG SRC="images/dsssltitle.gif" ALT="OpenJade" VSPACE=10 BORDER=0 ALIGN=BOTTOM width="750" height="60">
+</font>
+</p>
+<div align="left">
+  <table border="0">
+    <tr>
+      <td><IMG SRC="images/space.gif" alt="" width="145" height="10"></td>
+      <td><h1><font face="Geneva, Arial">The OpenJade TeX backend</font></h1>
+        <h3><font face="Geneva, Arial">Created by David Megginson<i>, </i> Sebastian Rahtz<i>
+        and </i></font><font face="Geneva, Arial">Kathleen Marszalek<BR>
+Sponsored by
+Novare International Corp.</font></h3>
+
+<h2><a name=introduction><font face="Geneva, Arial">Introduction</font></a></h2>
+
+<p><font face="Geneva, Arial">The TeX backend was initially written by David
+Megginson, but is
+now maintained by Sebastian Rahtz. In a development sponsored by
+Novare International (to whom many thanks!), Kathleen Marszalek
+drastically improved the table support.</font>
+</p><p>
+<font face="Geneva, Arial">
+The job of the backend is to map DSSSL flow-objects into generic TeX
+macro calls.  Atomic flow objects appear as single
+<code>\insert<var>OBJECT</var>{}</code> macro calls, while non-atomic
+flow objects appear as nested pairs of
+<code>\<var>OBJECT</var>{}</code>..<code>\end<var>OBJECT</var>{}</code>
+macro calls.</font></p>
+
+<p><font face="Geneva, Arial">The <code>\insert<var>OBJECT</var></code> and
+<code>\<var>OBJECT</var></code> calls receive a single argument,
+which is a list of definitions for inherited and non-inherited
+characteristics (see below).  For example, the following DSSSL
+handler:</font></p>
+
+<pre><font face="Geneva, Arial">
+(element P
+  (make paragraph
+       start-indent: 6pt))
+</font></pre>
+
+<p><font face="Geneva, Arial">would generate the following TeX calls:</font></p>
+
+<pre><font face="Geneva, Arial">
+\startPar{\def\StartIndent{6pt}}%
+<var>CONTENTS</var>
+\endPar{}
+</font></pre>
+
+<p><font face="Geneva, Arial">It is important to note that any characters with values
+&gt;255 will appear as <code>\Character{<var>value</var>}</code> macro
+calls ie.</font></p>
+
+<pre><font face="Geneva, Arial">
+\Character{1024}
+</font></pre>
+
+<p><font face="Geneva, Arial">In addition to nearly all of the flow-object classes currently
+supported by Jade, the TeX backend generates two pseudo flow-object
+macro calls:</font></p>
+
+<ul>
+<li><code><font face="Geneva, Arial">\FOT{<var>version</var>}</font></code></li>
+<li><code><font face="Geneva, Arial">\endFOT{}</font></code></li>
+</ul>
+
+<p><font face="Geneva, Arial">These are guaranteed to appear at the very beginning and very end
+of the .tex output file, and give your macros a chance to grab control
+at both points.  The argument to <code>\FOT</code> is the version of
+the TeX markup generated by the Jade backend (currently 2). Macro
+packages should check this for compatibility.</font>
+
+
+<p><font face="Geneva, Arial">The output <code>.tex</code> file is not ready to be passed
+directly through TeX or LaTeX -- instead, it is necessary to
+have TeX macro definitions for all of the flow-object macros, and to
+set default values for the characteristics.  The macros can
+use of TeX primitives, plain TeX, LaTeX, or any other format
+which is convenient.</font></p>
+<p>
+<font face="Geneva, Arial">
+A LaTeX macro package for use with the output of this backend has been
+developed by <A HREF="mailto:s.rahtz@elsevier.co.uk">Sebastian
+Rahtz</A>.  The current stable release can be found on CTAN in <A
+HREF="ftp://ftp.tex.ac.uk/pub/archive/macros/jadetex/">macros/jadetex</A>;
+experimental releases will be placed at
+<A
+href="http://www.tug.org/applications/jadetex/">http://www.tug.org/applications/jadetex/</A>
+at intervals.</font>
+
+
+<h2><a name=characteristics>Characteristics</a></h2>
+
+<p><font face="Geneva, Arial">The <var>SETTINGS</var> argument to the flow-object macros will
+contain a series of \def statements for both inherited and
+non-inherited characteristics.  These will appear only when the
+characteristic's value differs from the standard default (in the case
+of non-inherited characteristics) or from the current value (in the
+case of inherited characteristics).  Since these statements appear as
+an argument, they will not take effect until you reference the
+parameter explicitly.</font></p>
+
+
+<h3><a name=inherited.characteristics><font face="Geneva, Arial">Inherited Characteristics</font></a></h3>
+
+<p><font face="Geneva, Arial">The characteristics in the following table are inherited -- you
+should set these to their default values only once, at the beginning
+of the parse (but they should always revert to their previous values
+after a flow-object has finished):</font></p>
+
+<table border=1 cellpadding=4 cellspacing="0">
+<tr>
+<th align=left bgcolor="#808080"><font color="#FFFFFF">Characteristic</font></th>
+<th align=left bgcolor="#808080"><font color="#FFFFFF">Default Value</font></th>
+<th align=left bgcolor="#808080"><font color="#FFFFFF">DSSSL Equivalent</font></th>
+</tr>
+
+<tr>
+<td><code>\AsisWrapIndent</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\BackgroundColor</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\BackgroundLayer</code></td>
+<td><code>-1</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\BackgroundTile</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\BorderAlignment</code></td>
+<td><code>center</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\BorderOmitAtBreak</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\BorderPresent</code></td>
+<td><code>1 [true]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\BorderPriority</code></td>
+<td><code>0</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\BottomMargin</code></td>
+<td><code>0pt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\BoxBorderAlignment</code></td>
+<td><code>outside </code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\BoxCornerRadius</code></td>
+<td><code>0pt</code></td>
+<td><a href="#note.boxcornerradius">[note]</a></td>
+</tr>
+
+<tr>
+<td><code>\BoxOpenEnd</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\BoxSizeAfter</code></td>
+<td><code>4pt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\BoxSizeBefore</code></td>
+<td><code>8pt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\BoxType</code></td>
+<td><code>border</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\CellAfterColumnMargin</code></td>
+<td><code>0pt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\CellAfterRowMargin</code></td>
+<td><code>0pt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\CellBackground</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\CellBeforeColumnMargin</code></td>
+<td><code>0pt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\CellBeforeRowMargin</code></td>
+<td><code>0pt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\CellCrossed</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\CellRowAlignment</code></td>
+<td><code>start</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\Color</code></td>
+<td><i>current gray</i></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\Country</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\DisplayAlignment</code></td>
+<td><code>start</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\EndIndent</code></td>
+<td><code>0pt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\EndMargin</code></td>
+<td><code>0pt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\ExpandTabs</code></td>
+<td><code>8</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\FieldAlign</code></td>
+<td><code>start</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\FieldWidth</code></td>
+<td><code>0pt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\FillingDirection</code></td>
+<td><code>top-to-bottom</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\FirstLineStartIndent</code></td>
+<td><code>0pt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\FloatOutLineNumbers</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\FloatOutMarginalia</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\FloatOutSidelines</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\FontFamilyName</code></td>
+<td><code>iso-serif</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\FontName</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\FontPosture</code></td>
+<td><code>upright </code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\FontProportionateWidth</code></td>
+<td><code>medium</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\FontSize</code></td>
+<td><code>10pt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\FontStructure</code></td>
+<td><code>solid</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\FontWeight</code></td>
+<td><code>medium</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\FooterMargin</code></td>
+<td><code>0pt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\GlyphAlignmentMode</code></td>
+<td><code>font</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\GlyphReorderMethod</code></td>
+<td><code>??</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\GlyphSubstMethod</code></td>
+<td><code>??</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\HangingPunct</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\HeaderMargin</code></td>
+<td><code>0pt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\Hyphenate</code></td>
+<td><code>??</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\HyphenationKeep</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\HyphenationLadderCount</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\HyphenationMethod</code></td>
+<td><code>??</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\HyphenationPushCharCount</code></td>
+<td><code>2</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\HyphenationRemainCharCount</code></td>
+<td><code>2</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\IgnoreRecordEnd</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\ImplicitBidiMethod</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\InhibitLineBreaks</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\InputWhitespaceTreatment</code></td>
+<td><code>??</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\JustifyGlyphSpaceMaxAdd</code></td>
+<td><code>0pt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\JustifyGlyphSpaceMaxRemove</code></td>
+<td><code>0pt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\Kern</code></td>
+<td><code>??</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\KernMode</code></td>
+<td><code>??</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\Language</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\LastLineEndIndent</code></td>
+<td><code>0pt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\LastLineJustifyLimit</code></td>
+<td><code>0pt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\LastLineQuadding</code></td>
+<td><code>relative</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\Layer</code></td>
+<td><code>0</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\LeftMargin</code></td>
+<td><code>0pt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\Ligature</code></td>
+<td><code>??</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\LineBreakingMethod</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\LineCap</code></td>
+<td><code>butt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\LineCompositionMethod</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\LineJoin</code></td>
+<td><code>miter</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\LineNumberSep</code></td>
+<td><code>??</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\LineNumberSide</code></td>
+<td><code>??</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\LineRepeat</code></td>
+<td><code>1</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\LineSep</code></td>
+<td><code>1pt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\LineSpacing</code></td>
+<td><code>12pt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\LineThickness</code></td>
+<td><code>1pt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\Lines</code></td>
+<td><code>wrap</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\MarginaliaKeepWithPrevious</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\MarginaliaSep</code></td>
+<td><code>0pt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\MarginaliaSide</code></td>
+<td><code>start</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\MathDisplayMode</code></td>
+<td><code>??</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\MinLeaderRepeat</code></td>
+<td><code>1</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\NColumnsSpanned</code></td>
+<td><code>1</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\NRowsSpanned</code></td>
+<td><code>1</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\NumberedLines</code></td>
+<td><code>1 [true]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\OrphanCount</code></td>
+<td><code>2</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\PageHeight</code></td>
+<td><i>sysdep</i></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\PageWidth</code></td>
+<td><i>sysdep</i></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\PositionPointShift</code></td>
+<td><code>0pt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\PrincipalModeSimultaneous</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\Quadding</code></td>
+<td><code>start</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\RightMargin</code></td>
+<td><code>0pt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\ScoreSpaces</code></td>
+<td><code>1 [true]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\SidelineSep</code></td>
+<td><i>required</i></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\SidelineSide</code></td>
+<td><i>required</i></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\Span</code></td>
+<td><code>1</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\SpanWeak</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\StartIndent</code></td>
+<td><code>0pt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\StartMargin</code></td>
+<td><code>0pt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\TableAutoWidthMethod</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\TableCornerRadius</code></td>
+<td><code>0pt</code></td>
+<td><a href="#note.tablecornerradius">[note]</a></td>
+</tr>
+
+<tr>
+<td><code>\TablePartOmitMiddleFooter</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\TablePartOmitMiddleHeader</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\TopMargin</code></td>
+<td><code>0pt</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\WidowCount</code></td>
+<td><code>2</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\WritingMode</code></td>
+<td><code>left-to-right</code></td>
+<td>&nbsp;</td>
+</tr>
+</table>
+
+<p>&nbsp;</p>
+
+<h4>Notes</h4>
+
+<ol>
+<li><a name=note.boxcornerradius><code>\BoxCornerRadius</code>
+combines the <code>box-corner-rounded</code> and
+<code>box-corner-radius</code> characteristics (its value is
+<code>0pt</code> if box-corner-rounded is <code>#f</code>).</a></li>
+<li><a name=note.tablecornerradius><code>\TableCornerRadius</code>
+combines the <code>table-corner-rounded</code> and
+<code>table-corner-radius</code> characteristics (its value is
+<code>0pt</code> if <code>table-corner-rounded</code> is
+<code>#f</code>).</a></li>
+</ol>
+
+
+<h3><a name=noninherited.characteristics>Non-Inherited
+Characteristics</a></h3>
+
+<p>The characteristics in the following table are not inherited -- you
+should set these to their default values at the beginning of
+<em>every</em> relevant flow-object, before evaluating the
+<var>SETTINGS</var> argument:</p>
+
+<table border=1 cellpadding=4 cellspacing="0">
+<tr>
+<th align=left bgcolor="#808080"><font color="#FFFFFF">Characteristic</font></th>
+<th align=left bgcolor="#808080"><font color="#FFFFFF">Default Value</font></th>
+<th align=left bgcolor="#808080"><font color="#FFFFFF">DSSSL Equivalent</font></th>
+</tr>
+
+<tr>
+<td><code>\AlignLeader</code></td>
+<td><code>1 [true]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\BreakAfter</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\BreakAfterPriority</code></td>
+<td><code>0       </code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\BreakBefore</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\BreakBeforePriority</code></td>
+<td><code>0       </code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\Ch</code></td>
+<td><i>no default</i></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\CoalesceId</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\ColumnIndex</code></td>
+<td><i>contextual</i></td>
+<td><code>column-number [??]</code></td>
+</tr>
+
+<tr>
+<td><code>\EntitySystemId</code></td>
+<td><i>required</i></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\EscapementDirection</code></td>
+<td>&nbsp;</td>
+<td><code>writing-mode</code></td>
+</tr>
+
+<tr>
+<td><code>\GlyphId</code></td>
+<td><i>no default</i></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\IdrefAddress</code></td>
+<td><code>??      </code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\IsDisplay</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\IsDropAfterLineBreak</code></td>
+<td><i>unspecified</i></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\IsDropUnlessBeforeLineBreak</code></td>
+<td><i>unspecified</i></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\IsPunct</code></td>
+<td><i>unspecified</i></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\IsInputTab</code></td>
+<td><i>unspecified</i></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\IsInputWhiteSpace</code></td>
+<td><i>unspecified</i></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\IsRecordEnd</code></td>
+<td><i>unspecified</i></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\IsSpace</code></td>
+<td><i>unspecified</i></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\Keep</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\KeepWithNext</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\KeepWithPrevious</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\Length</code></td>
+<td><i>context</i></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\MathClass</code></td>
+<td><i>unspecified</i></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\MathFontPosture</code></td>
+<td><i>unspecified</i></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\MaxHeight</code></td>
+<td><i>contextual</i></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\MaxWidth</code></td>
+<td><i>contextual</i></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\MayViolateKeepAfter</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\MayViolateKeepBefore</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\NotationSystemId</code></td>
+<td><i>required</i></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\Orientation</code></td>
+<td><i>required</i></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\PositionPointX</code></td>
+<td><code>??      </code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\PositionPointY</code></td>
+<td><code>??      </code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\PositionPreference</code></td>
+<td><code>0 [#f]</code></td>
+<td><code>position-preference</code></td>
+</tr>
+
+<tr>
+<td><code>\ScaleType</code></td>
+<td><code>maxuniform</code></td>
+<td><code>scale</code> <a href=note.scale>[note]</a></td>
+</tr>
+
+<tr>
+<td><code>\ScaleX</code></td>
+<td><i>n/a</i></td>
+<td><code>scale</code> <a href=note.scale>[note]</a></td>
+</tr>
+
+<tr>
+<td><code>\ScaleY</code></td>
+<td><i>n/a</i></td>
+<td><code>scale</code> <a href=note.scale>[note]</a></td>
+</tr>
+
+<tr>
+<td><code>\ScoreLength</code></td>
+<td><code>??      </code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\ScoreType</code></td>
+<td><i>required</i></td>
+<td><code>type</code></td>
+</tr>
+
+<tr>
+<td><code>\Script</code></td>
+<td><i>unspecified</i></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\SpaceAfterConditional</code></td>
+<td><code>0 [#f]</code></td>
+<td><code>space-after</code></td>
+</tr>
+
+<tr>
+<td><code>\SpaceAfterForce</code></td>
+<td><code>0 [#f]</code></td>
+<td><code>space-after</code></td>
+</tr>
+
+<tr>
+<td><code>\SpaceAfterMax</code></td>
+<td><code>0pt</code></td>
+<td><code>space-after</code></td>
+</tr>
+
+<tr>
+<td><code>\SpaceAfterMaxFactor</code></td>
+<td><code>0</code></td>
+<td><code>space-after</code></td>
+</tr>
+
+<tr>
+<td><code>\SpaceAfterMin</code></td>
+<td><code>0pt</code></td>
+<td><code>space-after</code></td>
+</tr>
+
+<tr>
+<td><code>\SpaceAfterMinFactor</code></td>
+<td><code>0</code></td>
+<td><code>space-after</code></td>
+</tr>
+
+<tr>
+<td><code>\SpaceAfterNominal</code></td>
+<td><code>0pt</code></td>
+<td><code>space-after</code></td>
+</tr>
+
+<tr>
+<td><code>\SpaceAfterNominalFactor</code></td>
+<td><code>0</code></td>
+<td><code>space-after</code></td>
+</tr>
+
+<tr>
+<td><code>\SpaceAfterPriority</code></td>
+<td><code>0</code></td>
+<td><code>space-after</code></td>
+</tr>
+
+<tr>
+<td><code>\SpaceBeforeConditional</code></td>
+<td><code>0 [#f]</code></td>
+<td><code>space-before</code></td>
+</tr>
+
+<tr>
+<td><code>\SpaceBeforeForce</code></td>
+<td><code>0 [#f]</code></td>
+<td><code>space-before</code></td>
+</tr>
+
+<tr>
+<td><code>\SpaceBeforeMax</code></td>
+<td><code>0pt</code></td>
+<td><code>space-before</code></td>
+</tr>
+
+<tr>
+<td><code>\SpaceBeforeMaxFactor</code></td>
+<td><code>0</code></td>
+<td><code>space-before</code></td>
+</tr>
+
+<tr>
+<td><code>\SpaceBeforeMin</code></td>
+<td><code>0pt</code></td>
+<td><code>space-before</code></td>
+</tr>
+
+<tr>
+<td><code>\SpaceBeforeMinFactor</code></td>
+<td><code>0</code></td>
+<td><code>space-before</code></td>
+</tr>
+
+<tr>
+<td><code>\SpaceBeforeNominal</code></td>
+<td><code>0pt</code></td>
+<td><code>space-before</code></td>
+</tr>
+
+<tr>
+<td><code>\SpaceBeforeNominalFactor</code></td>
+<td><code>0</code></td>
+<td><code>space-before</code></td>
+</tr>
+
+<tr>
+<td><code>\SpaceBeforePriority</code></td>
+<td><code>0</code></td>
+<td><code>space-before</code></td>
+</tr>
+
+<tr>
+<td><code>\StretchFactor</code></td>
+<td><code>0</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\TableWidth</code></td>
+<td><i>contextual</i></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\TruncateLeader</code></td>
+<td><code>0 [#f]</code></td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td><code>\Width</code></td>
+<td><i>required</i></td>
+<td><a href="#note.width">[note]</a></td>
+</tr>
+
+</table>
+
+<h4>Notes</h4>
+
+<ol>
+<li><a name=note.scale><code>ScaleType</code>, <code>ScaleX</code>,
+and <code>ScaleY</code> are all the equivalent of the
+<code>scale</code> characteristic: if <code>ScaleType</code> is
+<code>0</code> [<code>#f</code>], then <code>ScaleX</code> and
+<code>ScaleY</code> become relevant.</a></li>
+<li><a name=note.width>The <code>Width</code> characteristic is not
+required if <code>table-auto-width</code> feature is present.</a></li>
+</ol>
+
+<address>Sebastian Rahtz, 
+<a href="mailto:s.rahtz@elsevier.co.uk">s.rahtz@elsevier.co.uk</a>
+</address>
+
+<p>&nbsp;</p>
+
+<p>&nbsp;</p>
+
+<p>&nbsp;</p>
+
+<p>&nbsp;</p>
+
+<p>&nbsp;</p>
+
+<p>&nbsp;</p>
+
+<p>&nbsp;</p>
+
+<p>&nbsp;</p>
+
+<p>
+&nbsp;
+        <p>&nbsp;</td>
+    </tr>
+  </table>
+</div>
+<p>&nbsp;</p>
+<p>&nbsp;</p>
+<p>&nbsp;</p>
+
+</body>
+</html>
+
+<!-- Keep this comment at the end of the file
+Local variables:
+mode: sgml
+End:
+-->
diff --git a/jadedoc/transform.htm b/jadedoc/transform.htm
new file mode 100644 (file)
index 0000000..165d1e1
--- /dev/null
@@ -0,0 +1,239 @@
+<!-- -*- sgml -*- -->
+<html>
+
+<head>
+<meta http-equiv="Content-Type"
+content="text/html; charset=iso-8859-1">
+<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
+<title>The OpenJade SGML/XML backend</title>
+</head>
+
+<body background="images/background.gif" bgcolor="#FFFFFF">
+
+<p><font face="Geneva, Arial"><img src="images/dsssltitle.gif"
+alt="OpenJade" vspace="10" width="750" height="60"> </font></p>
+<div align="center"><center>
+
+<table border="0">
+    <tr>
+        <td><font face="Geneva, Arial"><img
+        src="images/space.gif" alt="" width="145" height="10"></font></td>
+        <td><h1><font face="Geneva, Arial">The OpenJade SGML/XML backend</font></h1>
+        <h3><font face="Arial">Created by James Clark</font></h3>
+        <p><font face="Geneva, Arial">OpenJade does not support the
+        DSSSL Transformation Language. However, it provides some
+        simple, non-standardized extensions to the DSSSL Style
+        Language that allow it to be used for SGML
+        transformations.</font> </p>
+        <p><font face="Geneva, Arial">These extensions are used
+        in conjunction with the SGML backend which is selected
+        with the <samp>-t sgml</samp> or <samp>-t xml</samp>
+        options. Unlike other backends, the SGML backend writes
+        its output to the standard output.</font> </p>
+        <p><font face="Geneva, Arial">The <samp>-t xml</samp>
+        option makes empty elements and processing instructions
+        use the XML syntax. Note that the XML declaration is not
+        automatically emitted.</font> </p>
+        <p><font face="Geneva, Arial">The extensions consist of a
+        collection of flow object classes that are used instead
+        of the standard DSSSL-defined flow object classes:</font>
+        </p>
+        <dl>
+            <dt><font face="Geneva, Arial"><code>element</code></font>
+            </dt>
+            <dt><font face="Geneva, Arial"><code>empty-element</code></font>
+            </dt>
+            <dd><font face="Geneva, Arial">Each of these flow
+                objects results in an element in the output. The <code>element</code>
+                flow object is a compound flow object (one that
+                can have child flow objects). Both a start-tag
+                and an end-tag are generated for this flow object.
+                The <code>empty-element</code> is an atomic flow
+                object (one that cannot have child flow objects).
+                Only a start-tag is output for this. It should
+                should be used for elements with a declared
+                content of EMPTY or with a content reference
+                attribute. Both of these flow objects support the
+                following non-inherited characteristics:</font> <dl>
+                    <dt><font face="Geneva, Arial"><code>gi</code></font>
+                    </dt>
+                    <dd><font face="Geneva, Arial">This is a
+                        string-valued characteristic that
+                        specifies the element's generic
+                        identifier. It defaults to the generic
+                        identifier of the current node.</font> </dd>
+                    <dt><font face="Geneva, Arial"><code>attributes</code></font>
+                    </dt>
+                    <dd><font face="Geneva, Arial">This specifies
+                        the element's attributes as a list of
+                        lists each of which consists of exactly
+                        two strings, the first specifying the
+                        attribute name and the second the
+                        attribute value. It defaults to the empty
+                        list.</font> </dd>
+                </dl>
+            </dd>
+            <dd>&nbsp;</dd>
+            <dt><font face="Geneva, Arial"><code>processing-instruction</code></font>
+            </dt>
+            <dd><font face="Geneva, Arial">This is an atomic flow
+                object that results in a processing instruction.
+                It supports the following non-inherited
+                characteristics:</font> <dl>
+                    <dt><font face="Geneva, Arial"><code>data</code></font>
+                    </dt>
+                    <dd><font face="Geneva, Arial">This is a
+                        string-valued characteristic that
+                        specifies the content of the processing
+                        instruction. It defaults to the empty
+                        string.</font> </dd>
+                </dl>
+            </dd>
+            <dt><font face="Geneva, Arial"><code>document-type</code></font>
+            </dt>
+            <dd><font face="Geneva, Arial">This is an atomic flow
+                object that results in a DOCTYPE declaration. It
+                supports the following non-inherited
+                characteristics:</font> <dl>
+                    <dt><font face="Geneva, Arial"><code>name</code></font>
+                    </dt>
+                    <dd><font face="Geneva, Arial">This is a
+                        string-valued characteristic that
+                        specifies the name of the document type (which
+                        must be the same as the name of the
+                        document element). It must not be omitted.</font>
+                    </dd>
+                    <dt><font face="Geneva, Arial"><code>system-id</code></font>
+                    </dt>
+                    <dd><font face="Geneva, Arial">This is a
+                        string-valued characteristic that
+                        specifies the system identifier of the
+                        document type. If non-empty, this will be
+                        used as the system identifier in the
+                        doctype declaration. The default value is
+                        the empty string.</font> </dd>
+                    <dt><font face="Geneva, Arial"><code>public-id</code></font>
+                    </dt>
+                    <dd><font face="Geneva, Arial">This is a
+                        string-valued characteristic that
+                        specifies the public identifier of the
+                        document type. If non-empty, this will be
+                        used as the public identifier in the
+                        doctype declaration. The default value is
+                        the empty string.</font> </dd>
+                </dl>
+            </dd>
+            <dt><font face="Geneva, Arial"><code>entity</code></font>
+            </dt>
+            <dd><font face="Geneva, Arial">This is an compound
+                flow object that stores its content in a separate
+                entity. It supports the following non-inherited
+                characteristic:</font> <dl>
+                    <dt><font face="Geneva, Arial"><code>system-id</code></font>
+                    </dt>
+                    <dd><font face="Geneva, Arial">The system
+                        identifier of the entity. For now this is
+                        treated as a filename not as an FSI.</font>
+                    </dd>
+                </dl>
+                <p><font face="Geneva, Arial">Note that no entity
+                reference or declaration is emitted.</font> </p>
+            </dd>
+            <dt><font face="Geneva, Arial"><code>entity-ref</code></font>
+            </dt>
+            <dd><font face="Geneva, Arial">This is an atomic flow
+                object that results in an entity reference. It
+                supports the following non-inherited
+                characteristic:</font> <dl>
+                    <dt><font face="Geneva, Arial"><code>name</code></font>
+                    </dt>
+                    <dd><font face="Geneva, Arial">The name of
+                        the entity.</font> </dd>
+                </dl>
+            </dd>
+            <dt><font face="Geneva, Arial"><code>formatting-instruction</code></font>
+            </dt>
+            <dd><font face="Geneva, Arial">This is an atomic flow
+                object that inserts characters into the output
+                without change. It supports the following non-inherited
+                characteristic:</font> <dl>
+                    <dt><font face="Geneva, Arial"><code>data</code></font>
+                    </dt>
+                    <dd><font face="Geneva, Arial">This is the
+                        string to be inserted.</font> </dd>
+                </dl>
+                <p><font face="Geneva, Arial">It differs from
+                normal data characters in the <code>&amp;</code>,
+                <code>&lt;</code> and <code>&gt;</code> will not
+                be escaped.</font> </p>
+            </dd>
+        </dl>
+        <p><font face="Geneva, Arial">There is also the following
+        characteristic:</font> </p>
+        <dl>
+            <dt><font face="Geneva, Arial"><code>preserve-sdata?</code></font>
+            </dt>
+            <dd><font face="Geneva, Arial">This is an inherited
+                boolean characteristic that applies to character
+                flow objects. When true, if the current-node for
+                the character flow object was an sdata node, then
+                the character will be output as a reference to an
+                entity with the same name. The initial value is #f.</font>
+            </dd>
+        </dl>
+        <p><font face="Geneva, Arial">Each of these flow object
+        classes must be declared using <code>declare-flow-object-class</code>
+        in any DSSSL specification that makes use of it. A
+        suitable set of declarations is:</font> </p>
+        <pre><font face="Geneva, Arial">
+(declare-flow-object-class element
+  &quot;UNREGISTERED::James Clark//Flow Object Class::element&quot;)
+(declare-flow-object-class empty-element
+  &quot;UNREGISTERED::James Clark//Flow Object Class::empty-element&quot;)
+(declare-flow-object-class document-type
+  &quot;UNREGISTERED::James Clark//Flow Object Class::document-type&quot;)
+(declare-flow-object-class processing-instruction
+  &quot;UNREGISTERED::James Clark//Flow Object Class::processing-instruction&quot;)
+(declare-flow-object-class entity
+  &quot;UNREGISTERED::James Clark//Flow Object Class::entity&quot;)
+(declare-flow-object-class entity-ref
+  &quot;UNREGISTERED::James Clark//Flow Object Class::entity-ref&quot;)
+(declare-flow-object-class formatting-instruction
+  &quot;UNREGISTERED::James Clark//Flow Object Class::formatting-instruction&quot;)
+(declare-characteristic preserve-sdata?
+  &quot;UNREGISTERED::James Clark//Characteristic::preserve-sdata?&quot;
+  #f)
+</font></pre>
+        <p><font face="Geneva, Arial">Here's a simple example
+        that does the identity transformation:</font> </p>
+        <pre><font face="Geneva, Arial">
+&lt;!doctype style-sheet PUBLIC &quot;-//James Clark//DTD DSSSL Style Sheet//EN&quot;&gt;
+
+(declare-flow-object-class element
+  &quot;UNREGISTERED::James Clark//Flow Object Class::element&quot;)
+
+(define (copy-attributes #!optional (nd (current-node)))
+  (let loop ((atts (named-node-list-names (attributes nd))))
+    (if (null? atts)
+        '()
+        (let* ((name (car atts))
+               (value (attribute-string name nd)))
+          (if value
+              (cons (list name value)
+                    (loop (cdr atts)))
+              (loop (cdr atts)))))))
+
+(default (make element
+               attributes: (copy-attributes)))
+</font></pre>
+        <p><font face="Geneva, Arial">Note that this does not
+        deal with empty elements nor processing instructions, nor
+        does it include a doctype declaration.</font> </p>
+        </td>
+    </tr>
+</table>
+</center></div>
+
+<p>&nbsp;</p>
+</body>
+</html>
diff --git a/jadedoc/xmlfo.htm b/jadedoc/xmlfo.htm
new file mode 100644 (file)
index 0000000..ddc7e3d
--- /dev/null
@@ -0,0 +1,38 @@
+<html>
+
+<head>
+<meta http-equiv="Content-Type"
+content="text/html; charset=iso-8859-1">
+<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
+<title>The OpenJade FOT backend</title>
+</head>
+
+<body background="images/background.gif">
+
+<p align="left"><font face="Geneva, Arial"><img
+src="images/dsssltitle.gif" alt="OpenJade" vspace="10"
+width="750" height="60"> </font></p>
+
+<p align="left">&nbsp; </p>
+<div align="left">
+
+<table border="0">
+    <tr>
+        <td><img src="images/space.gif" alt="" width="145" height="10"></td>
+        <td><h1><font face="Arial">The OpenJade FOT backend</font></h1>
+        <h3><font face="Arial">Created by James Clark</font><font
+        face="Geneva, Arial"><br>
+        </font></h3>
+        <p><font face="Arial">This backend creates an XML representation of 
+        the flow object tree, The DTD for the XML generated is in
+        </font><a href="../dsssl/fot.dtd"><font face="Arial"><code>dsssl/fot.dtd</code></font></a><font face="Arial">.</font></p>
+        <p><font face="Arial">Characteristics declared with <code>declare-characteristic</code>
+        are not reported. </font></p>
+        <p><font face="Arial">Flow objects of classes declared
+        with <code>declare-flow-object</code> are not reported. </font></p>
+        </td>
+    </tr>
+</table>
+</div>
+</body>
+</html>
diff --git a/japan.sgmldecl b/japan.sgmldecl
new file mode 100644 (file)
index 0000000..ea8181a
--- /dev/null
@@ -0,0 +1,630 @@
+<!SGML "ISO 8879:1986"
+
+-- This character set declaration is suitable for use with the ujis or
+sjis coding systems.  It's probably rather easier to lie a bit. --
+
+CHARSET
+BASESET
+"ISO Registration Number 1//CHARSET C0 set of ISO 646//ESC 2/1 4/0"
+DESCSET     0    9   UNUSED
+           9    2   9
+          11    2   UNUSED
+          13    1   13
+          14   18   UNUSED
+
+BASESET
+"ISO Registration Number 14//CHARSET ISO 646 Japanese Version//ESC 2/8 4/10"
+DESCSET
+32 95 32
+127 1 UNUSED
+
+BASESET
+"ISO Registration Number 87//CHARSET JIS X 0208-1990//ESC 2/6 4/0 ESC 2/4 4/2"
+
+DESCSET
+41344 33 UNUSED
+41377 94  8481
+41471  1 UNUSED
+41600 33 UNUSED
+41633 94  8737
+41727  1 UNUSED
+41856 33 UNUSED
+41889 94  8993
+41983  1 UNUSED
+42112 33 UNUSED
+42145 94  9249
+42239  1 UNUSED
+42368 33 UNUSED
+42401 94  9505
+42495  1 UNUSED
+42624 33 UNUSED
+42657 94  9761
+42751  1 UNUSED
+42880 33 UNUSED
+42913 94 10017
+43007  1 UNUSED
+43136 33 UNUSED
+43169 94 10273
+43263  1 UNUSED
+43392 33 UNUSED
+43425 94 10529
+43519  1 UNUSED
+43648 33 UNUSED
+43681 94 10785
+43775  1 UNUSED
+43904 33 UNUSED
+43937 94 11041
+44031  1 UNUSED
+44160 33 UNUSED
+44193 94 11297
+44287  1 UNUSED
+44416 33 UNUSED
+44449 94 11553
+44543  1 UNUSED
+44672 33 UNUSED
+44705 94 11809
+44799  1 UNUSED
+44928 33 UNUSED
+44961 94 12065
+45055  1 UNUSED
+45184 33 UNUSED
+45217 94 12321
+45311  1 UNUSED
+45440 33 UNUSED
+45473 94 12577
+45567  1 UNUSED
+45696 33 UNUSED
+45729 94 12833
+45823  1 UNUSED
+45952 33 UNUSED
+45985 94 13089
+46079  1 UNUSED
+46208 33 UNUSED
+46241 94 13345
+46335  1 UNUSED
+46464 33 UNUSED
+46497 94 13601
+46591  1 UNUSED
+46720 33 UNUSED
+46753 94 13857
+46847  1 UNUSED
+46976 33 UNUSED
+47009 94 14113
+47103  1 UNUSED
+47232 33 UNUSED
+47265 94 14369
+47359  1 UNUSED
+47488 33 UNUSED
+47521 94 14625
+47615  1 UNUSED
+47744 33 UNUSED
+47777 94 14881
+47871  1 UNUSED
+48000 33 UNUSED
+48033 94 15137
+48127  1 UNUSED
+48256 33 UNUSED
+48289 94 15393
+48383  1 UNUSED
+48512 33 UNUSED
+48545 94 15649
+48639  1 UNUSED
+48768 33 UNUSED
+48801 94 15905
+48895  1 UNUSED
+49024 33 UNUSED
+49057 94 16161
+49151  1 UNUSED
+49280 33 UNUSED
+49313 94 16417
+49407  1 UNUSED
+49536 33 UNUSED
+49569 94 16673
+49663  1 UNUSED
+49792 33 UNUSED
+49825 94 16929
+49919  1 UNUSED
+50048 33 UNUSED
+50081 94 17185
+50175  1 UNUSED
+50304 33 UNUSED
+50337 94 17441
+50431  1 UNUSED
+50560 33 UNUSED
+50593 94 17697
+50687  1 UNUSED
+50816 33 UNUSED
+50849 94 17953
+50943  1 UNUSED
+51072 33 UNUSED
+51105 94 18209
+51199  1 UNUSED
+51328 33 UNUSED
+51361 94 18465
+51455  1 UNUSED
+51584 33 UNUSED
+51617 94 18721
+51711  1 UNUSED
+51840 33 UNUSED
+51873 94 18977
+51967  1 UNUSED
+52096 33 UNUSED
+52129 94 19233
+52223  1 UNUSED
+52352 33 UNUSED
+52385 94 19489
+52479  1 UNUSED
+52608 33 UNUSED
+52641 94 19745
+52735  1 UNUSED
+52864 33 UNUSED
+52897 94 20001
+52991  1 UNUSED
+53120 33 UNUSED
+53153 94 20257
+53247  1 UNUSED
+53376 33 UNUSED
+53409 94 20513
+53503  1 UNUSED
+53632 33 UNUSED
+53665 94 20769
+53759  1 UNUSED
+53888 33 UNUSED
+53921 94 21025
+54015  1 UNUSED
+54144 33 UNUSED
+54177 94 21281
+54271  1 UNUSED
+54400 33 UNUSED
+54433 94 21537
+54527  1 UNUSED
+54656 33 UNUSED
+54689 94 21793
+54783  1 UNUSED
+54912 33 UNUSED
+54945 94 22049
+55039  1 UNUSED
+55168 33 UNUSED
+55201 94 22305
+55295  1 UNUSED
+55424 33 UNUSED
+55457 94 22561
+55551  1 UNUSED
+55680 33 UNUSED
+55713 94 22817
+55807  1 UNUSED
+55936 33 UNUSED
+55969 94 23073
+56063  1 UNUSED
+56192 33 UNUSED
+56225 94 23329
+56319  1 UNUSED
+56448 33 UNUSED
+56481 94 23585
+56575  1 UNUSED
+56704 33 UNUSED
+56737 94 23841
+56831  1 UNUSED
+56960 33 UNUSED
+56993 94 24097
+57087  1 UNUSED
+57216 33 UNUSED
+57249 94 24353
+57343  1 UNUSED
+57472 33 UNUSED
+57505 94 24609
+57599  1 UNUSED
+57728 33 UNUSED
+57761 94 24865
+57855  1 UNUSED
+57984 33 UNUSED
+58017 94 25121
+58111  1 UNUSED
+58240 33 UNUSED
+58273 94 25377
+58367  1 UNUSED
+58496 33 UNUSED
+58529 94 25633
+58623  1 UNUSED
+58752 33 UNUSED
+58785 94 25889
+58879  1 UNUSED
+59008 33 UNUSED
+59041 94 26145
+59135  1 UNUSED
+59264 33 UNUSED
+59297 94 26401
+59391  1 UNUSED
+59520 33 UNUSED
+59553 94 26657
+59647  1 UNUSED
+59776 33 UNUSED
+59809 94 26913
+59903  1 UNUSED
+60032 33 UNUSED
+60065 94 27169
+60159  1 UNUSED
+60288 33 UNUSED
+60321 94 27425
+60415  1 UNUSED
+60544 33 UNUSED
+60577 94 27681
+60671  1 UNUSED
+60800 33 UNUSED
+60833 94 27937
+60927  1 UNUSED
+61056 33 UNUSED
+61089 94 28193
+61183  1 UNUSED
+61312 33 UNUSED
+61345 94 28449
+61439  1 UNUSED
+61568 33 UNUSED
+61601 94 28705
+61695  1 UNUSED
+61824 33 UNUSED
+61857 94 28961
+61951  1 UNUSED
+62080 33 UNUSED
+62113 94 29217
+62207  1 UNUSED
+62336 33 UNUSED
+62369 94 29473
+62463  1 UNUSED
+62592 33 UNUSED
+62625 94 29729
+62719  1 UNUSED
+62848 33 UNUSED
+62881 94 29985
+62975  1 UNUSED
+63104 33 UNUSED
+63137 94 30241
+63231  1 UNUSED
+63360 33 UNUSED
+63393 94 30497
+63487  1 UNUSED
+63616 33 UNUSED
+63649 94 30753
+63743  1 UNUSED
+63872 33 UNUSED
+63905 94 31009
+63999  1 UNUSED
+64128 33 UNUSED
+64161 94 31265
+64255  1 UNUSED
+64384 33 UNUSED
+64417 94 31521
+64511  1 UNUSED
+64640 33 UNUSED
+64673 94 31777
+64767  1 UNUSED
+64896 33 UNUSED
+64929 94 32033
+65023  1 UNUSED
+65152 33 UNUSED
+65185 94 32289
+65279  1 UNUSED
+
+BASESET
+"ISO Registration Number 13//CHARSET JIS X 0201-1986//ESC 2/8 4/9"
+-- JIS C 6220-1969 --
+DESCSET
+128 33 UNUSED
+161 94 33
+255 1  UNUSED
+256 40960 UNUSED
+
+BASESET
+"ISO Registration Number 159//CHARSET JIS X 0212-1990//ESC 2/4 2/8 4/4"
+
+DESCSET
+41216 33 UNUSED
+41249 94  8481
+41343  1 UNUSED
+41472 33 UNUSED
+41505 94  8737
+41599  1 UNUSED
+41728 33 UNUSED
+41761 94  8993
+41855  1 UNUSED
+41984 33 UNUSED
+42017 94  9249
+42111  1 UNUSED
+42240 33 UNUSED
+42273 94  9505
+42367  1 UNUSED
+42496 33 UNUSED
+42529 94  9761
+42623  1 UNUSED
+42752 33 UNUSED
+42785 94 10017
+42879  1 UNUSED
+43008 33 UNUSED
+43041 94 10273
+43135  1 UNUSED
+43264 33 UNUSED
+43297 94 10529
+43391  1 UNUSED
+43520 33 UNUSED
+43553 94 10785
+43647  1 UNUSED
+43776 33 UNUSED
+43809 94 11041
+43903  1 UNUSED
+44032 33 UNUSED
+44065 94 11297
+44159  1 UNUSED
+44288 33 UNUSED
+44321 94 11553
+44415  1 UNUSED
+44544 33 UNUSED
+44577 94 11809
+44671  1 UNUSED
+44800 33 UNUSED
+44833 94 12065
+44927  1 UNUSED
+45056 33 UNUSED
+45089 94 12321
+45183  1 UNUSED
+45312 33 UNUSED
+45345 94 12577
+45439  1 UNUSED
+45568 33 UNUSED
+45601 94 12833
+45695  1 UNUSED
+45824 33 UNUSED
+45857 94 13089
+45951  1 UNUSED
+46080 33 UNUSED
+46113 94 13345
+46207  1 UNUSED
+46336 33 UNUSED
+46369 94 13601
+46463  1 UNUSED
+46592 33 UNUSED
+46625 94 13857
+46719  1 UNUSED
+46848 33 UNUSED
+46881 94 14113
+46975  1 UNUSED
+47104 33 UNUSED
+47137 94 14369
+47231  1 UNUSED
+47360 33 UNUSED
+47393 94 14625
+47487  1 UNUSED
+47616 33 UNUSED
+47649 94 14881
+47743  1 UNUSED
+47872 33 UNUSED
+47905 94 15137
+47999  1 UNUSED
+48128 33 UNUSED
+48161 94 15393
+48255  1 UNUSED
+48384 33 UNUSED
+48417 94 15649
+48511  1 UNUSED
+48640 33 UNUSED
+48673 94 15905
+48767  1 UNUSED
+48896 33 UNUSED
+48929 94 16161
+49023  1 UNUSED
+49152 33 UNUSED
+49185 94 16417
+49279  1 UNUSED
+49408 33 UNUSED
+49441 94 16673
+49535  1 UNUSED
+49664 33 UNUSED
+49697 94 16929
+49791  1 UNUSED
+49920 33 UNUSED
+49953 94 17185
+50047  1 UNUSED
+50176 33 UNUSED
+50209 94 17441
+50303  1 UNUSED
+50432 33 UNUSED
+50465 94 17697
+50559  1 UNUSED
+50688 33 UNUSED
+50721 94 17953
+50815  1 UNUSED
+50944 33 UNUSED
+50977 94 18209
+51071  1 UNUSED
+51200 33 UNUSED
+51233 94 18465
+51327  1 UNUSED
+51456 33 UNUSED
+51489 94 18721
+51583  1 UNUSED
+51712 33 UNUSED
+51745 94 18977
+51839  1 UNUSED
+51968 33 UNUSED
+52001 94 19233
+52095  1 UNUSED
+52224 33 UNUSED
+52257 94 19489
+52351  1 UNUSED
+52480 33 UNUSED
+52513 94 19745
+52607  1 UNUSED
+52736 33 UNUSED
+52769 94 20001
+52863  1 UNUSED
+52992 33 UNUSED
+53025 94 20257
+53119  1 UNUSED
+53248 33 UNUSED
+53281 94 20513
+53375  1 UNUSED
+53504 33 UNUSED
+53537 94 20769
+53631  1 UNUSED
+53760 33 UNUSED
+53793 94 21025
+53887  1 UNUSED
+54016 33 UNUSED
+54049 94 21281
+54143  1 UNUSED
+54272 33 UNUSED
+54305 94 21537
+54399  1 UNUSED
+54528 33 UNUSED
+54561 94 21793
+54655  1 UNUSED
+54784 33 UNUSED
+54817 94 22049
+54911  1 UNUSED
+55040 33 UNUSED
+55073 94 22305
+55167  1 UNUSED
+55296 33 UNUSED
+55329 94 22561
+55423  1 UNUSED
+55552 33 UNUSED
+55585 94 22817
+55679  1 UNUSED
+55808 33 UNUSED
+55841 94 23073
+55935  1 UNUSED
+56064 33 UNUSED
+56097 94 23329
+56191  1 UNUSED
+56320 33 UNUSED
+56353 94 23585
+56447  1 UNUSED
+56576 33 UNUSED
+56609 94 23841
+56703  1 UNUSED
+56832 33 UNUSED
+56865 94 24097
+56959  1 UNUSED
+57088 33 UNUSED
+57121 94 24353
+57215  1 UNUSED
+57344 33 UNUSED
+57377 94 24609
+57471  1 UNUSED
+57600 33 UNUSED
+57633 94 24865
+57727  1 UNUSED
+57856 33 UNUSED
+57889 94 25121
+57983  1 UNUSED
+58112 33 UNUSED
+58145 94 25377
+58239  1 UNUSED
+58368 33 UNUSED
+58401 94 25633
+58495  1 UNUSED
+58624 33 UNUSED
+58657 94 25889
+58751  1 UNUSED
+58880 33 UNUSED
+58913 94 26145
+59007  1 UNUSED
+59136 33 UNUSED
+59169 94 26401
+59263  1 UNUSED
+59392 33 UNUSED
+59425 94 26657
+59519  1 UNUSED
+59648 33 UNUSED
+59681 94 26913
+59775  1 UNUSED
+59904 33 UNUSED
+59937 94 27169
+60031  1 UNUSED
+60160 33 UNUSED
+60193 94 27425
+60287  1 UNUSED
+60416 33 UNUSED
+60449 94 27681
+60543  1 UNUSED
+60672 33 UNUSED
+60705 94 27937
+60799  1 UNUSED
+60928 33 UNUSED
+60961 94 28193
+61055  1 UNUSED
+61184 33 UNUSED
+61217 94 28449
+61311  1 UNUSED
+61440 33 UNUSED
+61473 94 28705
+61567  1 UNUSED
+61696 33 UNUSED
+61729 94 28961
+61823  1 UNUSED
+61952 33 UNUSED
+61985 94 29217
+62079  1 UNUSED
+62208 33 UNUSED
+62241 94 29473
+62335  1 UNUSED
+62464 33 UNUSED
+62497 94 29729
+62591  1 UNUSED
+62720 33 UNUSED
+62753 94 29985
+62847  1 UNUSED
+62976 33 UNUSED
+63009 94 30241
+63103  1 UNUSED
+63232 33 UNUSED
+63265 94 30497
+63359  1 UNUSED
+63488 33 UNUSED
+63521 94 30753
+63615  1 UNUSED
+63744 33 UNUSED
+63777 94 31009
+63871  1 UNUSED
+64000 33 UNUSED
+64033 94 31265
+64127  1 UNUSED
+64256 33 UNUSED
+64289 94 31521
+64383  1 UNUSED
+64512 33 UNUSED
+64545 94 31777
+64639  1 UNUSED
+64768 33 UNUSED
+64801 94 32033
+64895  1 UNUSED
+65024 33 UNUSED
+65057 94 32289
+65151  1 UNUSED
+
+CAPACITY     PUBLIC "ISO 8879:1986//CAPACITY Reference//EN"
+SCOPE        DOCUMENT
+SYNTAX 
+SHUNCHAR CONTROLS 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
+         18 19 20 21 22 23 24 25 26 27 28 29 30 31 127 255
+BASESET "ISO 646-1983//CHARSET International Reference Version
+         (IRV)//ESC 2/5 4/0"
+DESCSET    0          128         0
+FUNCTION   RE                    13
+          RS                    10
+          SPACE                 32
+          TAB        SEPCHAR     9
+NAMING     LCNMSTRT   ""
+          UCNMSTRT   ""
+          LCNMCHAR   "-."
+          UCNMCHAR   "-."
+          NAMECASE   GENERAL    YES
+                     ENTITY     NO
+DELIM      GENERAL    SGMLREF
+          SHORTREF   SGMLREF
+NAMES      SGMLREF
+QUANTITY   SGMLREF
+FEATURES
+MINIMIZE   DATATAG   NO   OMITTAG    YES          RANK       NO    SHORTTAG YES
+LINK       SIMPLE    NO   IMPLICIT   NO           EXPLICIT   NO
+OTHER      CONCUR    NO   SUBDOC     YES 99999999 FORMAL     YES
+APPINFO    NONE>
diff --git a/msggen.pl b/msggen.pl
new file mode 100644 (file)
index 0000000..0c33968
--- /dev/null
+++ b/msggen.pl
@@ -0,0 +1,426 @@
+#! /usr/bin/perl
+# Copyright (c) 1994 James Clark, 2000 Matthias Clasen
+# Copyright (c) 2000 Peter Nilsson
+# See the file COPYING for copying permission.
+
+use POSIX;
+
+# Package and version.
+$package = 'openjade';
+$version = '1.3.2';
+$package = $package; $version = $version; # be quiet, -w
+
+$prog = $0;
+$prog =~ s@.*/@@;
+
+$gen_c = 0;
+
+undef $opt_l;
+undef $opt_p;
+undef $opt_t;
+do 'getopts.pl';
+&Getopts('l:p:t:');
+$module = $opt_l;
+$pot_file = $opt_p;
+
+if (defined($opt_t)) {
+  # don't try to read translations for English
+  $opt_t =~ /.*en.*/ || &read_po_translations($opt_t);
+}
+
+$num = 0; 
+
+foreach $def_file (@ARGV) {
+
+@tag_used = ();
+
+open(DEF, $def_file) || die "can't open \`$def_file': $!\n";
+
+while (<DEF>) {
+    chop;
+    if (/^!cxx$/) {
+       $gen_c = 1;
+       next;
+    }
+    if (/^=/) {
+        if (!defined($opt_p)) {
+           $n = substr($_, 1);
+           &error("= directive must increase message num") if ($n < $num);
+           $num = $n;
+        }
+       next;
+    }
+    if (/^-/) {
+       # a deleted message
+       $num++;
+       next;
+    }
+       
+    next if /^[        ]*#/;
+    next if /^[        ]*$/;
+    @field = split('\+', $_, 5);
+    &error("too few fields") if $#field < 3;
+    if ($#field == 4 && $field[4] =~ /^%J/) {
+       $field[3] .= '+';
+       $field[3] .= substr($field[4], 2);
+       $#field = 3;
+    }
+    if ($field[0] eq "") {
+       $type[$num] = "";
+       $argc = 0;
+    }
+    else {
+       $field[0] =~ /^[IWQXE][0-9]$/ || &error("invalid first field");;
+       $type[$num] = substr($field[0], 0, 1);
+       $argc = int(substr($field[0], 1, 1));
+    }
+    $nargs[$num] = $argc;
+    $field[1] =~ /^[a-zA-Z_][a-zA-Z0-9_]+$/ || &error("invalid tag");
+    $tag[$num] = $field[1];
+    &error("duplicate tag $field[1]") 
+      if (!defined($opt_p) && defined($tag_used{$field[1]}));
+    $tag_used{$field[1]} = 1;
+    $field[2] =~ /^((ISO(\/IEC)? [0-9]+:[0-9]+ )?(([A-Z]?[0-9]+(\.[0-9]+)*(p[0-9]+)?)|(\[[0-9]+(\.[0-9]*)?\]))( (ISO(\/IEC)? [0-9]+:[0-9]+ )?(([A-Z]?[0-9]+(\.[0-9]+)*(p[0-9]+)?)|(\[[0-9]+(\.[0-9]*)?\])))*)?$/
+       || &error("invalid clauses field");
+    # push @clauses, $field[2];
+    $clauses[$num] = $field[2];
+    if ($argc == 0) {
+       if ($field[0] ne "") {
+           $field[3] =~ /^([^%]|%%)*$/ || &error("invalid character after %");
+       }
+    }
+    else {
+       $field[3] =~ /^([^%]|%[%1-$argc])*$/ || &error("invalid character after %");
+    }
+    $auxloc[$num] = ($#field == 4 ? "L" : "");
+    $message[$num] = $field[3];
+    $num++;
+    if ($#field == 4) {
+       $message2[$num] = $field[4];
+       $num++;
+    }
+}
+
+close(DEF);
+
+if (!defined($opt_p)) {
+
+$file_base = $ARGV[0];
+$file_base =~ s/\.[^.]*$//;
+
+$class = $file_base;
+$class =~ s|.*[\\/]||;
+
+# this is needed on Windows NT
+chmod 0666, "$file_base.h";
+unlink("$file_base.h");
+open(OUT, ">$file_base.h");
+chmod 0444, "$file_base.h";
+select(OUT);
+
+print <<END;
+// This file was automatically generated from $def_file by $prog.
+END
+print <<END if $gen_c;
+#ifndef ${class}_INCLUDED
+#define ${class}_INCLUDED 1
+
+#ifdef __GNUG__
+#pragma interface
+#endif
+END
+
+print <<END;
+#include <OpenSP/Message.h>
+
+#ifdef SP_NAMESPACE
+namespace SP_NAMESPACE {
+#endif
+
+struct $class {
+END
+
+foreach $i (0 .. $#message) {
+    if (defined($message[$i])) {
+       print "  // $i\n";
+       print "  static const Message";
+       if ($type[$i] eq "") {
+           print "Fragment";
+       }
+       else {
+           print "Type$nargs[$i]$auxloc[$i]";
+       }
+       print " $tag[$i];\n";
+    }
+}
+print "};\n";
+
+
+print <<END if $gen_c;
+
+#ifdef SP_NAMESPACE
+}
+#endif
+
+#endif /* not ${class}_INCLUDED */
+END
+
+if ($gen_c) {
+    close(OUT);
+    # this is needed on Windows NT
+    chmod 0666, "$file_base.cxx";
+    unlink("$file_base.cxx");
+    open(OUT, ">$file_base.cxx");
+    chmod 0444, "$file_base.cxx";
+    select(OUT);
+
+    print <<END;
+// This file was automatically generated from $def_file by $prog.
+
+#ifdef __GNUG__
+#pragma implementation
+#endif
+
+#include "stylelib.h"
+#include "$class.h"
+
+#ifdef SP_NAMESPACE
+namespace SP_NAMESPACE {
+#endif
+
+END
+}
+
+if (defined($opt_l)) {
+    print "extern MessageModule $module;\n\n";
+}
+
+foreach $i (0 .. $#message) {
+    if (defined($message[$i])) {
+       if ($type[$i] eq "") {
+           print "const MessageFragment ${class}::$tag[$i](\n";
+       }
+       else {
+           print "const MessageType$nargs[$i]$auxloc[$i] ${class}::$tag[$i](\n";
+           print "MessageType::";
+           if ($type[$i] eq 'I') {
+               print 'info';
+           }
+           elsif ($type[$i] eq 'W') {
+               print 'warning';
+           }
+           elsif ($type[$i] eq 'Q') {
+               print 'quantityError';
+           }
+           elsif ($type[$i] eq 'X') {
+               print 'idrefError';
+           }
+           else {
+               print 'error';
+           }
+           print ",\n";
+       }
+       if (defined($opt_l)) {
+           print "&$module,\n";
+       } else {
+           print "0,\n";
+       }
+       print "$i\n";
+       print "#ifndef SP_NO_MESSAGE_TEXT\n";
+       $str = $message[$i];
+       $str =~ s|\\|\\\\|g;
+       $str =~ s|"|\\"|g;
+       printf ",\"%s\"", $str; 
+       if ($clauses[$i]) {
+         $str = $clauses[$i];
+         $str =~ s|\\|\\\\|g;
+         $str =~ s|"|\\"|g;
+         printf "\n,\"%s\"", $str; 
+        }
+       if ($auxloc[$i]) {
+            if ($clauses[$i] eq "") {
+              print "\n,0";
+            }
+           $str = $message2[$i + 1];
+           $str =~ s|\\|\\\\|g;
+           $str =~ s|"|\\"|g;
+           printf "\n,\"%s\"", $str;
+       }
+       print "\n#endif\n";
+       print ");\n";
+    }
+}
+print <<END;
+#ifdef SP_NAMESPACE
+}
+#endif
+END
+
+close(OUT);
+
+# this is needed on Windows NT
+chmod 0666, "$file_base.rc";
+unlink("$file_base.rc");
+open(OUT, ">$file_base.rc");
+chmod 0444, "$file_base.rc";
+select(OUT);
+
+print "STRINGTABLE\nBEGIN\n";
+
+foreach $i (0 .. $#message) {
+    if (defined($message[$i])) {
+       $str = $message[$i];
+       if ($translation{$str}) {
+           $str = $translation{$str};
+       }
+       $str =~ s/"/""/g;
+       printf "  %d, \"%s\"\n", $i, $str;
+    }
+    elsif (defined($message2[$i])) {
+       $str = $message2[$i];
+       $str =~ s/"/""/g;
+       printf "  %d, \"%s\"\n", $i, $str;
+    }
+}
+
+print "END\n";
+close(OUT);
+
+} # !opt_p
+
+} # foreach def_file
+
+if (defined($opt_p)) {
+
+  # this is needed for GNU gettext 
+  chmod 0666, "$pot_file";
+  unlink("$pot_file");
+  open(OUT, ">$pot_file");
+  chmod 0444, "$pot_file";
+  select(OUT);
+
+  $crdate = POSIX::strftime "%Y-%m-%d %H:%M+0000", gmtime;
+  print <<END;
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR HOLDER
+# FIRST AUTHOR <EMAIL\@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\\n"
+"POT-Creation-Date: $crdate\\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n"
+"Last-Translator: FULL NAME <EMAIL\@ADDRESS>\\n"
+"Language-Team: LANGUAGE <LL\@li.org>\\n"
+"MIME-Version:: 1.0\\n"
+"Content-Type: text/plain; charset=CHARSET\\n"
+"Content-Transfer-Encoding: ENCODING\\n"
+
+END
+
+  foreach $i (0 .. $#message) {
+    if (defined($message[$i]) && !defined($written{$message[$i]})) {
+       next if $message[$i] eq "";
+       $written{$message[$i]} = 1;
+       $str = $message[$i];
+       $str =~ s/"/\\"/g;
+       printf "msgid \"%s\"\nmsgstr \"\"\n\n", $str;
+    }
+    elsif (defined($message2[$i]) && ! defined($written{$message2[$i]})) {
+       $written{$message2[$i]} = 1;
+       $str = $message2[$i];
+       $str =~ s/"/\\"/g;
+       printf "msgid \"%s\"\nmsgstr \"\"\n\n", $str;
+    }
+ }
+}
+
+close(OUT);
+
+sub error {
+    die "$def_file:$.: $_[0]\n";
+}
+
+# Read a PO file with message translations.
+# This doesn't accept every valid PO file, but it seems to work reasonably.
+sub read_po_translations {
+    my $po_in = $_[0];
+    open(PO_IN, "<$po_in") || die "Can't open file $po_in.";
+    my $id = "";
+    my $str = "";
+    my $catching_string = 0;
+
+    while(<PO_IN>) {
+       if (/^\s*msgid/) {
+           if ($catching_string) {
+               &po_flush($id, $str);
+               $id = "";
+               $str = "";
+           }
+           $_ = $';
+           $catching_string = 1;
+       }
+       elsif (/^\s*msgstr/) {
+           die "No msgid." if !$catching_string or $id;
+           $id = $str;
+           $str = "";
+           $_ = $';
+       }
+       
+       if ($catching_string) {
+           my $in_string = 0;
+           s/\s*//;
+           while ($_) {
+               if (s/^\"//) {
+                   $in_string = !$in_string;
+               }
+               if ($in_string) {
+                   if (s/^[^\"\\]+//) {
+                       $str .= $&;
+                   }
+                   elsif (s/^\\([ntbrf\\\"])//) {
+                       $str .= "\n" if $1 eq "n";
+                       $str .= "\t" if $1 eq "t";
+                       $str .= "\b" if $1 eq "b";
+                       $str .= "\r" if $1 eq "r";
+                       $str .= "\f" if $1 eq "f";
+                       $str .= "\\" if $1 eq "\\";
+                       $str .= "\"" if $1 eq "\"";
+                   }
+                   elsif (s/\\([0-9]+)//) {
+                       $str .= chr(oct($1));
+                   }
+                   elsif (s/\\[xX]([0-9a-fA-F]+)//) {
+                       $str .= chr(hex($1));
+                   }
+                   else {
+                       die "Invalid control sequence." if /^\\/;
+                   }
+               }
+               else {
+                   s/\s*//;
+                   last if /^[^"]/;
+               }
+            }
+        }
+    }
+    if ($catching_string) {
+        &po_flush($id, $str);
+
+    }
+}
+
+sub po_flush {
+    my $id = $_[0];
+    my $str = $_[1];
+    # We use a translation only if $id is non-empty (we don't include the
+    # PO file header) and if $str is non-empty (the message is translated).
+    if ($id && $str) {
+       $translation{$id} = $str;
+    }
+    $id = "";
+    $str = "";
+}
+
+
diff --git a/openjade-1.3.2.tar.gz b/openjade-1.3.2.tar.gz
new file mode 100644 (file)
index 0000000..e8e67b7
Binary files /dev/null and b/openjade-1.3.2.tar.gz differ
diff --git a/pubtext/HTML32.dcl b/pubtext/HTML32.dcl
new file mode 100644 (file)
index 0000000..1eb482c
--- /dev/null
@@ -0,0 +1,80 @@
+<!SGML  "ISO 8879:1986"
+   --
+        SGML Declaration for HyperText Markup Language version 3.2
+
+        With support for ISO Latin-1 and increased limits
+        for tag and literal lengths etc.
+   --
+
+   CHARSET
+         BASESET  "ISO 646:1983//CHARSET
+                   International Reference Version
+                   (IRV)//ESC 2/5 4/0"
+         DESCSET  0   9   UNUSED
+                  9   2   9
+                  11  2   UNUSED
+                  13  1   13
+                  14  18  UNUSED
+                  32  95  32
+                  127 1   UNUSED
+         BASESET  "ISO Registration Number 100//CHARSET
+                   ECMA-94 Right Part of
+                   Latin Alphabet Nr. 1//ESC 2/13 4/1"
+         DESCSET  128  32   UNUSED
+                  160  96    32
+
+   CAPACITY   SGMLREF
+              TOTALCAP        200000
+              GRPCAP          150000
+              ENTCAP          150000
+
+   SCOPE    DOCUMENT
+   SYNTAX
+      SHUNCHAR CONTROLS 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
+              17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 127
+      BASESET  "ISO 646:1983//CHARSET
+                International Reference Version
+                (IRV)//ESC 2/5 4/0"
+      DESCSET  0 128 0
+
+      FUNCTION
+              RE            13
+              RS            10
+              SPACE         32
+              TAB SEPCHAR    9
+
+      NAMING   LCNMSTRT ""
+               UCNMSTRT ""
+               LCNMCHAR ".-"
+               UCNMCHAR ".-"
+               NAMECASE GENERAL YES
+                        ENTITY  NO
+      DELIM    GENERAL  SGMLREF
+               SHORTREF SGMLREF
+      NAMES    SGMLREF
+      QUANTITY SGMLREF
+               ATTSPLEN 65536
+               LITLEN   65536
+               NAMELEN  65536
+               PILEN    65536
+               TAGLVL   100
+               TAGLEN   65536
+               GRPGTCNT 150
+               GRPCNT   64
+
+   FEATURES
+     MINIMIZE
+       DATATAG  NO
+       OMITTAG  YES
+       RANK     NO
+       SHORTTAG YES
+     LINK
+       SIMPLE   NO
+       IMPLICIT NO
+       EXPLICIT NO
+     OTHER
+       CONCUR   NO
+       SUBDOC   NO
+       FORMAL   YES
+   APPINFO      NONE
+>
diff --git a/pubtext/HTML32.dtd b/pubtext/HTML32.dtd
new file mode 100644 (file)
index 0000000..eddba10
--- /dev/null
@@ -0,0 +1,597 @@
+<!--
+        W3C Document Type Definition for the HyperText Markup Language
+        version 3.2 as ratified by a vote of W3C member companies.
+        For more information on W3C look at  URL http://www.w3.org/
+
+        Date: Tuesday January 14th 1997
+
+        Author: Dave Raggett <dsr@w3.org>
+
+        HTML 3.2 aims to capture recommended practice as of early '96
+        and as such to be used as a replacement for HTML 2.0 (RFC 1866).
+        Widely deployed rendering attributes are included where they
+        have been shown to be interoperable. SCRIPT and STYLE are
+        included to smooth the introduction of client-side scripts
+        and style sheets. Browsers must avoid showing the contents
+        of these element Otherwise support for them is not required.
+        ID, CLASS and STYLE attributes are not included in this version
+        of HTML.
+-->
+
+<!ENTITY % HTML.Version
+        "-//W3C//DTD HTML 3.2 Final//EN"
+
+        -- Typical usage:
+
+            <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+            <html>
+            ...
+            </html>
+        --
+        >
+
+<!--================== Deprecated Features Switch =========================-->
+
+<!ENTITY % HTML.Deprecated "INCLUDE">
+
+<!--================== Imported Names =====================================-->
+
+<!ENTITY % Content-Type "CDATA"
+        -- meaning a MIME content type, as per RFC1521
+        -->
+
+<!ENTITY % HTTP-Method "GET | POST"
+        -- as per HTTP specification
+        -->
+
+<!ENTITY % URL "CDATA"
+        -- The term URL means a CDATA attribute
+           whose value is a Uniform Resource Locator,
+           See RFC1808 (June 95) and RFC1738 (Dec 94).
+        -->
+
+<!-- Parameter Entities -->
+
+<!ENTITY % head.misc "SCRIPT|STYLE|META|LINK" -- repeatable head elements -->
+
+<!ENTITY % heading "H1|H2|H3|H4|H5|H6">
+
+<!ENTITY % list "UL | OL |  DIR | MENU">
+
+<![ %HTML.Deprecated [
+    <!ENTITY % preformatted "PRE | XMP | LISTING">
+]]>
+
+<!ENTITY % preformatted "PRE">
+
+<!--================ Character mnemonic entities ==========================-->
+
+<!ENTITY % ISOlat1 PUBLIC
+       "ISO 8879-1986//ENTITIES Added Latin 1//EN//HTML">
+%ISOlat1;
+
+<!--================ Entities for special symbols =========================-->
+<!-- &trade and &cbsp are not widely deployed and so not included here -->
+
+<!ENTITY amp    CDATA "&#38;"   -- ampersand          -->
+<!ENTITY gt     CDATA "&#62;"   -- greater than       -->
+<!ENTITY lt     CDATA "&#60;"   -- less than          -->
+
+<!--=================== Text Markup =======================================-->
+
+<!ENTITY % font "TT | I | B  | U | STRIKE | BIG | SMALL | SUB | SUP">
+
+<!ENTITY % phrase "EM | STRONG | DFN | CODE | SAMP | KBD | VAR | CITE">
+
+<!ENTITY % special "A | IMG | APPLET | FONT | BASEFONT | BR | SCRIPT | MAP">
+
+<!ENTITY % form "INPUT | SELECT | TEXTAREA">
+
+<!ENTITY % text "#PCDATA | %font | %phrase | %special | %form">
+
+<!ELEMENT (%font|%phrase) - - (%text)*>
+
+<!-- there are also 16 widely known color names although
+  the resulting colors are implementation dependent:
+
+   aqua, black, blue, fuchsia, gray, green, lime, maroon,
+   navy, olive, purple, red, silver, teal, white, and yellow
+
+ These colors were originally picked as being the standard
+ 16 colors supported with the Windows VGA palette.
+ -->
+
+<!ELEMENT FONT - - (%text)*     -- local change to font -->
+<!ATTLIST FONT
+    size    CDATA   #IMPLIED    -- [+]nn e.g. size="+1", size=4 --
+    color   CDATA   #IMPLIED    -- #RRGGBB in hex, e.g. red: color="#FF0000" --
+    >
+
+<!ELEMENT BASEFONT - O EMPTY    -- base font size (1 to 7)-->
+<!ATTLIST BASEFONT
+    size    CDATA   #IMPLIED    -- e.g. size=3 --
+    >
+
+<!ELEMENT BR    - O EMPTY    -- forced line break -->
+<!ATTLIST BR
+        clear (left|all|right|none) none -- control of text flow --
+        >
+
+<!--================== HTML content models ================================-->
+<!--
+    HTML has three basic content models:
+
+        %text       character level elements and text strings
+        %flow       block-like elements e.g. paragraphs and lists
+        %bodytext   as %flow plus headers H1-H6 and ADDRESS
+-->
+
+<!ENTITY % block
+     "P | %list | %preformatted | DL | DIV | CENTER |
+      BLOCKQUOTE | FORM | ISINDEX | HR | TABLE">
+
+<!-- %flow is used for DD and LI -->
+
+<!ENTITY % flow "(%text | %block)*">
+
+<!--=================== Document Body =====================================-->
+
+<!ENTITY % body.content "(%heading | %text | %block | ADDRESS)*">
+
+<!ENTITY % color "CDATA" -- a color specification: #HHHHHH @@ details? -->
+
+<!ENTITY % body-color-attrs "
+        bgcolor %color #IMPLIED
+        text %color #IMPLIED
+        link %color #IMPLIED
+        vlink %color #IMPLIED
+        alink %color #IMPLIED
+        ">
+
+<!ELEMENT BODY O O  %body.content>
+<!ATTLIST BODY
+        background %URL #IMPLIED  -- texture tile for document background --
+        %body-color-attrs;  -- bgcolor, text, link, vlink, alink --
+        >
+
+<!ENTITY % address.content "((%text;) | P)*">
+
+<!ELEMENT ADDRESS - - %address.content>
+
+<!ELEMENT DIV - - %body.content>
+<!ATTLIST DIV
+        align   (left|center|right) #IMPLIED -- alignment of following text --
+        >
+
+<!-- CENTER is a shorthand for DIV with ALIGN=CENTER -->
+<!ELEMENT center - - %body.content>
+
+<!--================== The Anchor Element =================================-->
+
+<!ELEMENT A - - (%text)* -(A)>
+<!ATTLIST A
+        name    CDATA   #IMPLIED    -- named link end --
+        href    %URL    #IMPLIED    -- URL for linked resource --
+        rel     CDATA   #IMPLIED    -- forward link types --
+        rev     CDATA   #IMPLIED    -- reverse link types --
+        title   CDATA   #IMPLIED    -- advisory title string --
+        >
+
+<!--================== Client-side image maps ============================-->
+
+<!-- These can be placed in the same document or grouped in a
+     separate document although this isn't yet widely supported -->
+
+<!ENTITY % SHAPE "(rect|circle|poly)">
+<!ENTITY % COORDS "CDATA" -- comma separated list of numbers -->
+
+<!ELEMENT MAP - - (AREA)*>
+<!ATTLIST MAP
+    name    CDATA   #IMPLIED
+    >
+
+<!ELEMENT AREA - O EMPTY>
+<!ATTLIST AREA
+    shape   %SHAPE  rect
+    coords  %COORDS #IMPLIED  -- defines coordinates for shape --
+    href    %URL    #IMPLIED  -- this region acts as hypertext link --
+    nohref (nohref) #IMPLIED  -- this region has no action --
+    alt     CDATA   #REQUIRED -- needed for non-graphical user agents --
+    >
+
+<!--================== The LINK Element ==================================-->
+
+<!ENTITY % Types "CDATA"
+        -- See Internet Draft: draft-ietf-html-relrev-00.txt
+           LINK has been part of HTML since the early days
+           although few browsers as yet take advantage of it.
+
+           Relationship values can be used in principle:
+
+                a) for document specific toolbars/menus when used
+                   with the LINK element in the document head:
+                b) to link to a separate style sheet
+                c) to make a link to a script
+                d) by stylesheets to control how collections of
+                   html nodes are rendered into printed documents
+                e) to make a link to a printable version of this document
+                   e.g. a postscript or pdf version
+-->
+
+<!ELEMENT LINK - O EMPTY>
+<!ATTLIST LINK
+        href    %URL    #IMPLIED    -- URL for linked resource --
+        rel     %Types  #IMPLIED    -- forward link types --
+        rev     %Types  #IMPLIED    -- reverse link types --
+        title   CDATA   #IMPLIED    -- advisory title string --
+        >
+
+<!--=================== Images ============================================-->
+
+<!ENTITY % Length "CDATA"   -- nn for pixels or nn% for percentage length -->
+<!ENTITY % Pixels "NUMBER"  -- integer representing length in pixels -->
+
+<!-- Suggested widths are used for negotiating image size
+     with the module responsible for painting the image.
+     align=left or right cause image to float to margin
+     and for subsequent text to wrap around image -->
+
+<!ENTITY % IAlign "(top|middle|bottom|left|right)">
+
+<!ELEMENT IMG    - O EMPTY --  Embedded image -->
+<!ATTLIST IMG
+        src     %URL     #REQUIRED  -- URL of image to embed --
+        alt     CDATA    #IMPLIED   -- for display in place of image --
+        align   %IAlign  #IMPLIED   -- vertical or horizontal alignment --
+        height  %Pixels  #IMPLIED   -- suggested height in pixels --
+        width   %Pixels  #IMPLIED   -- suggested width in pixels --
+        border  %Pixels  #IMPLIED   -- suggested link border width --
+        hspace  %Pixels  #IMPLIED   -- suggested horizontal gutter --
+        vspace  %Pixels  #IMPLIED   -- suggested vertical gutter --
+        usemap  %URL     #IMPLIED   -- use client-side image map --
+        ismap   (ismap)  #IMPLIED   -- use server image map --
+        >
+
+<!-- USEMAP points to a MAP element which may be in this document
+  or an external document, although the latter is not widely supported -->
+
+<!--=================== Java APPLET tag ===================================-->
+<!--
+  This tag is supported by all Java enabled browsers. Applet resources
+  (including their classes) are normally loaded relative to the document
+  URL (or <BASE> element if it is defined). The CODEBASE attribute is used
+  to change this default behavior. If the CODEBASE attribute is defined then
+  it specifies a different location to find applet resources. The value
+  can be an absolute URL or a relative URL. The absolute URL is used as is
+  without modification and is not effected by the documents <BASE> element.
+  When the codebase attribute is relative, then it is relative to the
+  document URL (or <BASE> tag if defined).
+-->
+<!ELEMENT APPLET - - (PARAM | %text)*>
+<!ATTLIST APPLET
+        codebase %URL     #IMPLIED   -- code base --
+        code     CDATA    #REQUIRED  -- class file --
+        alt      CDATA    #IMPLIED   -- for display in place of applet --
+        name     CDATA    #IMPLIED   -- applet name --
+        width    %Pixels  #REQUIRED  -- suggested width in pixels --
+        height   %Pixels  #REQUIRED  -- suggested height in pixels --
+        align    %IAlign  #IMPLIED   -- vertical or horizontal alignment --
+        hspace   %Pixels  #IMPLIED   -- suggested horizontal gutter --
+        vspace   %Pixels  #IMPLIED   -- suggested vertical gutter --
+        >
+
+<!ELEMENT PARAM - O EMPTY>
+<!ATTLIST PARAM
+        name    NMTOKEN   #REQUIRED  -- The name of the parameter --
+        value   CDATA     #IMPLIED   -- The value of the parameter --
+        >
+
+<!--
+Here is an example:
+
+    <applet codebase="applets/NervousText"
+        code=NervousText.class
+        width=300
+        height=50>
+    <param name=text value="Java is Cool!">
+    <img src=sorry.gif alt="This looks better with Java support">
+    </applet>
+-->
+
+<!--=================== Horizontal Rule ===================================-->
+
+<!ELEMENT HR    - O EMPTY>
+<!ATTLIST HR
+        align (left|right|center) #IMPLIED
+        noshade (noshade) #IMPLIED
+        size  %Pixels #IMPLIED
+        width %Length #IMPLIED
+        >
+<!--=================== Paragraphs=========================================-->
+
+<!ELEMENT P     - O (%text)*>
+<!ATTLIST P
+        align  (left|center|right) #IMPLIED
+        >
+
+<!--=================== Headings ==========================================-->
+
+<!--
+  There are six levels of headers from H1 (the most important)
+  to H6 (the least important).
+-->
+
+<!ELEMENT ( %heading )  - -  (%text;)*>
+<!ATTLIST ( %heading )
+        align  (left|center|right) #IMPLIED
+        >
+
+<!--=================== Preformatted Text =================================-->
+
+<!-- excludes images and changes in font size -->
+
+<!ENTITY % pre.exclusion "IMG|BIG|SMALL|SUB|SUP|FONT">
+
+<!ELEMENT PRE - - (%text)* -(%pre.exclusion)>
+<!ATTLIST PRE
+        width NUMBER #implied -- is this widely supported? --
+        >
+
+<![ %HTML.Deprecated [
+
+<!ENTITY % literal "CDATA"
+        -- historical, non-conforming parsing mode where
+           the only markup signal is the end tag
+           in full
+        -->
+
+<!ELEMENT (XMP|LISTING) - -  %literal>
+<!ELEMENT PLAINTEXT - O %literal>
+
+]]>
+
+<!--=================== Block-like Quotes =================================-->
+
+<!ELEMENT BLOCKQUOTE - - %body.content>
+
+<!--=================== Lists =============================================-->
+
+<!--
+    HTML 3.2 allows you to control the sequence number for ordered lists.
+    You can set the sequence number with the START and VALUE attributes.
+    The TYPE attribute may be used to specify the rendering of ordered
+    and unordered lists.
+-->
+
+<!-- definition lists - DT for term, DD for its definition -->
+
+<!ELEMENT DL    - -  (DT|DD)+>
+<!ATTLIST DL
+        compact (compact) #IMPLIED -- more compact style --
+        >
+
+<!ELEMENT DT - O  (%text)*>
+<!ELEMENT DD - O  %flow;>
+
+<!-- Ordered lists OL, and unordered lists UL -->
+<!ELEMENT (OL|UL) - -  (LI)+>
+
+<!--
+       Numbering style
+    1   arablic numbers     1, 2, 3, ...
+    a   lower alpha         a, b, c, ...
+    A   upper alpha         A, B, C, ...
+    i   lower roman         i, ii, iii, ...
+    I   upper roman         I, II, III, ...
+
+    The style is applied to the sequence number which by default
+    is reset to 1 for the first list item in an ordered list.
+
+    This can't be expressed directly in SGML due to case folding.
+-->
+
+<!ENTITY % OLStyle "CDATA" -- constrained to: [1|a|A|i|I] -->
+
+<!ATTLIST OL -- ordered lists --
+        type      %OLStyle   #IMPLIED   -- numbering style --
+        start     NUMBER     #IMPLIED   -- starting sequence number --
+        compact  (compact)   #IMPLIED   -- reduced interitem spacing --
+        >
+
+<!-- bullet styles -->
+
+<!ENTITY % ULStyle "disc|square|circle">
+
+<!ATTLIST UL -- unordered lists --
+        type    (%ULStyle)   #IMPLIED   -- bullet style --
+        compact (compact)    #IMPLIED   -- reduced interitem spacing --
+        >
+
+<!ELEMENT (DIR|MENU) - -  (LI)+ -(%block)>
+<!ATTLIST DIR
+        compact (compact) #IMPLIED
+        >
+<!ATTLIST MENU
+        compact (compact) #IMPLIED
+        >
+
+<!-- <DIR>              Directory list                  -->
+<!-- <DIR COMPACT>      Compact list style              -->
+<!-- <MENU>             Menu list                       -->
+<!-- <MENU COMPACT>     Compact list style              -->
+
+<!-- The type attribute can be used to change the bullet style
+     in unordered lists and the numbering style in ordered lists -->
+
+<!ENTITY % LIStyle "CDATA" -- constrained to: "(%ULStyle|%OLStyle)" -->
+
+<!ELEMENT LI - O %flow -- list item -->
+<!ATTLIST LI
+        type    %LIStyle     #IMPLIED   -- list item style --
+        value    NUMBER      #IMPLIED   -- reset sequence number --
+        >
+
+<!--================ Forms ===============================================-->
+
+<!ELEMENT FORM - - %body.content -(FORM)>
+<!ATTLIST FORM
+        action %URL #IMPLIED  -- server-side form handler --
+        method (%HTTP-Method) GET -- see HTTP specification --
+        enctype %Content-Type; "application/x-www-form-urlencoded"
+        >
+
+<!ENTITY % InputType
+        "(TEXT | PASSWORD | CHECKBOX | RADIO | SUBMIT
+            | RESET | FILE | HIDDEN | IMAGE)">
+
+<!ELEMENT INPUT - O EMPTY>
+<!ATTLIST INPUT
+        type %InputType TEXT     -- what kind of widget is needed --
+        name  CDATA #IMPLIED     -- required for all but submit and reset --
+        value CDATA #IMPLIED     -- required for radio and checkboxes --
+        checked (checked) #IMPLIED -- for radio buttons and check boxes --
+        size CDATA  #IMPLIED     -- specific to each type of field --
+        maxlength NUMBER #IMPLIED
+        src   %URL  #IMPLIED     -- for fields with background images --
+        align  (top|middle|bottom|left|right) top -- image alignment --
+        >
+
+<!ELEMENT SELECT - - (OPTION+)>
+<!ATTLIST SELECT
+        name CDATA #REQUIRED
+        size NUMBER #IMPLIED
+        multiple (multiple) #IMPLIED
+        >
+
+<!ELEMENT OPTION - O (#PCDATA)*>
+<!ATTLIST OPTION
+        selected (selected) #IMPLIED
+        value  CDATA  #IMPLIED -- defaults to element content --
+        >
+
+<!-- Multi-line text input field. -->
+
+<!ELEMENT TEXTAREA - - (#PCDATA)*>
+<!ATTLIST TEXTAREA
+        name CDATA #REQUIRED
+        rows NUMBER #REQUIRED
+        cols NUMBER #REQUIRED
+        >
+
+<!--======================= Tables ========================================-->
+
+<!-- Widely deployed subset of the full table standard, see RFC 1942
+     e.g. at http://www.ics.uci.edu/pub/ietf/html/rfc1942.txt -->
+
+<!-- horizontal placement of table relative to window -->
+<!ENTITY % Where "(left|center|right)">
+
+<!-- horizontal alignment attributes for cell contents -->
+<!ENTITY % cell.halign
+        "align  (left|center|right) #IMPLIED"
+        >
+
+<!-- vertical alignment attributes for cell contents -->
+<!ENTITY % cell.valign
+        "valign  (top|middle|bottom)  #IMPLIED"
+        >
+
+<!ELEMENT table - - (caption?, tr+)>
+<!ELEMENT tr - O (th|td)*>
+<!ELEMENT (th|td) - O %body.content>
+
+<!ATTLIST table                       -- table element --
+        align     %Where;   #IMPLIED  -- table position relative to window --
+        width     %Length   #IMPLIED  -- table width relative to window --
+        border    %Pixels   #IMPLIED  -- controls frame width around table --
+        cellspacing %Pixels #IMPLIED  -- spacing between cells --
+        cellpadding %Pixels #IMPLIED  -- spacing within cells --
+        >
+
+<!ELEMENT CAPTION - - (%text;)* -- table or figure caption -->
+<!ATTLIST CAPTION
+        align (top|bottom) #IMPLIED
+        >
+
+<!ATTLIST tr                       -- table row --
+        %cell.halign;              -- horizontal alignment in cells --
+        %cell.valign;              -- vertical alignment in cells --
+        >
+
+<!ATTLIST (th|td)                  -- header or data cell --
+        nowrap (nowrap)  #IMPLIED  -- suppress word wrap --
+        rowspan NUMBER   1         -- number of rows spanned by cell --
+        colspan NUMBER   1         -- number of cols spanned by cell --
+        %cell.halign;              -- horizontal alignment in cell --
+        %cell.valign;              -- vertical alignment in cell --
+        width   %Pixels  #IMPLIED  -- suggested width for cell --
+        height  %Pixels  #IMPLIED  -- suggested height for cell --
+        >
+
+<!--================ Document Head ========================================-->
+
+<!-- %head.misc defined earlier on as "SCRIPT|STYLE|META|LINK" -->
+
+<!ENTITY % head.content "TITLE & ISINDEX? & BASE?">
+
+<!ELEMENT HEAD O O  (%head.content) +(%head.misc)>
+
+<!ELEMENT TITLE - -  (#PCDATA)* -(%head.misc)
+          -- The TITLE element is not considered part of the flow of text.
+             It should be displayed, for example as the page header or
+             window title.
+          -->
+
+<!ELEMENT ISINDEX - O EMPTY>
+<!ATTLIST ISINDEX
+        prompt CDATA #IMPLIED -- prompt message -->
+
+<!--
+    The BASE element gives an absolute URL for dereferencing relative
+    URLs, e.g.
+
+         <BASE href="http://foo.com/index.html">
+         ...
+         <IMG SRC="images/bar.gif">
+
+    The image is deferenced to
+
+         http://foo.com/images/bar.gif
+
+   In the absence of a BASE element the document URL should be used.
+   Note that this is not necessarily the same as the URL used to
+   request the document, as the base URL may be overridden by an HTTP
+   header accompanying the document.
+-->
+
+<!ELEMENT BASE - O EMPTY>
+<!ATTLIST BASE
+        href %URL  #REQUIRED
+        >
+
+<!ELEMENT META - O EMPTY -- Generic Metainformation -->
+<!ATTLIST META
+        http-equiv  NAME    #IMPLIED  -- HTTP response header name  --
+        name        NAME    #IMPLIED  -- metainformation name       --
+        content     CDATA   #REQUIRED -- associated information     --
+        >
+
+<!-- SCRIPT/STYLE are place holders for transition to next version of HTML -->
+
+<!ELEMENT STYLE  - - (#PCDATA)*  -(%head.misc) -- style info -->
+<!ELEMENT SCRIPT - - (#PCDATA)*  -(%head.misc) -- script statements -->
+
+<!--================ Document Structure ===================================-->
+
+<!ENTITY % version.attr "VERSION CDATA #FIXED '%HTML.Version;'">
+
+<![ %HTML.Deprecated [
+    <!ENTITY % html.content "HEAD, BODY, PLAINTEXT?">
+]]>
+
+<!ENTITY % html.content "HEAD, BODY">
+
+<!ELEMENT HTML O O  (%html.content)>
+<!ATTLIST HTML
+        %version.attr;
+        >
diff --git a/pubtext/HTML32.soc b/pubtext/HTML32.soc
new file mode 100644 (file)
index 0000000..e87c3eb
--- /dev/null
@@ -0,0 +1,8 @@
+-- html32.soc: catalog for parsing HTML 3.2 documents --
+SGMLDECL "HTML32.dcl"
+PUBLIC "-//W3C//DTD HTML 3.2 Final//EN" HTML32.dtd
+PUBLIC "-//W3C//DTD HTML 3.2 Draft//EN" HTML32.dtd
+PUBLIC "-//W3C//DTD HTML 3.2//EN" HTML32.dtd
+PUBLIC "ISO 8879-1986//ENTITIES Added Latin 1//EN//HTML" ISOlat1.ent
+-- added by jjc --
+DOCTYPE html HTML32.dtd
diff --git a/pubtext/HTML4-f.dtd b/pubtext/HTML4-f.dtd
new file mode 100644 (file)
index 0000000..9552012
--- /dev/null
@@ -0,0 +1,37 @@
+<!--
+    This is the HTML 4.0 Frameset DTD, which should be
+    used for documents with frames. This DTD is identical
+    to the HTML 4.0 Transitional DTD except for the
+    content model of the "HTML" element: in frameset 
+    documents, the "FRAMESET" element replaces the "BODY" 
+    element.
+
+          Draft: $Date: 1999/05/02 15:37:15 $
+
+          Authors:
+              Dave Raggett <dsr@w3.org>
+              Arnaud Le Hors <lehors@w3.org>
+              Ian Jacobs <ij@w3.org>
+
+    Further information about HTML 4.0 is available at:
+
+          http://www.w3.org/TR/REC-html40.
+-->
+<!ENTITY % HTML.Version "-//W3C//DTD HTML 4.0 Frameset//EN"
+  -- Typical usage:
+
+    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN"
+            "http://www.w3.org/TR/REC-html40/frameset.dtd">
+    <html>
+    <head>
+    ...
+    </head>
+    <frameset>
+    ...
+    </frameset>
+    </html>
+-->
+
+<!ENTITY % HTML.Frameset "INCLUDE">
+<!ENTITY % HTML4.dtd PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+%HTML4.dtd;
\ No newline at end of file
diff --git a/pubtext/HTML4-s.dtd b/pubtext/HTML4-s.dtd
new file mode 100644 (file)
index 0000000..8ce7917
--- /dev/null
@@ -0,0 +1,869 @@
+<!--
+    This is HTML 4.0 Strict DTD, which excludes the presentation 
+    attributes and elements that W3C expects to phase out as 
+    support for style sheets matures. Authors should use the Strict
+    DTD when possible, but may use the Transitional DTD when support
+    for presentation attribute and elements is required.
+    
+    HTML 4.0 includes mechanisms for style sheets, scripting,
+    embedding objects, improved support for right to left and mixed
+    direction text, and enhancements to forms for improved
+    accessibility for people with disabilities.
+
+          Draft: $Date: 1999/05/02 15:37:15 $
+
+          Authors:
+              Dave Raggett <dsr@w3.org>
+              Arnaud Le Hors <lehors@w3.org>
+              Ian Jacobs <ij@w3.org>
+
+    Further information about HTML 4.0 is available at:
+
+        http://www.w3.org/TR/REC-html40
+-->
+<!--
+    Typical usage:
+
+    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"
+            "http://www.w3.org/TR/REC-html40/strict.dtd">
+    <html>
+    <head>
+    ...
+    </head>
+    <body>
+    ...
+    </body>
+    </html>
+
+    The URI used as a system identifier with the public identifier allows
+    the user agent to download the DTD and entity sets as needed.
+
+    The FPI for the Transitional HTML 4.0 DTD is:
+
+        "-//W3C//DTD HTML 4.0 Transitional//EN
+
+    and its URI is:
+
+        http://www.w3.org/TR/REC-html40/loose.dtd
+
+    If you are writing a document that includes frames, use 
+    the following FPI:
+
+        "-//W3C//DTD HTML 4.0 Frameset//EN"
+
+    with the URI:
+
+        http://www.w3.org/TR/REC-html40/frameset.dtd
+
+    The following URIs are supported in relation to HTML 4.0
+
+    "http://www.w3.org/TR/REC-html40/strict.dtd" (Strict DTD)
+    "http://www.w3.org/TR/REC-html40/loose.dtd" (Loose DTD)
+    "http://www.w3.org/TR/REC-html40/frameset.dtd" (Frameset DTD)
+    "http://www.w3.org/TR/REC-html40/HTMLlat1.ent" (Latin-1 entities)
+    "http://www.w3.org/TR/REC-html40/HTMLsymbol.ent" (Symbol entities)
+    "http://www.w3.org/TR/REC-html40/HTMLspecial.ent" (Special entities)
+
+    These URIs point to the latest version of each file. To reference
+    this specific revision use the following URIs:
+
+    "http://www.w3.org/TR/REC-html40-971218/strict.dtd"
+    "http://www.w3.org/TR/REC-html40-971218/loose.dtd"
+    "http://www.w3.org/TR/REC-html40-971218/frameset.dtd"
+    "http://www.w3.org/TR/REC-html40-971218/HTMLlat1.ent"
+    "http://www.w3.org/TR/REC-html40-971218/HTMLsymbol.ent"
+    "http://www.w3.org/TR/REC-html40-971218/HTMLspecial.ent"
+
+-->
+
+<!--================== Imported Names ====================================-->
+
+<!ENTITY % ContentType "CDATA"
+    -- media type, as per [RFC2045]
+    -->
+
+<!ENTITY % ContentTypes "CDATA"
+    -- comma-separated list of media types, as per [RFC2045]
+    -->
+
+<!ENTITY % Charset "CDATA"
+    -- a character encoding, as per [RFC2045]
+    -->
+
+<!ENTITY % Charsets "CDATA"
+    -- a space separated list of character encodings, as per [RFC2045]
+    -->
+
+<!ENTITY % LanguageCode "NAME"
+    -- a language code, as per [RFC1766]
+    -->
+
+<!ENTITY % Character "CDATA"
+    -- a single character from [ISO10646] 
+    -->
+
+<!ENTITY % LinkTypes "CDATA"
+    -- space-separated list of link types
+    -->
+
+<!ENTITY % MediaDesc "CDATA"
+    -- single or comma-separated list of media descriptors
+    -->
+
+<!ENTITY % URI "CDATA"
+    -- a Uniform Resource Identifier,
+       see [URI]
+    -->
+
+<!ENTITY % Datetime "CDATA" -- date and time information. ISO date format -->
+
+
+<!ENTITY % Script "CDATA" -- script expression -->
+
+<!ENTITY % StyleSheet "CDATA" -- style sheet data -->
+
+
+
+<!ENTITY % Text "CDATA">
+
+
+<!-- Parameter Entities -->
+
+<!ENTITY % head.misc "SCRIPT|STYLE|META|LINK|OBJECT" -- repeatable head elements -->
+
+<!ENTITY % heading "H1|H2|H3|H4|H5|H6">
+
+<!ENTITY % list "UL | OL">
+
+<!ENTITY % preformatted "PRE">
+
+
+<!--================ Character mnemonic entities =========================-->
+
+<!ENTITY % HTMLlat1 PUBLIC
+   "-//W3C//ENTITIES Latin1//EN//HTML"
+   "http://www.w3.org/TR/REC-html40-971218/HTMLlat1.ent">
+%HTMLlat1;
+
+<!ENTITY % HTMLsymbol PUBLIC
+   "-//W3C//ENTITIES Symbols//EN//HTML"
+   "http://www.w3.org/TR/REC-html40-971218/HTMLsymbol.ent">
+%HTMLsymbol;
+
+<!ENTITY % HTMLspecial PUBLIC
+   "-//W3C//ENTITIES Special//EN//HTML"
+   "http://www.w3.org/TR/REC-html40-971218/HTMLspecial.ent">
+%HTMLspecial;
+<!--=================== Generic Attributes ===============================-->
+
+<!ENTITY % coreattrs
+ "id          ID             #IMPLIED  -- document-wide unique id --
+  class       CDATA          #IMPLIED  -- space separated list of classes --
+  style       %StyleSheet;   #IMPLIED  -- associated style info --
+  title       %Text;         #IMPLIED  -- advisory title/amplification --"
+  >
+
+<!ENTITY % i18n
+ "lang        %LanguageCode; #IMPLIED  -- language code --
+  dir         (ltr|rtl)      #IMPLIED  -- direction for weak/neutral text --"
+  >
+
+<!ENTITY % events
+ "onclick     %Script;       #IMPLIED  -- a pointer button was clicked --
+  ondblclick  %Script;       #IMPLIED  -- a pointer button was double clicked--
+  onmousedown %Script;       #IMPLIED  -- a pointer button was pressed down --
+  onmouseup   %Script;       #IMPLIED  -- a pointer button was released --
+  onmouseover %Script;       #IMPLIED  -- a pointer was moved onto --
+  onmousemove %Script;       #IMPLIED  -- a pointer was moved within --
+  onmouseout  %Script;       #IMPLIED  -- a pointer was moved away --
+  onkeypress  %Script;       #IMPLIED  -- a key was pressed and released --
+  onkeydown   %Script;       #IMPLIED  -- a key was pressed down --
+  onkeyup     %Script;       #IMPLIED  -- a key was released --"
+  >
+
+<!-- Reserved Feature Switch -->
+<!ENTITY % HTML.Reserved "IGNORE">
+
+<!-- The following attributes are reserved for possible future use -->
+<![ %HTML.Reserved; [
+<!ENTITY % reserved
+ "datasrc     %URI;          #IMPLIED  -- a single or tabular Data Source --
+  datafld     CDATA          #IMPLIED  -- the property or column name --
+  dataformatas (plaintext|html) plaintext -- text or html --"
+  >
+]]>
+
+<!ENTITY % reserved "">
+
+<!ENTITY % attrs "%coreattrs; %i18n; %events;">
+
+
+<!--=================== Text Markup ======================================-->
+
+<!ENTITY % fontstyle
+ "TT | I | B | BIG | SMALL">
+
+<!ENTITY % phrase "EM | STRONG | DFN | CODE |
+                   SAMP | KBD | VAR | CITE | ABBR | ACRONYM" >
+
+<!ENTITY % special
+   "A | IMG | OBJECT | BR | SCRIPT | MAP | Q | SUB | SUP | SPAN | BDO">
+
+<!ENTITY % formctrl "INPUT | SELECT | TEXTAREA | LABEL | BUTTON">
+
+<!-- %inline; covers inline or "text-level" elements -->
+<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">
+
+<!ELEMENT (%fontstyle;|%phrase;) - - (%inline;)*>
+<!ATTLIST (%fontstyle;|%phrase;)
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!ELEMENT (SUB|SUP) - - (%inline;)*    -- subscript, superscript -->
+<!ATTLIST (SUB|SUP)
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!ELEMENT SPAN - - (%inline;)*         -- generic language/style container -->
+<!ATTLIST SPAN
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  %reserved;                          -- reserved for possible future use --
+  >
+
+<!ELEMENT BDO - - (%inline;)*          -- I18N BiDi over-ride -->
+<!ATTLIST BDO
+  %coreattrs;                          -- id, class, style, title --
+  lang        %LanguageCode; #IMPLIED  -- language code --
+  dir         (ltr|rtl)      #REQUIRED -- directionality --
+  >
+
+
+<!ELEMENT BR - O EMPTY                 -- forced line break -->
+<!ATTLIST BR
+  %coreattrs;                          -- id, class, style, title --
+  >
+
+<!--================== HTML content models ===============================-->
+
+<!--
+    HTML has two basic content models:
+
+        %inline;     character level elements and text strings
+        %block;      block-like elements e.g. paragraphs and lists
+-->
+
+<!ENTITY % block
+     "P | %heading; | %list; | %preformatted; | DL | DIV | NOSCRIPT |
+      BLOCKQUOTE | FORM | HR | TABLE | FIELDSET | ADDRESS">
+
+<!ENTITY % flow "%block; | %inline;">
+
+<!--=================== Document Body ====================================-->
+
+<!ELEMENT BODY O O (%block;|SCRIPT)+ +(INS|DEL) -- document body -->
+<!ATTLIST BODY
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  onload          %Script;   #IMPLIED  -- the document has been loaded --
+  onunload        %Script;   #IMPLIED  -- the document has been removed --
+  >
+
+<!ELEMENT ADDRESS - - (%inline;)* -- information on author -->
+<!ATTLIST ADDRESS
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!ELEMENT DIV - - (%flow;)*            -- generic language/style container -->
+<!ATTLIST DIV
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  %reserved;                           -- reserved for possible future use --
+  >
+
+
+<!--================== The Anchor Element ================================-->
+
+<!ENTITY % Shape "(rect|circle|poly|default)">
+<!ENTITY % Coords "CDATA" -- comma separated list of lengths -->
+
+<!ELEMENT A - - (%inline;)* -(A)       -- anchor -->
+<!ATTLIST A
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  charset     %Charset;      #IMPLIED  -- char encoding of linked resource --
+  type        %ContentType;  #IMPLIED  -- advisory content type --
+  name        CDATA          #IMPLIED  -- named link end --
+  href        %URI;          #IMPLIED  -- URI for linked resource --
+  hreflang    %LanguageCode; #IMPLIED  -- language code --
+  rel         %LinkTypes;    #IMPLIED  -- forward link types --
+  rev         %LinkTypes;    #IMPLIED  -- reverse link types --
+  accesskey   %Character;    #IMPLIED  -- accessibility key character --
+  shape       %Shape;        rect      -- for use with client-side image maps --
+  coords      %Coords;       #IMPLIED  -- for use with client-side image maps --
+  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
+  onfocus     %Script;       #IMPLIED  -- the element got the focus --
+  onblur      %Script;       #IMPLIED  -- the element lost the focus --
+  >
+
+<!--================== Client-side image maps ============================-->
+
+<!-- These can be placed in the same document or grouped in a
+     separate document although this isn't yet widely supported -->
+
+<!ELEMENT MAP - - ((%block;)+ | AREA+) -- client-side image map -->
+<!ATTLIST MAP
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  name        CDATA          #REQUIRED -- for reference by usemap --
+  >
+
+<!ELEMENT AREA - O EMPTY               -- client-side image map area -->
+<!ATTLIST AREA
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  shape       %Shape;        rect      -- controls interpretation of coords --
+  coords      %Coords;       #IMPLIED  -- comma separated list of lengths --
+  href        %URI;          #IMPLIED  -- URI for linked resource --
+  nohref      (nohref)       #IMPLIED  -- this region has no action --
+  alt         %Text;         #REQUIRED -- short description --
+  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
+  accesskey   %Character;    #IMPLIED  -- accessibility key character --
+  onfocus     %Script;       #IMPLIED  -- the element got the focus --
+  onblur      %Script;       #IMPLIED  -- the element lost the focus --
+  >
+
+<!--================== The LINK Element ==================================-->
+
+<!--
+  Relationship values can be used in principle:
+
+   a) for document specific toolbars/menus when used
+      with the LINK element in document head e.g.
+        start, contents, previous, next, index, end, help
+   b) to link to a separate style sheet (rel=stylesheet)
+   c) to make a link to a script (rel=script)
+   d) by stylesheets to control how collections of
+      html nodes are rendered into printed documents
+   e) to make a link to a printable version of this document
+      e.g. a postscript or pdf version (rel=alternate media=print)
+-->
+
+<!ELEMENT LINK - O EMPTY               -- a media-independent link -->
+<!ATTLIST LINK
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  charset     %Charset;      #IMPLIED  -- char encoding of linked resource --
+  href        %URI;          #IMPLIED  -- URI for linked resource --
+  hreflang    %LanguageCode; #IMPLIED  -- language code --
+  type        %ContentType;  #IMPLIED  -- advisory content type --
+  rel         %LinkTypes;    #IMPLIED  -- forward link types --
+  rev         %LinkTypes;    #IMPLIED  -- reverse link types --
+  media       %MediaDesc;    #IMPLIED  -- for rendering on these media --
+  >
+
+<!--=================== Images ===========================================-->
+
+<!-- Length defined in strict DTD for cellpadding/cellspacing -->
+<!ENTITY % Length "CDATA" -- nn for pixels or nn% for percentage length -->
+<!ENTITY % MultiLength "CDATA" -- pixel, percentage, or relative -->
+
+<!ENTITY % MultiLengths "CDATA" -- comma-separated list of MultiLength -->
+
+<!ENTITY % Pixels "CDATA" -- integer representing length in pixels -->
+
+
+<!-- To avoid problems with text-only UAs as well as 
+   to make image content understandable and navigable 
+   to users of non-visual UAs, you need to provide
+   a description with ALT, and avoid server-side image maps -->
+<!ELEMENT IMG - O EMPTY                -- Embedded image -->
+<!ATTLIST IMG
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  src         %URI;          #REQUIRED -- URI of image to embed --
+  alt         %Text;         #REQUIRED -- short description --
+  longdesc    %URI;          #IMPLIED  -- link to long description
+                                          (complements alt) --
+  height      %Length;       #IMPLIED  -- override height --
+  width       %Length;       #IMPLIED  -- override width --
+  usemap      %URI;          #IMPLIED  -- use client-side image map --
+  ismap       (ismap)        #IMPLIED  -- use server-side image map --
+  >
+
+<!-- USEMAP points to a MAP element which may be in this document
+  or an external document, although the latter is not widely supported -->
+
+<!--==================== OBJECT ======================================-->
+<!--
+  OBJECT is used to embed objects as part of HTML pages 
+  PARAM elements should precede other content. SGML mixed content
+  model technicality precludes specifying this formally ...
+-->
+
+<!ELEMENT OBJECT - - (PARAM | %flow;)*
+ -- generic embedded object -->
+<!ATTLIST OBJECT
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  declare     (declare)      #IMPLIED  -- declare but don't instantiate flag --
+  classid     %URI;          #IMPLIED  -- identifies an implementation --
+  codebase    %URI;          #IMPLIED  -- base URI for classid, data, archive--
+  data        %URI;          #IMPLIED  -- reference to object's data --
+  type        %ContentType;  #IMPLIED  -- content type for data --
+  codetype    %ContentType;  #IMPLIED  -- content type for code --
+  archive     %URI;          #IMPLIED  -- space separated archive list --
+  standby     %Text;         #IMPLIED  -- message to show while loading --
+  height      %Length;       #IMPLIED  -- override height --
+  width       %Length;       #IMPLIED  -- override width --
+  usemap      %URI;          #IMPLIED  -- use client-side image map --
+  name        CDATA          #IMPLIED  -- submit as part of form --
+  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
+  %reserved;                           -- reserved for possible future use --
+  >
+
+<!ELEMENT PARAM - O EMPTY              -- named property value -->
+<!ATTLIST PARAM
+  id          ID             #IMPLIED  -- document-wide unique id --
+  name        CDATA          #REQUIRED -- property name --
+  value       CDATA          #IMPLIED  -- property value --
+  valuetype   (DATA|REF|OBJECT) DATA   -- How to interpret value --
+  type        %ContentType;  #IMPLIED  -- content type for value
+                                          when valuetype=ref --
+  >
+
+
+<!--=================== Horizontal Rule ==================================-->
+
+<!ELEMENT HR - O EMPTY -- horizontal rule -->
+<!ATTLIST HR
+  %coreattrs;                          -- id, class, style, title --
+  %events;
+  >
+
+<!--=================== Paragraphs =======================================-->
+
+<!ELEMENT P - O (%inline;)*            -- paragraph -->
+<!ATTLIST P
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!--=================== Headings =========================================-->
+
+<!--
+  There are six levels of headings from H1 (the most important)
+  to H6 (the least important).
+-->
+
+<!ELEMENT (%heading;)  - - (%inline;)* -- heading -->
+<!ATTLIST (%heading;)
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!--=================== Preformatted Text ================================-->
+
+<!-- excludes markup for images and changes in font size -->
+<!ENTITY % pre.exclusion "IMG|OBJECT|BIG|SMALL|SUB|SUP">
+
+<!ELEMENT PRE - - (%inline;)* -(%pre.exclusion;) -- preformatted text -->
+<!ATTLIST PRE
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!--===================== Inline Quotes ==================================-->
+
+<!ELEMENT Q - - (%inline;)*            -- short inline quotation -->
+<!ATTLIST Q
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  cite        %URI;          #IMPLIED  -- URI for source document or msg --
+  >
+
+<!--=================== Block-like Quotes ================================-->
+
+<!ELEMENT BLOCKQUOTE - - (%block;|SCRIPT)+ -- long quotation -->
+<!ATTLIST BLOCKQUOTE
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  cite        %URI;          #IMPLIED  -- URI for source document or msg --
+  >
+
+<!--=================== Inserted/Deleted Text ============================-->
+
+
+<!-- INS/DEL are handled by inclusion on BODY -->
+<!ELEMENT (INS|DEL) - - (%flow;)*      -- inserted text, deleted text -->
+<!ATTLIST (INS|DEL)
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  cite        %URI;          #IMPLIED  -- info on reason for change --
+  datetime    %Datetime;     #IMPLIED  -- date and time of change --
+  >
+
+<!--=================== Lists ============================================-->
+
+<!-- definition lists - DT for term, DD for its definition -->
+
+<!ELEMENT DL - - (DT|DD)+              -- definition list -->
+<!ATTLIST DL
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!ELEMENT DT - O (%inline;)*           -- definition term -->
+<!ELEMENT DD - O (%flow;)*             -- definition description -->
+<!ATTLIST (DT|DD)
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+
+<!ELEMENT OL - - (LI)+                 -- ordered list -->
+<!ATTLIST OL
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!-- Unordered Lists (UL) bullet styles -->
+<!ELEMENT UL - - (LI)+                 -- unordered list -->
+<!ATTLIST UL
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+
+
+<!ELEMENT LI - O (%flow;)*             -- list item -->
+<!ATTLIST LI
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!--================ Forms ===============================================-->
+<!ELEMENT FORM - - (%block;|SCRIPT)+ -(FORM) -- interactive form -->
+<!ATTLIST FORM
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  action      %URI;          #REQUIRED -- server-side form handler --
+  method      (GET|POST)     GET       -- HTTP method used to submit the form--
+  enctype     %ContentType;  "application/x-www-form-urlencoded"
+  onsubmit    %Script;       #IMPLIED  -- the form was submitted --
+  onreset     %Script;       #IMPLIED  -- the form was reset --
+  accept-charset %Charsets;  #IMPLIED  -- list of supported charsets --
+  >
+
+<!-- Each label must not contain more than ONE field -->
+<!ELEMENT LABEL - - (%inline;)* -(LABEL) -- form field label text -->
+<!ATTLIST LABEL
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  for         IDREF          #IMPLIED  -- matches field ID value --
+  accesskey   %Character;    #IMPLIED  -- accessibility key character --
+  onfocus     %Script;       #IMPLIED  -- the element got the focus --
+  onblur      %Script;       #IMPLIED  -- the element lost the focus --
+  >
+
+<!ENTITY % InputType
+  "(TEXT | PASSWORD | CHECKBOX |
+    RADIO | SUBMIT | RESET |
+    FILE | HIDDEN | IMAGE | BUTTON)"
+   >
+
+<!-- attribute name required for all but submit & reset -->
+<!ELEMENT INPUT - O EMPTY              -- form control -->
+<!ATTLIST INPUT
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  type        %InputType;    TEXT      -- what kind of widget is needed --
+  name        CDATA          #IMPLIED  -- submit as part of form --
+  value       CDATA          #IMPLIED  -- required for radio and checkboxes --
+  checked     (checked)      #IMPLIED  -- for radio buttons and check boxes --
+  disabled    (disabled)     #IMPLIED  -- unavailable in this context --
+  readonly    (readonly)     #IMPLIED  -- for text and passwd --
+  size        CDATA          #IMPLIED  -- specific to each type of field --
+  maxlength   NUMBER         #IMPLIED  -- max chars for text fields --
+  src         %URI;          #IMPLIED  -- for fields with images --
+  alt         CDATA          #IMPLIED  -- short description --
+  usemap      %URI;          #IMPLIED  -- use client-side image map --
+  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
+  accesskey   %Character;    #IMPLIED  -- accessibility key character --
+  onfocus     %Script;       #IMPLIED  -- the element got the focus --
+  onblur      %Script;       #IMPLIED  -- the element lost the focus --
+  onselect    %Script;       #IMPLIED  -- some text was selected --
+  onchange    %Script;       #IMPLIED  -- the element value was changed --
+  accept      %ContentTypes; #IMPLIED  -- list of MIME types for file upload --
+  %reserved;                           -- reserved for possible future use --
+  >
+
+<!ELEMENT SELECT - - (OPTGROUP|OPTION)+ -- option selector -->
+<!ATTLIST SELECT
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  name        CDATA          #IMPLIED  -- field name --
+  size        NUMBER         #IMPLIED  -- rows visible --
+  multiple    (multiple)     #IMPLIED  -- default is single selection --
+  disabled    (disabled)     #IMPLIED  -- unavailable in this context --
+  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
+  onfocus     %Script;       #IMPLIED  -- the element got the focus --
+  onblur      %Script;       #IMPLIED  -- the element lost the focus --
+  onchange    %Script;       #IMPLIED  -- the element value was changed --
+  %reserved;                           -- reserved for possible future use --
+  >
+
+<!ELEMENT OPTGROUP - - (OPTION)+ -- option group -->
+<!ATTLIST OPTGROUP
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  disabled    (disabled)     #IMPLIED  -- unavailable in this context --
+  label       %Text;         #REQUIRED -- for use in hierarchical menus --
+  >
+
+<!ELEMENT OPTION - O (#PCDATA)         -- selectable choice -->
+<!ATTLIST OPTION
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  selected    (selected)     #IMPLIED
+  disabled    (disabled)     #IMPLIED  -- unavailable in this context --
+  label       %Text;         #IMPLIED  -- for use in hierarchical menus --
+  value       CDATA          #IMPLIED  -- defaults to element content --
+  >
+
+<!ELEMENT TEXTAREA - - (#PCDATA)       -- multi-line text field -->
+<!ATTLIST TEXTAREA
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  name        CDATA          #IMPLIED
+  rows        NUMBER         #REQUIRED
+  cols        NUMBER         #REQUIRED
+  disabled    (disabled)     #IMPLIED  -- unavailable in this context --
+  readonly    (readonly)     #IMPLIED
+  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
+  accesskey   %Character;    #IMPLIED  -- accessibility key character --
+  onfocus     %Script;       #IMPLIED  -- the element got the focus --
+  onblur      %Script;       #IMPLIED  -- the element lost the focus --
+  onselect    %Script;       #IMPLIED  -- some text was selected --
+  onchange    %Script;       #IMPLIED  -- the element value was changed --
+  %reserved;                           -- reserved for possible future use --
+  >
+
+<!--
+  #PCDATA is to solve the mixed content problem,
+  per specification only whitespace is allowed there!
+ -->
+<!ELEMENT FIELDSET - - (#PCDATA,LEGEND,(%flow;)*) -- form control group -->
+<!ATTLIST FIELDSET
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!ELEMENT LEGEND - - (%inline;)*       -- fieldset legend -->
+<!ENTITY % LAlign "(top|bottom|left|right)">
+
+<!ATTLIST LEGEND
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  accesskey   %Character;    #IMPLIED  -- accessibility key character --
+  >
+
+<!ELEMENT BUTTON - -
+     (%flow;)* -(A|%formctrl;|FORM|FIELDSET)
+     -- push button -->
+<!ATTLIST BUTTON
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  name        CDATA          #IMPLIED
+  value       CDATA          #IMPLIED  -- sent to server when submitted --
+  type        (button|submit|reset) submit -- for use as form button --
+  disabled    (disabled)     #IMPLIED  -- unavailable in this context --
+  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
+  accesskey   %Character;    #IMPLIED  -- accessibility key character --
+  onfocus     %Script;       #IMPLIED  -- the element got the focus --
+  onblur      %Script;       #IMPLIED  -- the element lost the focus --
+  %reserved;                           -- reserved for possible future use --
+  >
+
+<!--======================= Tables =======================================-->
+
+<!-- IETF HTML table standard, see [RFC1942] -->
+
+<!--
+ The BORDER attribute sets the thickness of the frame around the
+ table. The default units are screen pixels.
+
+ The FRAME attribute specifies which parts of the frame around
+ the table should be rendered. The values are not the same as
+ CALS to avoid a name clash with the VALIGN attribute.
+
+ The value "border" is included for backwards compatibility with
+ <TABLE BORDER> which yields frame=border and border=implied
+ For <TABLE BORDER=1> you get border=1 and frame=implied. In this
+ case, it is appropriate to treat this as frame=border for backwards
+ compatibility with deployed browsers.
+-->
+<!ENTITY % TFrame "(void|above|below|hsides|lhs|rhs|vsides|box|border)">
+
+<!--
+ The RULES attribute defines which rules to draw between cells:
+
+ If RULES is absent then assume:
+     "none" if BORDER is absent or BORDER=0 otherwise "all"
+-->
+
+<!ENTITY % TRules "(none | groups | rows | cols | all)">
+  
+<!-- horizontal placement of table relative to document -->
+<!ENTITY % TAlign "(left|center|right)">
+
+<!-- horizontal alignment attributes for cell contents -->
+<!ENTITY % cellhalign
+  "align      (left|center|right|justify|char) #IMPLIED
+   char       %Character;    #IMPLIED  -- alignment char, e.g. char=':' --
+   charoff    %Length;       #IMPLIED  -- offset for alignment char --"
+  >
+
+<!-- vertical alignment attributes for cell contents -->
+<!ENTITY % cellvalign
+  "valign     (top|middle|bottom|baseline) #IMPLIED"
+  >
+
+<!ELEMENT TABLE - -
+     (CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+)>
+<!ELEMENT CAPTION  - - (%inline;)*     -- table caption -->
+<!ELEMENT THEAD    - O (TR)+           -- table header -->
+<!ELEMENT TFOOT    - O (TR)+           -- table footer -->
+<!ELEMENT TBODY    O O (TR)+           -- table body -->
+<!ELEMENT COLGROUP - O (col)*          -- table column group -->
+<!ELEMENT COL      - O EMPTY           -- table column -->
+<!ELEMENT TR       - O (TH|TD)+        -- table row -->
+<!ELEMENT (TH|TD)  - O (%flow;)*       -- table header cell, table data cell-->
+
+<!ATTLIST TABLE                        -- table element --
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  summary     %Text;         #IMPLIED  -- purpose/structure for speech output--
+  width       %Length;       #IMPLIED  -- table width --
+  border      %Pixels;       #IMPLIED  -- controls frame width around table --
+  frame       %TFrame;       #IMPLIED  -- which parts of frame to render --
+  rules       %TRules;       #IMPLIED  -- rulings between rows and cols --
+  cellspacing %Length;       #IMPLIED  -- spacing between cells --
+  cellpadding %Length;       #IMPLIED  -- spacing within cells --
+  %reserved;                           -- reserved for possible future use --
+  datapagesize CDATA         #IMPLIED  -- reserved for possible future use --
+  >
+
+<!ENTITY % CAlign "(top|bottom|left|right)">
+
+<!ATTLIST CAPTION
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!--
+COLGROUP groups a set of COL elements. It allows you to group
+several semantically related columns together.
+-->
+<!ATTLIST COLGROUP
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  span        NUMBER         1         -- default number of columns in group --
+  width       %MultiLength;  #IMPLIED  -- default width for enclosed COLs --
+  %cellhalign;                         -- horizontal alignment in cells --
+  %cellvalign;                         -- vertical alignment in cells --
+  >
+
+<!--
+ COL elements define the alignment properties for cells in
+ one or more columns.
+
+ The WIDTH attribute specifies the width of the columns, e.g.
+
+     width=64        width in screen pixels
+     width=0.5*      relative width of 0.5
+
+ The SPAN attribute causes the attributes of one
+ COL element to apply to more than one column.
+-->
+<!ATTLIST COL                          -- column groups and properties --
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  span        NUMBER         1         -- COL attributes affect N columns --
+  width       %MultiLength;  #IMPLIED  -- column width specification --
+  %cellhalign;                         -- horizontal alignment in cells --
+  %cellvalign;                         -- vertical alignment in cells --
+  >
+
+<!--
+    Use THEAD to duplicate headers when breaking table
+    across page boundaries, or for static headers when
+    TBODY sections are rendered in scrolling panel.
+
+    Use TFOOT to duplicate footers when breaking table
+    across page boundaries, or for static footers when
+    TBODY sections are rendered in scrolling panel.
+
+    Use multiple TBODY sections when rules are needed
+    between groups of table rows.
+-->
+<!ATTLIST (THEAD|TBODY|TFOOT)          -- table section --
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  %cellhalign;                         -- horizontal alignment in cells --
+  %cellvalign;                         -- vertical alignment in cells --
+  >
+
+<!ATTLIST TR                           -- table row --
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  %cellhalign;                         -- horizontal alignment in cells --
+  %cellvalign;                         -- vertical alignment in cells --
+  >
+
+
+<!-- Scope is simpler than axes attribute for common tables -->
+<!ENTITY % Scope "(row|col|rowgroup|colgroup)">
+
+<!-- TH is for headers, TD for data, but for cells acting as both use TD -->
+<!ATTLIST (TH|TD)                      -- header or data cell --
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  abbr        %Text;         #IMPLIED  -- abbreviation for header cell --
+  axis        CDATA          #IMPLIED  -- names groups of related headers--
+  headers     IDREFS         #IMPLIED  -- list of id's for header cells --
+  scope       %Scope;        #IMPLIED  -- scope covered by header cells --
+  rowspan     NUMBER         1         -- number of rows spanned by cell --
+  colspan     NUMBER         1         -- number of cols spanned by cell --
+  %cellhalign;                         -- horizontal alignment in cells --
+  %cellvalign;                         -- vertical alignment in cells --
+  >
+
+
+<!--================ Document Head =======================================-->
+<!-- %head.misc; defined earlier on as "SCRIPT|STYLE|META|LINK|OBJECT" -->
+<!ENTITY % head.content "TITLE & BASE?">
+
+<!ELEMENT HEAD O O (%head.content;) +(%head.misc;) -- document head -->
+<!ATTLIST HEAD
+  %i18n;                               -- lang, dir --
+  profile     %URI;          #IMPLIED  -- named dictionary of meta info --
+  >
+
+<!-- The TITLE element is not considered part of the flow of text.
+       It should be displayed, for example as the page header or
+       window title. Exactly one title is required per document.
+    -->
+<!ELEMENT TITLE - - (#PCDATA) -(%head.misc;) -- document title -->
+<!ATTLIST TITLE %i18n>
+
+
+<!ELEMENT BASE - O EMPTY               -- document base URI -->
+<!ATTLIST BASE
+  href        %URI;          #REQUIRED -- URI that acts as base URI --
+  >
+
+<!ELEMENT META - O EMPTY               -- generic metainformation -->
+<!ATTLIST META
+  %i18n;                               -- lang, dir, for use with content --
+  http-equiv  NAME           #IMPLIED  -- HTTP response header name  --
+  name        NAME           #IMPLIED  -- metainformation name --
+  content     CDATA          #REQUIRED -- associated information --
+  scheme      CDATA          #IMPLIED  -- select form of content --
+  >
+
+<!ELEMENT STYLE - - %StyleSheet        -- style info -->
+<!ATTLIST STYLE
+  %i18n;                               -- lang, dir, for use with title --
+  type        %ContentType;  #REQUIRED -- content type of style language --
+  media       %MediaDesc;    #IMPLIED  -- designed for use with these media --
+  title       %Text;         #IMPLIED  -- advisory title --
+  >
+
+<!ELEMENT SCRIPT - - %Script;          -- script statements -->
+<!ATTLIST SCRIPT
+  charset     %Charset;      #IMPLIED  -- char encoding of linked resource --
+  type        %ContentType;  #REQUIRED -- content type of script language --
+  language    CDATA          #IMPLIED  -- predefined script language name --
+  src         %URI;          #IMPLIED  -- URI for an external script --
+  defer       (defer)        #IMPLIED  -- UA may defer execution of script --
+  event       CDATA          #IMPLIED  -- reserved for possible future use --
+  for         %URI;          #IMPLIED  -- reserved for possible future use --
+  >
+
+<!ELEMENT NOSCRIPT - - (%block;)+
+  -- alternate content container for non script-based rendering -->
+<!ATTLIST NOSCRIPT
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!--================ Document Structure ==================================-->
+<!ENTITY % html.content "HEAD, BODY">
+
+<!ELEMENT HTML O O (%html.content;)    -- document root element -->
+<!ATTLIST HTML
+  %i18n;                               -- lang, dir --
+  >
diff --git a/pubtext/HTML4.dcl b/pubtext/HTML4.dcl
new file mode 100644 (file)
index 0000000..db46db0
--- /dev/null
@@ -0,0 +1,88 @@
+<!SGML  "ISO 8879:1986 (WWW)"
+    --
+         SGML Declaration for HyperText Markup Language version 4.0
+         With support for the first 17 planes of ISO 10646 and
+         increased limits for tag and literal lengths etc.
+
+         Modified by jjc to work around SP's 16-bit character limit.
+         Modified by jjc to support hex character references.
+    --
+    CHARSET
+          BASESET  "ISO Registration Number 177//CHARSET
+                    ISO/IEC 10646-1:1993 UCS-4 with
+                    implementation level 3//ESC 2/5 2/15 4/6"
+         DESCSET 0       9       UNUSED
+                 9       2       9
+                 11      2       UNUSED
+                 13      1       13
+                 14      18      UNUSED
+                 32      95      32
+                 127     1       UNUSED
+                 128     32      UNUSED
+              -- jjc: changed the rest of the DESCSET.
+                 Note that surrogates are not declared UNUSED;
+                 this allows non-BMP characters to be parsed. --
+                 160     65376   160
+              -- 160     55136   160
+                 55296   2048    UNUSED
+                 57344   1056768 57344 --
+
+CAPACITY        SGMLREF
+                TOTALCAP        150000
+                GRPCAP          150000
+                ENTCAP          150000
+
+SCOPE    DOCUMENT
+SYNTAX
+         SHUNCHAR CONTROLS 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
+           17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 127
+         BASESET  "ISO 646IRV:1991//CHARSET
+                   International Reference Version
+                   (IRV)//ESC 2/8 4/2"
+         DESCSET  0 128 0
+
+         FUNCTION
+                  RE            13
+                  RS            10
+                  SPACE         32
+                  TAB SEPCHAR    9
+
+         NAMING   LCNMSTRT ""
+                  UCNMSTRT ""
+                  LCNMCHAR ".-_:"    
+                  UCNMCHAR ".-_:"
+                  NAMECASE GENERAL YES
+                           ENTITY  NO
+         DELIM    GENERAL  SGMLREF
+                           HCRO "&#38;#X" -- added by jjc --
+                  SHORTREF SGMLREF
+         NAMES    SGMLREF
+         QUANTITY SGMLREF
+                  ATTCNT   60      -- increased --
+                  ATTSPLEN 65536   -- These are the largest values --
+                  LITLEN   65536   -- permitted in the declaration --
+                  NAMELEN  65536   -- Avoid fixed limits in actual --
+                  PILEN    65536   -- implementations of HTML UA's --
+                  TAGLVL   100
+                  TAGLEN   65536
+                  GRPGTCNT 150
+                  GRPCNT   64
+
+FEATURES
+  MINIMIZE
+    DATATAG  NO
+    OMITTAG  YES
+    RANK     NO
+    SHORTTAG YES
+  LINK
+    SIMPLE   NO
+    IMPLICIT NO
+    EXPLICIT NO
+  OTHER
+    CONCUR   NO
+    SUBDOC   NO
+    FORMAL   YES
+  APPINFO NONE
+>
\ No newline at end of file
diff --git a/pubtext/HTML4.dtd b/pubtext/HTML4.dtd
new file mode 100644 (file)
index 0000000..9e781db
--- /dev/null
@@ -0,0 +1,1092 @@
+<!--
+    This is the HTML 4.0 Transitional DTD, which includes
+    presentation attributes and elements that W3C expects to phase out
+    as support for style sheets matures. Authors should use the Strict
+    DTD when possible, but may use the Transitional DTD when support
+    for presentation attribute and elements is required.
+
+    HTML 4.0 includes mechanisms for style sheets, scripting,
+    embedding objects, improved support for right to left and mixed
+    direction text, and enhancements to forms for improved
+    accessibility for people with disabilities.
+
+          Draft: $Date: 1999/05/02 15:37:15 $
+
+          Authors:
+              Dave Raggett <dsr@w3.org>
+              Arnaud Le Hors <lehors@w3.org>
+              Ian Jacobs <ij@w3.org>
+
+    Further information about HTML 4.0 is available at:
+
+        http://www.w3.org/TR/REC-html40
+-->
+<!ENTITY % HTML.Version "-//W3C//DTD HTML 4.0 Transitional//EN"
+  -- Typical usage:
+
+    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
+            "http://www.w3.org/TR/REC-html40/loose.dtd">
+    <html>
+    <head>
+    ...
+    </head>
+    <body>
+    ...
+    </body>
+    </html>
+
+    The URI used as a system identifier with the public identifier allows
+    the user agent to download the DTD and entity sets as needed.
+
+    The FPI for the Strict HTML 4.0 DTD is:
+
+        "-//W3C//DTD HTML 4.0//EN"
+
+    and its URI is:
+
+        http://www.w3.org/TR/REC-html40/strict.dtd
+
+    Authors should use the Strict DTD unless they need the
+    presentation control for user agents that don't (adequately)
+    support style sheets.
+
+    If you are writing a document that includes frames, use 
+    the following FPI:
+
+        "-//W3C//DTD HTML 4.0 Frameset//EN"
+
+    with the URI:
+
+        http://www.w3.org/TR/REC-html40/frameset.dtd
+
+    The following URIs are supported in relation to HTML 4.0
+
+    "http://www.w3.org/TR/REC-html40/strict.dtd" (Strict DTD)
+    "http://www.w3.org/TR/REC-html40/loose.dtd" (Loose DTD)
+    "http://www.w3.org/TR/REC-html40/frameset.dtd" (Frameset DTD)
+    "http://www.w3.org/TR/REC-html40/HTMLlat1.ent" (Latin-1 entities)
+    "http://www.w3.org/TR/REC-html40/HTMLsymbol.ent" (Symbol entities)
+    "http://www.w3.org/TR/REC-html40/HTMLspecial.ent" (Special entities)
+
+    These URIs point to the latest version of each file. To reference
+    this specific revision use the following URIs:
+
+    "http://www.w3.org/TR/REC-html40-971218/strict.dtd"
+    "http://www.w3.org/TR/REC-html40-971218/loose.dtd"
+    "http://www.w3.org/TR/REC-html40-971218/frameset.dtd"
+    "http://www.w3.org/TR/REC-html40-971218/HTMLlat1.ent"
+    "http://www.w3.org/TR/REC-html40-971218/HTMLsymbol.ent"
+    "http://www.w3.org/TR/REC-html40-971218/HTMLspecial.ent"
+
+-->
+
+<!--================== Imported Names ====================================-->
+
+<!ENTITY % ContentType "CDATA"
+    -- media type, as per [RFC2045]
+    -->
+
+<!ENTITY % ContentTypes "CDATA"
+    -- comma-separated list of media types, as per [RFC2045]
+    -->
+
+<!ENTITY % Charset "CDATA"
+    -- a character encoding, as per [RFC2045]
+    -->
+
+<!ENTITY % Charsets "CDATA"
+    -- a space separated list of character encodings, as per [RFC2045]
+    -->
+
+<!ENTITY % LanguageCode "NAME"
+    -- a language code, as per [RFC1766]
+    -->
+
+<!ENTITY % Character "CDATA"
+    -- a single character from [ISO10646] 
+    -->
+
+<!ENTITY % LinkTypes "CDATA"
+    -- space-separated list of link types
+    -->
+
+<!ENTITY % MediaDesc "CDATA"
+    -- single or comma-separated list of media descriptors
+    -->
+
+<!ENTITY % URI "CDATA"
+    -- a Uniform Resource Identifier,
+       see [URI]
+    -->
+
+<!ENTITY % Datetime "CDATA" -- date and time information. ISO date format -->
+
+
+<!ENTITY % Script "CDATA" -- script expression -->
+
+<!ENTITY % StyleSheet "CDATA" -- style sheet data -->
+
+<!ENTITY % FrameTarget "CDATA" -- render in this frame -->
+
+
+<!ENTITY % Text "CDATA">
+
+
+<!-- Parameter Entities -->
+
+<!ENTITY % head.misc "SCRIPT|STYLE|META|LINK|OBJECT" -- repeatable head elements -->
+
+<!ENTITY % heading "H1|H2|H3|H4|H5|H6">
+
+<!ENTITY % list "UL | OL |  DIR | MENU">
+
+<!ENTITY % preformatted "PRE">
+
+<!ENTITY % Color "CDATA" -- a color using sRGB: #RRGGBB as Hex values -->
+
+<!-- There are also 16 widely known color names with their sRGB values:
+
+    Black  = #000000    Green  = #008000
+    Silver = #C0C0C0    Lime   = #00FF00
+    Gray   = #808080    Olive  = #808000
+    White  = #FFFFFF    Yellow = #FFFF00
+    Maroon = #800000    Navy   = #000080
+    Red    = #FF0000    Blue   = #0000FF
+    Purple = #800080    Teal   = #008080
+    Fuchsia= #FF00FF    Aqua   = #00FFFF
+ -->
+
+<!ENTITY % bodycolors "
+  bgcolor     %Color;        #IMPLIED  -- document background color --
+  text        %Color;        #IMPLIED  -- document text color --
+  link        %Color;        #IMPLIED  -- color of links --
+  vlink       %Color;        #IMPLIED  -- color of visited links --
+  alink       %Color;        #IMPLIED  -- color of selected links --
+  ">
+
+<!--================ Character mnemonic entities =========================-->
+
+<!ENTITY % HTMLlat1 PUBLIC
+   "-//W3C//ENTITIES Latin1//EN//HTML"
+   "http://www.w3.org/TR/REC-html40-971218/HTMLlat1.ent">
+%HTMLlat1;
+
+<!ENTITY % HTMLsymbol PUBLIC
+   "-//W3C//ENTITIES Symbols//EN//HTML"
+   "http://www.w3.org/TR/REC-html40-971218/HTMLsymbol.ent">
+%HTMLsymbol;
+
+<!ENTITY % HTMLspecial PUBLIC
+   "-//W3C//ENTITIES Special//EN//HTML"
+   "http://www.w3.org/TR/REC-html40-971218/HTMLspecial.ent">
+%HTMLspecial;
+<!--=================== Generic Attributes ===============================-->
+
+<!ENTITY % coreattrs
+ "id          ID             #IMPLIED  -- document-wide unique id --
+  class       CDATA          #IMPLIED  -- space separated list of classes --
+  style       %StyleSheet;   #IMPLIED  -- associated style info --
+  title       %Text;         #IMPLIED  -- advisory title/amplification --"
+  >
+
+<!ENTITY % i18n
+ "lang        %LanguageCode; #IMPLIED  -- language code --
+  dir         (ltr|rtl)      #IMPLIED  -- direction for weak/neutral text --"
+  >
+
+<!ENTITY % events
+ "onclick     %Script;       #IMPLIED  -- a pointer button was clicked --
+  ondblclick  %Script;       #IMPLIED  -- a pointer button was double clicked--
+  onmousedown %Script;       #IMPLIED  -- a pointer button was pressed down --
+  onmouseup   %Script;       #IMPLIED  -- a pointer button was released --
+  onmouseover %Script;       #IMPLIED  -- a pointer was moved onto --
+  onmousemove %Script;       #IMPLIED  -- a pointer was moved within --
+  onmouseout  %Script;       #IMPLIED  -- a pointer was moved away --
+  onkeypress  %Script;       #IMPLIED  -- a key was pressed and released --
+  onkeydown   %Script;       #IMPLIED  -- a key was pressed down --
+  onkeyup     %Script;       #IMPLIED  -- a key was released --"
+  >
+
+<!-- Reserved Feature Switch -->
+<!ENTITY % HTML.Reserved "IGNORE">
+
+<!-- The following attributes are reserved for possible future use -->
+<![ %HTML.Reserved; [
+<!ENTITY % reserved
+ "datasrc     %URI;          #IMPLIED  -- a single or tabular Data Source --
+  datafld     CDATA          #IMPLIED  -- the property or column name --
+  dataformatas (plaintext|html) plaintext -- text or html --"
+  >
+]]>
+
+<!ENTITY % reserved "">
+
+<!ENTITY % attrs "%coreattrs; %i18n; %events;">
+
+<!ENTITY % align "align (left|center|right|justify)  #IMPLIED"
+                   -- default is left for ltr paragraphs, right for rtl --
+  >
+
+<!--=================== Text Markup ======================================-->
+
+<!ENTITY % fontstyle
+ "TT | I | B | U | S | STRIKE | BIG | SMALL">
+
+<!ENTITY % phrase "EM | STRONG | DFN | CODE |
+                   SAMP | KBD | VAR | CITE | ABBR | ACRONYM" >
+
+<!ENTITY % special
+   "A | IMG | APPLET | OBJECT | FONT | BASEFONT | BR | SCRIPT |
+    MAP | Q | SUB | SUP | SPAN | BDO | IFRAME">
+
+<!ENTITY % formctrl "INPUT | SELECT | TEXTAREA | LABEL | BUTTON">
+
+<!-- %inline; covers inline or "text-level" elements -->
+<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">
+
+<!ELEMENT (%fontstyle;|%phrase;) - - (%inline;)*>
+<!ATTLIST (%fontstyle;|%phrase;)
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!ELEMENT (SUB|SUP) - - (%inline;)*    -- subscript, superscript -->
+<!ATTLIST (SUB|SUP)
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!ELEMENT SPAN - - (%inline;)*         -- generic language/style container -->
+<!ATTLIST SPAN
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  %reserved;                          -- reserved for possible future use --
+  >
+
+<!ELEMENT BDO - - (%inline;)*          -- I18N BiDi over-ride -->
+<!ATTLIST BDO
+  %coreattrs;                          -- id, class, style, title --
+  lang        %LanguageCode; #IMPLIED  -- language code --
+  dir         (ltr|rtl)      #REQUIRED -- directionality --
+  >
+
+<!ELEMENT BASEFONT - O EMPTY           -- base font size -->
+<!ATTLIST BASEFONT
+  id          ID             #IMPLIED  -- document-wide unique id --
+  size        CDATA          #REQUIRED -- base font size for FONT elements --
+  color       %Color;        #IMPLIED  -- text color --
+  face        CDATA          #IMPLIED  -- comma separated list of font names --
+  >
+
+<!ELEMENT FONT - - (%inline;)*         -- local change to font -->
+<!ATTLIST FONT
+  %coreattrs;                          -- id, class, style, title --
+  %i18n;                              -- lang, dir --
+  size        CDATA          #IMPLIED  -- [+|-]nn e.g. size="+1", size="4" --
+  color       %Color;        #IMPLIED  -- text color --
+  face        CDATA          #IMPLIED  -- comma separated list of font names --
+  >
+
+<!ELEMENT BR - O EMPTY                 -- forced line break -->
+<!ATTLIST BR
+  %coreattrs;                          -- id, class, style, title --
+  clear       (left|all|right|none) none -- control of text flow --
+  >
+
+<!--================== HTML content models ===============================-->
+
+<!--
+    HTML has two basic content models:
+
+        %inline;     character level elements and text strings
+        %block;      block-like elements e.g. paragraphs and lists
+-->
+
+<!ENTITY % block
+     "P | %heading; | %list; | %preformatted; | DL | DIV | CENTER |
+      NOSCRIPT | NOFRAMES | BLOCKQUOTE | FORM | ISINDEX | HR |
+      TABLE | FIELDSET | ADDRESS">
+
+<!ENTITY % flow "%block; | %inline;">
+
+<!--=================== Document Body ====================================-->
+
+<!ELEMENT BODY O O (%flow;)* +(INS|DEL) -- document body -->
+<!ATTLIST BODY
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  onload          %Script;   #IMPLIED  -- the document has been loaded --
+  onunload        %Script;   #IMPLIED  -- the document has been removed --
+  background      %URI;      #IMPLIED  -- texture tile for document
+                                          background --
+  %bodycolors;                         -- bgcolor, text, link, vlink, alink --
+  >
+
+<!ELEMENT ADDRESS - - ((%inline;)|P)*  -- information on author -->
+<!ATTLIST ADDRESS
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!ELEMENT DIV - - (%flow;)*            -- generic language/style container -->
+<!ATTLIST DIV
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  %align;                              -- align, text alignment --
+  %reserved;                           -- reserved for possible future use --
+  >
+
+<!ELEMENT CENTER - - (%flow;)*         -- shorthand for DIV align=center -->
+<!ATTLIST CENTER
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!--================== The Anchor Element ================================-->
+
+<!ENTITY % Shape "(rect|circle|poly|default)">
+<!ENTITY % Coords "CDATA" -- comma separated list of lengths -->
+
+<!ELEMENT A - - (%inline;)* -(A)       -- anchor -->
+<!ATTLIST A
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  charset     %Charset;      #IMPLIED  -- char encoding of linked resource --
+  type        %ContentType;  #IMPLIED  -- advisory content type --
+  name        CDATA          #IMPLIED  -- named link end --
+  href        %URI;          #IMPLIED  -- URI for linked resource --
+  hreflang    %LanguageCode; #IMPLIED  -- language code --
+  target      %FrameTarget;  #IMPLIED  -- render in this frame --
+  rel         %LinkTypes;    #IMPLIED  -- forward link types --
+  rev         %LinkTypes;    #IMPLIED  -- reverse link types --
+  accesskey   %Character;    #IMPLIED  -- accessibility key character --
+  shape       %Shape;        rect      -- for use with client-side image maps --
+  coords      %Coords;       #IMPLIED  -- for use with client-side image maps --
+  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
+  onfocus     %Script;       #IMPLIED  -- the element got the focus --
+  onblur      %Script;       #IMPLIED  -- the element lost the focus --
+  >
+
+<!--================== Client-side image maps ============================-->
+
+<!-- These can be placed in the same document or grouped in a
+     separate document although this isn't yet widely supported -->
+
+<!ELEMENT MAP - - ((%block;)+ | AREA+) -- client-side image map -->
+<!ATTLIST MAP
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  name        CDATA          #REQUIRED -- for reference by usemap --
+  >
+
+<!ELEMENT AREA - O EMPTY               -- client-side image map area -->
+<!ATTLIST AREA
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  shape       %Shape;        rect      -- controls interpretation of coords --
+  coords      %Coords;       #IMPLIED  -- comma separated list of lengths --
+  href        %URI;          #IMPLIED  -- URI for linked resource --
+  target      %FrameTarget;  #IMPLIED  -- render in this frame --
+  nohref      (nohref)       #IMPLIED  -- this region has no action --
+  alt         %Text;         #REQUIRED -- short description --
+  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
+  accesskey   %Character;    #IMPLIED  -- accessibility key character --
+  onfocus     %Script;       #IMPLIED  -- the element got the focus --
+  onblur      %Script;       #IMPLIED  -- the element lost the focus --
+  >
+
+<!--================== The LINK Element ==================================-->
+
+<!--
+  Relationship values can be used in principle:
+
+   a) for document specific toolbars/menus when used
+      with the LINK element in document head e.g.
+        start, contents, previous, next, index, end, help
+   b) to link to a separate style sheet (rel=stylesheet)
+   c) to make a link to a script (rel=script)
+   d) by stylesheets to control how collections of
+      html nodes are rendered into printed documents
+   e) to make a link to a printable version of this document
+      e.g. a postscript or pdf version (rel=alternate media=print)
+-->
+
+<!ELEMENT LINK - O EMPTY               -- a media-independent link -->
+<!ATTLIST LINK
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  charset     %Charset;      #IMPLIED  -- char encoding of linked resource --
+  href        %URI;          #IMPLIED  -- URI for linked resource --
+  hreflang    %LanguageCode; #IMPLIED  -- language code --
+  type        %ContentType;  #IMPLIED  -- advisory content type --
+  rel         %LinkTypes;    #IMPLIED  -- forward link types --
+  rev         %LinkTypes;    #IMPLIED  -- reverse link types --
+  media       %MediaDesc;    #IMPLIED  -- for rendering on these media --
+  target      %FrameTarget;  #IMPLIED  -- render in this frame --
+  >
+
+<!--=================== Images ===========================================-->
+
+<!-- Length defined in strict DTD for cellpadding/cellspacing -->
+<!ENTITY % Length "CDATA" -- nn for pixels or nn% for percentage length -->
+<!ENTITY % MultiLength "CDATA" -- pixel, percentage, or relative -->
+
+<!ENTITY % MultiLengths "CDATA" -- comma-separated list of MultiLength -->
+
+<!ENTITY % Pixels "CDATA" -- integer representing length in pixels -->
+
+<!ENTITY % IAlign "(top|middle|bottom|left|right)" -- center? -->
+
+<!-- To avoid problems with text-only UAs as well as 
+   to make image content understandable and navigable 
+   to users of non-visual UAs, you need to provide
+   a description with ALT, and avoid server-side image maps -->
+<!ELEMENT IMG - O EMPTY                -- Embedded image -->
+<!ATTLIST IMG
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  src         %URI;          #REQUIRED -- URI of image to embed --
+  alt         %Text;         #REQUIRED -- short description --
+  longdesc    %URI;          #IMPLIED  -- link to long description
+                                          (complements alt) --
+  height      %Length;       #IMPLIED  -- override height --
+  width       %Length;       #IMPLIED  -- override width --
+  usemap      %URI;          #IMPLIED  -- use client-side image map --
+  ismap       (ismap)        #IMPLIED  -- use server-side image map --
+  align       %IAlign;       #IMPLIED  -- vertical or horizontal alignment --
+  border      %Length;       #IMPLIED  -- link border width --
+  hspace      %Pixels;       #IMPLIED  -- horizontal gutter --
+  vspace      %Pixels;       #IMPLIED  -- vertical gutter --
+  >
+
+<!-- USEMAP points to a MAP element which may be in this document
+  or an external document, although the latter is not widely supported -->
+
+<!--==================== OBJECT ======================================-->
+<!--
+  OBJECT is used to embed objects as part of HTML pages 
+  PARAM elements should precede other content. SGML mixed content
+  model technicality precludes specifying this formally ...
+-->
+
+<!ELEMENT OBJECT - - (PARAM | %flow;)*
+ -- generic embedded object -->
+<!ATTLIST OBJECT
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  declare     (declare)      #IMPLIED  -- declare but don't instantiate flag --
+  classid     %URI;          #IMPLIED  -- identifies an implementation --
+  codebase    %URI;          #IMPLIED  -- base URI for classid, data, archive--
+  data        %URI;          #IMPLIED  -- reference to object's data --
+  type        %ContentType;  #IMPLIED  -- content type for data --
+  codetype    %ContentType;  #IMPLIED  -- content type for code --
+  archive     %URI;          #IMPLIED  -- space separated archive list --
+  standby     %Text;         #IMPLIED  -- message to show while loading --
+  height      %Length;       #IMPLIED  -- override height --
+  width       %Length;       #IMPLIED  -- override width --
+  usemap      %URI;          #IMPLIED  -- use client-side image map --
+  name        CDATA          #IMPLIED  -- submit as part of form --
+  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
+  align       %IAlign;       #IMPLIED  -- vertical or horizontal alignment --
+  border      %Length;       #IMPLIED  -- link border width --
+  hspace      %Pixels;       #IMPLIED  -- horizontal gutter --
+  vspace      %Pixels;       #IMPLIED  -- vertical gutter --
+  %reserved;                           -- reserved for possible future use --
+  >
+
+<!ELEMENT PARAM - O EMPTY              -- named property value -->
+<!ATTLIST PARAM
+  id          ID             #IMPLIED  -- document-wide unique id --
+  name        CDATA          #REQUIRED -- property name --
+  value       CDATA          #IMPLIED  -- property value --
+  valuetype   (DATA|REF|OBJECT) DATA   -- How to interpret value --
+  type        %ContentType;  #IMPLIED  -- content type for value
+                                          when valuetype=ref --
+  >
+
+<!--=================== Java APPLET ==================================-->
+<!--
+  One of code or object attributes must be present.
+  Place PARAM elements before other content.
+-->
+<!ELEMENT APPLET - - (PARAM | %flow;)* -- Java applet -->
+<!ATTLIST APPLET
+  %coreattrs;                          -- id, class, style, title --
+  codebase    %URI;          #IMPLIED  -- optional base URI for applet --
+  archive     CDATA          #IMPLIED  -- comma separated archive list --
+  code        CDATA          #IMPLIED  -- applet class file --
+  object      CDATA          #IMPLIED  -- serialized applet file --
+  alt         %Text;         #IMPLIED  -- short description --
+  name        CDATA          #IMPLIED  -- allows applets to find each other --
+  width       %Length;       #REQUIRED -- initial width --
+  height      %Length;       #REQUIRED -- initial height --
+  align       %IAlign;       #IMPLIED  -- vertical or horizontal alignment --
+  hspace      %Pixels;       #IMPLIED  -- horizontal gutter --
+  vspace      %Pixels;       #IMPLIED  -- vertical gutter --
+  >
+
+<!--=================== Horizontal Rule ==================================-->
+
+<!ELEMENT HR - O EMPTY -- horizontal rule -->
+<!ATTLIST HR
+  %coreattrs;                          -- id, class, style, title --
+  %events;
+  align       (left|center|right) #IMPLIED
+  noshade     (noshade)      #IMPLIED
+  size        %Pixels;       #IMPLIED
+  width       %Length;       #IMPLIED
+  >
+
+<!--=================== Paragraphs =======================================-->
+
+<!ELEMENT P - O (%inline;)*            -- paragraph -->
+<!ATTLIST P
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  %align;                              -- align, text alignment --
+  >
+
+<!--=================== Headings =========================================-->
+
+<!--
+  There are six levels of headings from H1 (the most important)
+  to H6 (the least important).
+-->
+
+<!ELEMENT (%heading;)  - - (%inline;)* -- heading -->
+<!ATTLIST (%heading;)
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  %align;                              -- align, text alignment --
+  >
+
+<!--=================== Preformatted Text ================================-->
+
+<!-- excludes markup for images and changes in font size -->
+<!ENTITY % pre.exclusion "IMG|OBJECT|APPLET|BIG|SMALL|SUB|SUP|FONT|BASEFONT">
+
+<!ELEMENT PRE - - (%inline;)* -(%pre.exclusion;) -- preformatted text -->
+<!ATTLIST PRE
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  width       NUMBER         #IMPLIED
+  >
+
+<!--===================== Inline Quotes ==================================-->
+
+<!ELEMENT Q - - (%inline;)*            -- short inline quotation -->
+<!ATTLIST Q
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  cite        %URI;          #IMPLIED  -- URI for source document or msg --
+  >
+
+<!--=================== Block-like Quotes ================================-->
+
+<!ELEMENT BLOCKQUOTE - - (%flow;)*     -- long quotation -->
+<!ATTLIST BLOCKQUOTE
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  cite        %URI;          #IMPLIED  -- URI for source document or msg --
+  >
+
+<!--=================== Inserted/Deleted Text ============================-->
+
+
+<!-- INS/DEL are handled by inclusion on BODY -->
+<!ELEMENT (INS|DEL) - - (%flow;)*      -- inserted text, deleted text -->
+<!ATTLIST (INS|DEL)
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  cite        %URI;          #IMPLIED  -- info on reason for change --
+  datetime    %Datetime;     #IMPLIED  -- date and time of change --
+  >
+
+<!--=================== Lists ============================================-->
+
+<!-- definition lists - DT for term, DD for its definition -->
+
+<!ELEMENT DL - - (DT|DD)+              -- definition list -->
+<!ATTLIST DL
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  compact     (compact)      #IMPLIED  -- reduced interitem spacing --
+  >
+
+<!ELEMENT DT - O (%inline;)*           -- definition term -->
+<!ELEMENT DD - O (%flow;)*             -- definition description -->
+<!ATTLIST (DT|DD)
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!-- Ordered lists (OL) Numbering style
+
+    1   arablic numbers     1, 2, 3, ...
+    a   lower alpha         a, b, c, ...
+    A   upper alpha         A, B, C, ...
+    i   lower roman         i, ii, iii, ...
+    I   upper roman         I, II, III, ...
+
+    The style is applied to the sequence number which by default
+    is reset to 1 for the first list item in an ordered list.
+
+    This can't be expressed directly in SGML due to case folding.
+-->
+
+<!ENTITY % OLStyle "CDATA"      -- constrained to: "(1|a|A|i|I)" -->
+
+<!ELEMENT OL - - (LI)+                 -- ordered list -->
+<!ATTLIST OL
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  type        %OLStyle;      #IMPLIED  -- numbering style --
+  compact     (compact)      #IMPLIED  -- reduced interitem spacing --
+  start       NUMBER         #IMPLIED  -- starting sequence number --
+  >
+
+<!-- Unordered Lists (UL) bullet styles -->
+<!ENTITY % ULStyle "(disc|square|circle)">
+
+<!ELEMENT UL - - (LI)+                 -- unordered list -->
+<!ATTLIST UL
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  type        %ULStyle;      #IMPLIED  -- bullet style --
+  compact     (compact)      #IMPLIED  -- reduced interitem spacing --
+  >
+
+<!ELEMENT (DIR|MENU) - - (LI)+ -(%block;) -- directory list, menu list -->
+<!ATTLIST DIR
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  compact     (compact)      #IMPLIED
+  >
+<!ATTLIST MENU
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  compact     (compact)      #IMPLIED
+  >
+
+<!ENTITY % LIStyle "CDATA" -- constrained to: "(%ULStyle;|%OLStyle;)" -->
+
+<!ELEMENT LI - O (%flow;)*             -- list item -->
+<!ATTLIST LI
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  type        %LIStyle;      #IMPLIED  -- list item style --
+  value       NUMBER         #IMPLIED  -- reset sequence number --
+  >
+
+<!--================ Forms ===============================================-->
+<!ELEMENT FORM - - (%flow;)* -(FORM)   -- interactive form -->
+<!ATTLIST FORM
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  action      %URI;          #REQUIRED -- server-side form handler --
+  method      (GET|POST)     GET       -- HTTP method used to submit the form--
+  enctype     %ContentType;  "application/x-www-form-urlencoded"
+  onsubmit    %Script;       #IMPLIED  -- the form was submitted --
+  onreset     %Script;       #IMPLIED  -- the form was reset --
+  target      %FrameTarget;  #IMPLIED  -- render in this frame --
+  accept-charset %Charsets;  #IMPLIED  -- list of supported charsets --
+  >
+
+<!-- Each label must not contain more than ONE field -->
+<!ELEMENT LABEL - - (%inline;)* -(LABEL) -- form field label text -->
+<!ATTLIST LABEL
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  for         IDREF          #IMPLIED  -- matches field ID value --
+  accesskey   %Character;    #IMPLIED  -- accessibility key character --
+  onfocus     %Script;       #IMPLIED  -- the element got the focus --
+  onblur      %Script;       #IMPLIED  -- the element lost the focus --
+  >
+
+<!ENTITY % InputType
+  "(TEXT | PASSWORD | CHECKBOX |
+    RADIO | SUBMIT | RESET |
+    FILE | HIDDEN | IMAGE | BUTTON)"
+   >
+
+<!-- attribute name required for all but submit & reset -->
+<!ELEMENT INPUT - O EMPTY              -- form control -->
+<!ATTLIST INPUT
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  type        %InputType;    TEXT      -- what kind of widget is needed --
+  name        CDATA          #IMPLIED  -- submit as part of form --
+  value       CDATA          #IMPLIED  -- required for radio and checkboxes --
+  checked     (checked)      #IMPLIED  -- for radio buttons and check boxes --
+  disabled    (disabled)     #IMPLIED  -- unavailable in this context --
+  readonly    (readonly)     #IMPLIED  -- for text and passwd --
+  size        CDATA          #IMPLIED  -- specific to each type of field --
+  maxlength   NUMBER         #IMPLIED  -- max chars for text fields --
+  src         %URI;          #IMPLIED  -- for fields with images --
+  alt         CDATA          #IMPLIED  -- short description --
+  usemap      %URI;          #IMPLIED  -- use client-side image map --
+  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
+  accesskey   %Character;    #IMPLIED  -- accessibility key character --
+  onfocus     %Script;       #IMPLIED  -- the element got the focus --
+  onblur      %Script;       #IMPLIED  -- the element lost the focus --
+  onselect    %Script;       #IMPLIED  -- some text was selected --
+  onchange    %Script;       #IMPLIED  -- the element value was changed --
+  accept      %ContentTypes; #IMPLIED  -- list of MIME types for file upload --
+  align       %IAlign;       #IMPLIED  -- vertical or horizontal alignment --
+  %reserved;                           -- reserved for possible future use --
+  >
+
+<!ELEMENT SELECT - - (OPTGROUP|OPTION)+ -- option selector -->
+<!ATTLIST SELECT
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  name        CDATA          #IMPLIED  -- field name --
+  size        NUMBER         #IMPLIED  -- rows visible --
+  multiple    (multiple)     #IMPLIED  -- default is single selection --
+  disabled    (disabled)     #IMPLIED  -- unavailable in this context --
+  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
+  onfocus     %Script;       #IMPLIED  -- the element got the focus --
+  onblur      %Script;       #IMPLIED  -- the element lost the focus --
+  onchange    %Script;       #IMPLIED  -- the element value was changed --
+  %reserved;                           -- reserved for possible future use --
+  >
+
+<!ELEMENT OPTGROUP - - (OPTION)+ -- option group -->
+<!ATTLIST OPTGROUP
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  disabled    (disabled)     #IMPLIED  -- unavailable in this context --
+  label       %Text;         #REQUIRED -- for use in hierarchical menus --
+  >
+
+<!ELEMENT OPTION - O (#PCDATA)         -- selectable choice -->
+<!ATTLIST OPTION
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  selected    (selected)     #IMPLIED
+  disabled    (disabled)     #IMPLIED  -- unavailable in this context --
+  label       %Text;         #IMPLIED  -- for use in hierarchical menus --
+  value       CDATA          #IMPLIED  -- defaults to element content --
+  >
+
+<!ELEMENT TEXTAREA - - (#PCDATA)       -- multi-line text field -->
+<!ATTLIST TEXTAREA
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  name        CDATA          #IMPLIED
+  rows        NUMBER         #REQUIRED
+  cols        NUMBER         #REQUIRED
+  disabled    (disabled)     #IMPLIED  -- unavailable in this context --
+  readonly    (readonly)     #IMPLIED
+  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
+  accesskey   %Character;    #IMPLIED  -- accessibility key character --
+  onfocus     %Script;       #IMPLIED  -- the element got the focus --
+  onblur      %Script;       #IMPLIED  -- the element lost the focus --
+  onselect    %Script;       #IMPLIED  -- some text was selected --
+  onchange    %Script;       #IMPLIED  -- the element value was changed --
+  %reserved;                           -- reserved for possible future use --
+  >
+
+<!--
+  #PCDATA is to solve the mixed content problem,
+  per specification only whitespace is allowed there!
+ -->
+<!ELEMENT FIELDSET - - (#PCDATA,LEGEND,(%flow;)*) -- form control group -->
+<!ATTLIST FIELDSET
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!ELEMENT LEGEND - - (%inline;)*       -- fieldset legend -->
+<!ENTITY % LAlign "(top|bottom|left|right)">
+
+<!ATTLIST LEGEND
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  accesskey   %Character;    #IMPLIED  -- accessibility key character --
+  align       %LAlign;       #IMPLIED  -- relative to fieldset --
+  >
+
+<!ELEMENT BUTTON - -
+     (%flow;)* -(A|%formctrl;|FORM|ISINDEX|FIELDSET|IFRAME)
+     -- push button -->
+<!ATTLIST BUTTON
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  name        CDATA          #IMPLIED
+  value       CDATA          #IMPLIED  -- sent to server when submitted --
+  type        (button|submit|reset) submit -- for use as form button --
+  disabled    (disabled)     #IMPLIED  -- unavailable in this context --
+  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
+  accesskey   %Character;    #IMPLIED  -- accessibility key character --
+  onfocus     %Script;       #IMPLIED  -- the element got the focus --
+  onblur      %Script;       #IMPLIED  -- the element lost the focus --
+  %reserved;                           -- reserved for possible future use --
+  >
+
+<!--======================= Tables =======================================-->
+
+<!-- IETF HTML table standard, see [RFC1942] -->
+
+<!--
+ The BORDER attribute sets the thickness of the frame around the
+ table. The default units are screen pixels.
+
+ The FRAME attribute specifies which parts of the frame around
+ the table should be rendered. The values are not the same as
+ CALS to avoid a name clash with the VALIGN attribute.
+
+ The value "border" is included for backwards compatibility with
+ <TABLE BORDER> which yields frame=border and border=implied
+ For <TABLE BORDER=1> you get border=1 and frame=implied. In this
+ case, it is appropriate to treat this as frame=border for backwards
+ compatibility with deployed browsers.
+-->
+<!ENTITY % TFrame "(void|above|below|hsides|lhs|rhs|vsides|box|border)">
+
+<!--
+ The RULES attribute defines which rules to draw between cells:
+
+ If RULES is absent then assume:
+     "none" if BORDER is absent or BORDER=0 otherwise "all"
+-->
+
+<!ENTITY % TRules "(none | groups | rows | cols | all)">
+  
+<!-- horizontal placement of table relative to document -->
+<!ENTITY % TAlign "(left|center|right)">
+
+<!-- horizontal alignment attributes for cell contents -->
+<!ENTITY % cellhalign
+  "align      (left|center|right|justify|char) #IMPLIED
+   char       %Character;    #IMPLIED  -- alignment char, e.g. char=':' --
+   charoff    %Length;       #IMPLIED  -- offset for alignment char --"
+  >
+
+<!-- vertical alignment attributes for cell contents -->
+<!ENTITY % cellvalign
+  "valign     (top|middle|bottom|baseline) #IMPLIED"
+  >
+
+<!ELEMENT TABLE - -
+     (CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+)>
+<!ELEMENT CAPTION  - - (%inline;)*     -- table caption -->
+<!ELEMENT THEAD    - O (TR)+           -- table header -->
+<!ELEMENT TFOOT    - O (TR)+           -- table footer -->
+<!ELEMENT TBODY    O O (TR)+           -- table body -->
+<!ELEMENT COLGROUP - O (col)*          -- table column group -->
+<!ELEMENT COL      - O EMPTY           -- table column -->
+<!ELEMENT TR       - O (TH|TD)+        -- table row -->
+<!ELEMENT (TH|TD)  - O (%flow;)*       -- table header cell, table data cell-->
+
+<!ATTLIST TABLE                        -- table element --
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  summary     %Text;         #IMPLIED  -- purpose/structure for speech output--
+  width       %Length;       #IMPLIED  -- table width --
+  border      %Pixels;       #IMPLIED  -- controls frame width around table --
+  frame       %TFrame;       #IMPLIED  -- which parts of frame to render --
+  rules       %TRules;       #IMPLIED  -- rulings between rows and cols --
+  cellspacing %Length;       #IMPLIED  -- spacing between cells --
+  cellpadding %Length;       #IMPLIED  -- spacing within cells --
+  align       %TAlign;       #IMPLIED  -- table position relative to window --
+  bgcolor     %Color;        #IMPLIED  -- background color for cells --
+  %reserved;                           -- reserved for possible future use --
+  datapagesize CDATA         #IMPLIED  -- reserved for possible future use --
+  >
+
+<!ENTITY % CAlign "(top|bottom|left|right)">
+
+<!ATTLIST CAPTION
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  align       %CAlign;       #IMPLIED  -- relative to table --
+  >
+
+<!--
+COLGROUP groups a set of COL elements. It allows you to group
+several semantically related columns together.
+-->
+<!ATTLIST COLGROUP
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  span        NUMBER         1         -- default number of columns in group --
+  width       %MultiLength;  #IMPLIED  -- default width for enclosed COLs --
+  %cellhalign;                         -- horizontal alignment in cells --
+  %cellvalign;                         -- vertical alignment in cells --
+  >
+
+<!--
+ COL elements define the alignment properties for cells in
+ one or more columns.
+
+ The WIDTH attribute specifies the width of the columns, e.g.
+
+     width=64        width in screen pixels
+     width=0.5*      relative width of 0.5
+
+ The SPAN attribute causes the attributes of one
+ COL element to apply to more than one column.
+-->
+<!ATTLIST COL                          -- column groups and properties --
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  span        NUMBER         1         -- COL attributes affect N columns --
+  width       %MultiLength;  #IMPLIED  -- column width specification --
+  %cellhalign;                         -- horizontal alignment in cells --
+  %cellvalign;                         -- vertical alignment in cells --
+  >
+
+<!--
+    Use THEAD to duplicate headers when breaking table
+    across page boundaries, or for static headers when
+    TBODY sections are rendered in scrolling panel.
+
+    Use TFOOT to duplicate footers when breaking table
+    across page boundaries, or for static footers when
+    TBODY sections are rendered in scrolling panel.
+
+    Use multiple TBODY sections when rules are needed
+    between groups of table rows.
+-->
+<!ATTLIST (THEAD|TBODY|TFOOT)          -- table section --
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  %cellhalign;                         -- horizontal alignment in cells --
+  %cellvalign;                         -- vertical alignment in cells --
+  >
+
+<!ATTLIST TR                           -- table row --
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  %cellhalign;                         -- horizontal alignment in cells --
+  %cellvalign;                         -- vertical alignment in cells --
+  bgcolor     %Color;        #IMPLIED  -- background color for row --
+  >
+
+
+<!-- Scope is simpler than axes attribute for common tables -->
+<!ENTITY % Scope "(row|col|rowgroup|colgroup)">
+
+<!-- TH is for headers, TD for data, but for cells acting as both use TD -->
+<!ATTLIST (TH|TD)                      -- header or data cell --
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  abbr        %Text;         #IMPLIED  -- abbreviation for header cell --
+  axis        CDATA          #IMPLIED  -- names groups of related headers--
+  headers     IDREFS         #IMPLIED  -- list of id's for header cells --
+  scope       %Scope;        #IMPLIED  -- scope covered by header cells --
+  rowspan     NUMBER         1         -- number of rows spanned by cell --
+  colspan     NUMBER         1         -- number of cols spanned by cell --
+  %cellhalign;                         -- horizontal alignment in cells --
+  %cellvalign;                         -- vertical alignment in cells --
+  nowrap      (nowrap)       #IMPLIED  -- suppress word wrap --
+  bgcolor     %Color;        #IMPLIED  -- cell background color --
+  width       %Pixels;       #IMPLIED  -- width for cell --
+  height      %Pixels;       #IMPLIED  -- height for cell --
+  >
+
+<!--================== Document Frames ===================================-->
+
+<!--
+  The content model for HTML documents depends on whether the HEAD is
+  followed by a FRAMESET or BODY element. The widespread omission of
+  the BODY start tag makes it impractical to define the content model
+  without the use of a marked section.
+-->
+
+<!-- Feature Switch for frameset documents -->
+<!ENTITY % HTML.Frameset "IGNORE">
+
+<![ %HTML.Frameset; [
+<!ELEMENT FRAMESET - - ((FRAMESET|FRAME)+ & NOFRAMES?) -- window subdivision-->
+<!ATTLIST FRAMESET
+  %coreattrs;                          -- id, class, style, title --
+  rows        %MultiLengths; #IMPLIED  -- list of lengths,
+                                          default: 100% (1 row) --
+  cols        %MultiLengths; #IMPLIED  -- list of lengths,
+                                          default: 100% (1 col) --
+  onload      %Script;       #IMPLIED  -- all the frames have been loaded  -- 
+  onunload    %Script;       #IMPLIED  -- all the frames have been removed -- 
+  >
+]]>
+
+<![ %HTML.Frameset; [
+<!-- reserved frame names start with "_" otherwise starts with letter -->
+<!ELEMENT FRAME - O EMPTY              -- subwindow -->
+<!ATTLIST FRAME
+  %coreattrs;                          -- id, class, style, title --
+  longdesc    %URI;          #IMPLIED  -- link to long description
+                                          (complements title) --
+  name        CDATA          #IMPLIED  -- name of frame for targetting --
+  src         %URI;          #IMPLIED  -- source of frame content --
+  frameborder (1|0)          1         -- request frame borders? --
+  marginwidth %Pixels;       #IMPLIED  -- margin widths in pixels --
+  marginheight %Pixels;      #IMPLIED  -- margin height in pixels --
+  noresize    (noresize)     #IMPLIED  -- allow users to resize frames? --
+  scrolling   (yes|no|auto)  auto      -- scrollbar or none --
+  >
+]]>
+
+<!ELEMENT IFRAME - - (%flow;)*         -- inline subwindow -->
+<!ATTLIST IFRAME
+  %coreattrs;                          -- id, class, style, title --
+  longdesc    %URI;          #IMPLIED  -- link to long description
+                                          (complements title) --
+  name        CDATA          #IMPLIED  -- name of frame for targetting --
+  src         %URI;          #IMPLIED  -- source of frame content --
+  frameborder (1|0)          1         -- request frame borders? --
+  marginwidth %Pixels;       #IMPLIED  -- margin widths in pixels --
+  marginheight %Pixels;      #IMPLIED  -- margin height in pixels --
+  scrolling   (yes|no|auto)  auto      -- scrollbar or none --
+  align       %IAlign;       #IMPLIED  -- vertical or horizontal alignment --
+  height      %Length;       #IMPLIED  -- frame height --
+  width       %Length;       #IMPLIED  -- frame width --
+  >
+
+<![ %HTML.Frameset; [
+<!ENTITY % noframes.content "(BODY) -(NOFRAMES)">
+]]>
+
+<!ENTITY % noframes.content "(%flow;)*">
+
+<!ELEMENT NOFRAMES - - %noframes.content;
+ -- alternate content container for non frame-based rendering -->
+<!ATTLIST NOFRAMES
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!--================ Document Head =======================================-->
+<!-- %head.misc; defined earlier on as "SCRIPT|STYLE|META|LINK|OBJECT" -->
+<!ENTITY % head.content "TITLE & ISINDEX? & BASE?">
+
+<!ELEMENT HEAD O O (%head.content;) +(%head.misc;) -- document head -->
+<!ATTLIST HEAD
+  %i18n;                               -- lang, dir --
+  profile     %URI;          #IMPLIED  -- named dictionary of meta info --
+  >
+
+<!-- The TITLE element is not considered part of the flow of text.
+       It should be displayed, for example as the page header or
+       window title. Exactly one title is required per document.
+    -->
+<!ELEMENT TITLE - - (#PCDATA) -(%head.misc;) -- document title -->
+<!ATTLIST TITLE %i18n>
+
+<!ELEMENT ISINDEX - O EMPTY            -- single line prompt -->
+<!ATTLIST ISINDEX
+  %coreattrs;                          -- id, class, style, title --
+  %i18n;                               -- lang, dir --
+  prompt      %Text;         #IMPLIED  -- prompt message -->
+
+<!ELEMENT BASE - O EMPTY               -- document base URI -->
+<!ATTLIST BASE
+  href        %URI;          #IMPLIED  -- URI that acts as base URI --
+  target      %FrameTarget;  #IMPLIED  -- render in this frame --
+  >
+
+<!ELEMENT META - O EMPTY               -- generic metainformation -->
+<!ATTLIST META
+  %i18n;                               -- lang, dir, for use with content --
+  http-equiv  NAME           #IMPLIED  -- HTTP response header name  --
+  name        NAME           #IMPLIED  -- metainformation name --
+  content     CDATA          #REQUIRED -- associated information --
+  scheme      CDATA          #IMPLIED  -- select form of content --
+  >
+
+<!ELEMENT STYLE - - %StyleSheet        -- style info -->
+<!ATTLIST STYLE
+  %i18n;                               -- lang, dir, for use with title --
+  type        %ContentType;  #REQUIRED -- content type of style language --
+  media       %MediaDesc;    #IMPLIED  -- designed for use with these media --
+  title       %Text;         #IMPLIED  -- advisory title --
+  >
+
+<!ELEMENT SCRIPT - - %Script;          -- script statements -->
+<!ATTLIST SCRIPT
+  charset     %Charset;      #IMPLIED  -- char encoding of linked resource --
+  type        %ContentType;  #REQUIRED -- content type of script language --
+  language    CDATA          #IMPLIED  -- predefined script language name --
+  src         %URI;          #IMPLIED  -- URI for an external script --
+  defer       (defer)        #IMPLIED  -- UA may defer execution of script --
+  event       CDATA          #IMPLIED  -- reserved for possible future use --
+  for         %URI;          #IMPLIED  -- reserved for possible future use --
+  >
+
+<!ELEMENT NOSCRIPT - - (%flow;)*
+  -- alternate content container for non script-based rendering -->
+<!ATTLIST NOSCRIPT
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!--================ Document Structure ==================================-->
+<!ENTITY % version "version CDATA #FIXED '%HTML.Version;'">
+
+<![ %HTML.Frameset; [
+<!ENTITY % html.content "HEAD, FRAMESET">
+]]>
+
+<!ENTITY % html.content "HEAD, BODY">
+
+<!ELEMENT HTML O O (%html.content;)    -- document root element -->
+<!ATTLIST HTML
+  %i18n;                               -- lang, dir --
+  %version;
+  >
diff --git a/pubtext/HTML4.soc b/pubtext/HTML4.soc
new file mode 100644 (file)
index 0000000..ec4825f
--- /dev/null
@@ -0,0 +1,9 @@
+OVERRIDE YES
+SGMLDECL HTML4.dcl
+DOCTYPE HTML HTML4.dtd
+PUBLIC "-//W3C//DTD HTML 4.0//EN" HTML4-s.dtd
+PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" HTML4.dtd
+PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN" HTML4-f.dtd
+PUBLIC "-//W3C//ENTITIES Latin1//EN//HTML" HTMLlat1.ent
+PUBLIC "-//W3C//ENTITIES Special//EN//HTML" HTMLspec.ent
+PUBLIC "-//W3C//ENTITIES Symbols//EN//HTML" HTMLsym.ent
diff --git a/pubtext/HTMLlat1.ent b/pubtext/HTMLlat1.ent
new file mode 100644 (file)
index 0000000..7632023
--- /dev/null
@@ -0,0 +1,195 @@
+<!-- Portions (C) International Organization for Standardization 1986
+     Permission to copy in any form is granted for use with
+     conforming SGML systems and applications as defined in
+     ISO 8879, provided this notice is included in all copies.
+-->
+<!-- Character entity set. Typical invocation:
+     <!ENTITY % HTMLlat1 PUBLIC
+       "-//W3C//ENTITIES Full Latin 1//EN//HTML">
+     %HTMLlat1;
+-->
+
+<!ENTITY nbsp   CDATA "&#160;" -- no-break space = non-breaking space,
+                                  U+00A0 ISOnum -->
+<!ENTITY iexcl  CDATA "&#161;" -- inverted exclamation mark, U+00A1 ISOnum -->
+<!ENTITY cent   CDATA "&#162;" -- cent sign, U+00A2 ISOnum -->
+<!ENTITY pound  CDATA "&#163;" -- pound sign, U+00A3 ISOnum -->
+<!ENTITY curren CDATA "&#164;" -- currency sign, U+00A4 ISOnum -->
+<!ENTITY yen    CDATA "&#165;" -- yen sign = yuan sign, U+00A5 ISOnum -->
+<!ENTITY brvbar CDATA "&#166;" -- broken bar = broken vertical bar,
+                                  U+00A6 ISOnum -->
+<!ENTITY sect   CDATA "&#167;" -- section sign, U+00A7 ISOnum -->
+<!ENTITY uml    CDATA "&#168;" -- diaeresis = spacing diaeresis,
+                                  U+00A8 ISOdia -->
+<!ENTITY copy   CDATA "&#169;" -- copyright sign, U+00A9 ISOnum -->
+<!ENTITY ordf   CDATA "&#170;" -- feminine ordinal indicator, U+00AA ISOnum -->
+<!ENTITY laquo  CDATA "&#171;" -- left-pointing double angle quotation mark
+                                  = left pointing guillemet, U+00AB ISOnum -->
+<!ENTITY not    CDATA "&#172;" -- not sign = discretionary hyphen,
+                                  U+00AC ISOnum -->
+<!ENTITY shy    CDATA "&#173;" -- soft hyphen = discretionary hyphen,
+                                  U+00AD ISOnum -->
+<!ENTITY reg    CDATA "&#174;" -- registered sign = registered trade mark sign,
+                                  U+00AE ISOnum -->
+<!ENTITY macr   CDATA "&#175;" -- macron = spacing macron = overline
+                                  = APL overbar, U+00AF ISOdia -->
+<!ENTITY deg    CDATA "&#176;" -- degree sign, U+00B0 ISOnum -->
+<!ENTITY plusmn CDATA "&#177;" -- plus-minus sign = plus-or-minus sign,
+                                  U+00B1 ISOnum -->
+<!ENTITY sup2   CDATA "&#178;" -- superscript two = superscript digit two
+                                  = squared, U+00B2 ISOnum -->
+<!ENTITY sup3   CDATA "&#179;" -- superscript three = superscript digit three
+                                  = cubed, U+00B3 ISOnum -->
+<!ENTITY acute  CDATA "&#180;" -- acute accent = spacing acute,
+                                  U+00B4 ISOdia -->
+<!ENTITY micro  CDATA "&#181;" -- micro sign, U+00B5 ISOnum -->
+<!ENTITY para   CDATA "&#182;" -- pilcrow sign = paragraph sign,
+                                  U+00B6 ISOnum -->
+<!ENTITY middot CDATA "&#183;" -- middle dot = Georgian comma
+                                  = Greek middle dot, U+00B7 ISOnum -->
+<!ENTITY cedil  CDATA "&#184;" -- cedilla = spacing cedilla, U+00B8 ISOdia -->
+<!ENTITY sup1   CDATA "&#185;" -- superscript one = superscript digit one,
+                                  U+00B9 ISOnum -->
+<!ENTITY ordm   CDATA "&#186;" -- masculine ordinal indicator,
+                                  U+00BA ISOnum -->
+<!ENTITY raquo  CDATA "&#187;" -- right-pointing double angle quotation mark
+                                  = right pointing guillemet, U+00BB ISOnum -->
+<!ENTITY frac14 CDATA "&#188;" -- vulgar fraction one quarter
+                                  = fraction one quarter, U+00BC ISOnum -->
+<!ENTITY frac12 CDATA "&#189;" -- vulgar fraction one half
+                                  = fraction one half, U+00BD ISOnum -->
+<!ENTITY frac34 CDATA "&#190;" -- vulgar fraction three quarters
+                                  = fraction three quarters, U+00BE ISOnum -->
+<!ENTITY iquest CDATA "&#191;" -- inverted question mark
+                                  = turned question mark, U+00BF ISOnum -->
+<!ENTITY Agrave CDATA "&#192;" -- latin capital letter A with grave
+                                  = latin capital letter A grave,
+                                  U+00C0 ISOlat1 -->
+<!ENTITY Aacute CDATA "&#193;" -- latin capital letter A with acute,
+                                  U+00C1 ISOlat1 -->
+<!ENTITY Acirc  CDATA "&#194;" -- latin capital letter A with circumflex,
+                                  U+00C2 ISOlat1 -->
+<!ENTITY Atilde CDATA "&#195;" -- latin capital letter A with tilde,
+                                  U+00C3 ISOlat1 -->
+<!ENTITY Auml   CDATA "&#196;" -- latin capital letter A with diaeresis,
+                                  U+00C4 ISOlat1 -->
+<!ENTITY Aring  CDATA "&#197;" -- latin capital letter A with ring above
+                                  = latin capital letter A ring,
+                                  U+00C5 ISOlat1 -->
+<!ENTITY AElig  CDATA "&#198;" -- latin capital letter AE
+                                  = latin capital ligature AE,
+                                  U+00C6 ISOlat1 -->
+<!ENTITY Ccedil CDATA "&#199;" -- latin capital letter C with cedilla,
+                                  U+00C7 ISOlat1 -->
+<!ENTITY Egrave CDATA "&#200;" -- latin capital letter E with grave,
+                                  U+00C8 ISOlat1 -->
+<!ENTITY Eacute CDATA "&#201;" -- latin capital letter E with acute,
+                                  U+00C9 ISOlat1 -->
+<!ENTITY Ecirc  CDATA "&#202;" -- latin capital letter E with circumflex,
+                                  U+00CA ISOlat1 -->
+<!ENTITY Euml   CDATA "&#203;" -- latin capital letter E with diaeresis,
+                                  U+00CB ISOlat1 -->
+<!ENTITY Igrave CDATA "&#204;" -- latin capital letter I with grave,
+                                  U+00CC ISOlat1 -->
+<!ENTITY Iacute CDATA "&#205;" -- latin capital letter I with acute,
+                                  U+00CD ISOlat1 -->
+<!ENTITY Icirc  CDATA "&#206;" -- latin capital letter I with circumflex,
+                                  U+00CE ISOlat1 -->
+<!ENTITY Iuml   CDATA "&#207;" -- latin capital letter I with diaeresis,
+                                  U+00CF ISOlat1 -->
+<!ENTITY ETH    CDATA "&#208;" -- latin capital letter ETH, U+00D0 ISOlat1 -->
+<!ENTITY Ntilde CDATA "&#209;" -- latin capital letter N with tilde,
+                                  U+00D1 ISOlat1 -->
+<!ENTITY Ograve CDATA "&#210;" -- latin capital letter O with grave,
+                                  U+00D2 ISOlat1 -->
+<!ENTITY Oacute CDATA "&#211;" -- latin capital letter O with acute,
+                                  U+00D3 ISOlat1 -->
+<!ENTITY Ocirc  CDATA "&#212;" -- latin capital letter O with circumflex,
+                                  U+00D4 ISOlat1 -->
+<!ENTITY Otilde CDATA "&#213;" -- latin capital letter O with tilde,
+                                  U+00D5 ISOlat1 -->
+<!ENTITY Ouml   CDATA "&#214;" -- latin capital letter O with diaeresis,
+                                  U+00D6 ISOlat1 -->
+<!ENTITY times  CDATA "&#215;" -- multiplication sign, U+00D7 ISOnum -->
+<!ENTITY Oslash CDATA "&#216;" -- latin capital letter O with stroke
+                                  = latin capital letter O slash,
+                                  U+00D8 ISOlat1 -->
+<!ENTITY Ugrave CDATA "&#217;" -- latin capital letter U with grave,
+                                  U+00D9 ISOlat1 -->
+<!ENTITY Uacute CDATA "&#218;" -- latin capital letter U with acute,
+                                  U+00DA ISOlat1 -->
+<!ENTITY Ucirc  CDATA "&#219;" -- latin capital letter U with circumflex,
+                                  U+00DB ISOlat1 -->
+<!ENTITY Uuml   CDATA "&#220;" -- latin capital letter U with diaeresis,
+                                  U+00DC ISOlat1 -->
+<!ENTITY Yacute CDATA "&#221;" -- latin capital letter Y with acute,
+                                  U+00DD ISOlat1 -->
+<!ENTITY THORN  CDATA "&#222;" -- latin capital letter THORN,
+                                  U+00DE ISOlat1 -->
+<!ENTITY szlig  CDATA "&#223;" -- latin small letter sharp s = ess-zed,
+                                  U+00DF ISOlat1 -->
+<!ENTITY agrave CDATA "&#224;" -- latin small letter a with grave
+                                  = latin small letter a grave,
+                                  U+00E0 ISOlat1 -->
+<!ENTITY aacute CDATA "&#225;" -- latin small letter a with acute,
+                                  U+00E1 ISOlat1 -->
+<!ENTITY acirc  CDATA "&#226;" -- latin small letter a with circumflex,
+                                  U+00E2 ISOlat1 -->
+<!ENTITY atilde CDATA "&#227;" -- latin small letter a with tilde,
+                                  U+00E3 ISOlat1 -->
+<!ENTITY auml   CDATA "&#228;" -- latin small letter a with diaeresis,
+                                  U+00E4 ISOlat1 -->
+<!ENTITY aring  CDATA "&#229;" -- latin small letter a with ring above
+                                  = latin small letter a ring,
+                                  U+00E5 ISOlat1 -->
+<!ENTITY aelig  CDATA "&#230;" -- latin small letter ae
+                                  = latin small ligature ae, U+00E6 ISOlat1 -->
+<!ENTITY ccedil CDATA "&#231;" -- latin small letter c with cedilla,
+                                  U+00E7 ISOlat1 -->
+<!ENTITY egrave CDATA "&#232;" -- latin small letter e with grave,
+                                  U+00E8 ISOlat1 -->
+<!ENTITY eacute CDATA "&#233;" -- latin small letter e with acute,
+                                  U+00E9 ISOlat1 -->
+<!ENTITY ecirc  CDATA "&#234;" -- latin small letter e with circumflex,
+                                  U+00EA ISOlat1 -->
+<!ENTITY euml   CDATA "&#235;" -- latin small letter e with diaeresis,
+                                  U+00EB ISOlat1 -->
+<!ENTITY igrave CDATA "&#236;" -- latin small letter i with grave,
+                                  U+00EC ISOlat1 -->
+<!ENTITY iacute CDATA "&#237;" -- latin small letter i with acute,
+                                  U+00ED ISOlat1 -->
+<!ENTITY icirc  CDATA "&#238;" -- latin small letter i with circumflex,
+                                  U+00EE ISOlat1 -->
+<!ENTITY iuml   CDATA "&#239;" -- latin small letter i with diaeresis,
+                                  U+00EF ISOlat1 -->
+<!ENTITY eth    CDATA "&#240;" -- latin small letter eth, U+00F0 ISOlat1 -->
+<!ENTITY ntilde CDATA "&#241;" -- latin small letter n with tilde,
+                                  U+00F1 ISOlat1 -->
+<!ENTITY ograve CDATA "&#242;" -- latin small letter o with grave,
+                                  U+00F2 ISOlat1 -->
+<!ENTITY oacute CDATA "&#243;" -- latin small letter o with acute,
+                                  U+00F3 ISOlat1 -->
+<!ENTITY ocirc  CDATA "&#244;" -- latin small letter o with circumflex,
+                                  U+00F4 ISOlat1 -->
+<!ENTITY otilde CDATA "&#245;" -- latin small letter o with tilde,
+                                  U+00F5 ISOlat1 -->
+<!ENTITY ouml   CDATA "&#246;" -- latin small letter o with diaeresis,
+                                  U+00F6 ISOlat1 -->
+<!ENTITY divide CDATA "&#247;" -- division sign, U+00F7 ISOnum -->
+<!ENTITY oslash CDATA "&#248;" -- latin small letter o with stroke,
+                                  = latin small letter o slash,
+                                  U+00F8 ISOlat1 -->
+<!ENTITY ugrave CDATA "&#249;" -- latin small letter u with grave,
+                                  U+00F9 ISOlat1 -->
+<!ENTITY uacute CDATA "&#250;" -- latin small letter u with acute,
+                                  U+00FA ISOlat1 -->
+<!ENTITY ucirc  CDATA "&#251;" -- latin small letter u with circumflex,
+                                  U+00FB ISOlat1 -->
+<!ENTITY uuml   CDATA "&#252;" -- latin small letter u with diaeresis,
+                                  U+00FC ISOlat1 -->
+<!ENTITY yacute CDATA "&#253;" -- latin small letter y with acute,
+                                  U+00FD ISOlat1 -->
+<!ENTITY thorn  CDATA "&#254;" -- latin small letter thorn with,
+                                  U+00FE ISOlat1 -->
+<!ENTITY yuml   CDATA "&#255;" -- latin small letter y with diaeresis,
+                                  U+00FF ISOlat1 -->
\ No newline at end of file
diff --git a/pubtext/HTMLspec.ent b/pubtext/HTMLspec.ent
new file mode 100644 (file)
index 0000000..29011cc
--- /dev/null
@@ -0,0 +1,77 @@
+<!-- Special characters for HTML -->
+
+<!-- Character entity set. Typical invocation:
+     <!ENTITY % HTMLspecial PUBLIC
+       "-//W3C//ENTITIES Special//EN//HTML">
+     %HTMLspecial; -->
+
+<!-- Portions (C) International Organization for Standardization 1986:
+     Permission to copy in any form is granted for use with
+     conforming SGML systems and applications as defined in
+     ISO 8879, provided this notice is included in all copies.
+-->
+
+<!-- Relevant ISO entity set is given unless names are newly introduced.
+     New names (i.e., not in ISO 8879 list) do not clash with any
+     existing ISO 8879 entity names. ISO 10646 character numbers
+     are given for each character, in hex. CDATA values are decimal
+     conversions of the ISO 10646 values and refer to the document
+     character set. Names are Unicode 2.0 names. 
+
+-->
+
+<!-- C0 Controls and Basic Latin -->
+<!ENTITY quot    CDATA "&#34;"   -- quotation mark = APL quote,
+                                    U+0022 ISOnum -->
+<!ENTITY amp     CDATA "&#38;"   -- ampersand, U+0026 ISOnum -->
+<!ENTITY lt      CDATA "&#60;"   -- less-than sign, U+003C ISOnum -->
+<!ENTITY gt      CDATA "&#62;"   -- greater-than sign, U+003E ISOnum -->
+
+<!-- Latin Extended-A -->
+<!ENTITY OElig   CDATA "&#338;"  -- latin capital ligature OE,
+                                    U+0152 ISOlat2 -->
+<!ENTITY oelig   CDATA "&#339;"  -- latin small ligature oe, U+0153 ISOlat2 -->
+<!-- ligature is a misnomer, this is a separate character in some languages -->
+<!ENTITY Scaron  CDATA "&#352;"  -- latin capital letter S with caron,
+                                    U+0160 ISOlat2 -->
+<!ENTITY scaron  CDATA "&#353;"  -- latin small letter s with caron,
+                                    U+0161 ISOlat2 -->
+<!ENTITY Yuml    CDATA "&#376;"  -- latin capital letter Y with diaeresis,
+                                    U+0178 ISOlat2 -->
+
+<!-- Spacing Modifier Letters -->
+<!ENTITY circ    CDATA "&#710;"  -- modifier letter circumflex accent,
+                                    U+02C6 ISOpub -->
+<!ENTITY tilde   CDATA "&#732;"  -- small tilde, U+02DC ISOdia -->
+
+<!-- General Punctuation -->
+<!ENTITY ensp    CDATA "&#8194;" -- en space, U+2002 ISOpub -->
+<!ENTITY emsp    CDATA "&#8195;" -- em space, U+2003 ISOpub -->
+<!ENTITY thinsp  CDATA "&#8201;" -- thin space, U+2009 ISOpub -->
+<!ENTITY zwnj    CDATA "&#8204;" -- zero width non-joiner,
+                                    U+200C NEW RFC 2070 -->
+<!ENTITY zwj     CDATA "&#8205;" -- zero width joiner, U+200D NEW RFC 2070 -->
+<!ENTITY lrm     CDATA "&#8206;" -- left-to-right mark, U+200E NEW RFC 2070 -->
+<!ENTITY rlm     CDATA "&#8207;" -- right-to-left mark, U+200F NEW RFC 2070 -->
+<!ENTITY ndash   CDATA "&#8211;" -- en dash, U+2013 ISOpub -->
+<!ENTITY mdash   CDATA "&#8212;" -- em dash, U+2014 ISOpub -->
+<!ENTITY lsquo   CDATA "&#8216;" -- left single quotation mark,
+                                    U+2018 ISOnum -->
+<!ENTITY rsquo   CDATA "&#8217;" -- right single quotation mark,
+                                    U+2019 ISOnum -->
+<!ENTITY sbquo   CDATA "&#8218;" -- single low-9 quotation mark, U+201A NEW -->
+<!ENTITY ldquo   CDATA "&#8220;" -- left double quotation mark,
+                                    U+201C ISOnum -->
+<!ENTITY rdquo   CDATA "&#8221;" -- right double quotation mark,
+                                    U+201D ISOnum -->
+<!ENTITY bdquo   CDATA "&#8222;" -- double low-9 quotation mark, U+201E NEW -->
+<!ENTITY dagger  CDATA "&#8224;" -- dagger, U+2020 ISOpub -->
+<!ENTITY Dagger  CDATA "&#8225;" -- double dagger, U+2021 ISOpub -->
+<!ENTITY permil  CDATA "&#8240;" -- per mille sign, U+2030 ISOtech -->
+<!ENTITY lsaquo  CDATA "&#8249;" -- single left-pointing angle quotation mark,
+                                    U+2039 ISO proposed -->
+<!-- lsaquo is proposed but not yet ISO standardized -->
+<!ENTITY rsaquo  CDATA "&#8250;" -- single right-pointing angle quotation mark,
+                                    U+203A ISO proposed -->
+<!-- rsaquo is proposed but not yet ISO standardized -->
+<!ENTITY euro   CDATA "&#8364;"  -- euro sign, U+20AC NEW -->
\ No newline at end of file
diff --git a/pubtext/HTMLsym.ent b/pubtext/HTMLsym.ent
new file mode 100644 (file)
index 0000000..2a6250b
--- /dev/null
@@ -0,0 +1,241 @@
+<!-- Mathematical, Greek and Symbolic characters for HTML -->
+
+<!-- Character entity set. Typical invocation:
+     <!ENTITY % HTMLsymbol PUBLIC
+       "-//W3C//ENTITIES Symbolic//EN//HTML">
+     %HTMLsymbol; -->
+
+<!-- Portions (C) International Organization for Standardization 1986:
+     Permission to copy in any form is granted for use with
+     conforming SGML systems and applications as defined in
+     ISO 8879, provided this notice is included in all copies.
+-->
+
+<!-- Relevant ISO entity set is given unless names are newly introduced.
+     New names (i.e., not in ISO 8879 list) do not clash with any
+     existing ISO 8879 entity names. ISO 10646 character numbers
+     are given for each character, in hex. CDATA values are decimal
+     conversions of the ISO 10646 values and refer to the document
+     character set. Names are Unicode 2.0 names. 
+
+-->
+
+<!-- Latin Extended-B -->
+<!ENTITY fnof     CDATA "&#402;" -- latin small f with hook = function
+                                    = florin, U+0192 ISOtech -->
+
+<!-- Greek -->
+<!ENTITY Alpha    CDATA "&#913;" -- greek capital letter alpha, U+0391 -->
+<!ENTITY Beta     CDATA "&#914;" -- greek capital letter beta, U+0392 -->
+<!ENTITY Gamma    CDATA "&#915;" -- greek capital letter gamma,
+                                    U+0393 ISOgrk3 -->
+<!ENTITY Delta    CDATA "&#916;" -- greek capital letter delta,
+                                    U+0394 ISOgrk3 -->
+<!ENTITY Epsilon  CDATA "&#917;" -- greek capital letter epsilon, U+0395 -->
+<!ENTITY Zeta     CDATA "&#918;" -- greek capital letter zeta, U+0396 -->
+<!ENTITY Eta      CDATA "&#919;" -- greek capital letter eta, U+0397 -->
+<!ENTITY Theta    CDATA "&#920;" -- greek capital letter theta,
+                                    U+0398 ISOgrk3 -->
+<!ENTITY Iota     CDATA "&#921;" -- greek capital letter iota, U+0399 -->
+<!ENTITY Kappa    CDATA "&#922;" -- greek capital letter kappa, U+039A -->
+<!ENTITY Lambda   CDATA "&#923;" -- greek capital letter lambda,
+                                    U+039B ISOgrk3 -->
+<!ENTITY Mu       CDATA "&#924;" -- greek capital letter mu, U+039C -->
+<!ENTITY Nu       CDATA "&#925;" -- greek capital letter nu, U+039D -->
+<!ENTITY Xi       CDATA "&#926;" -- greek capital letter xi, U+039E ISOgrk3 -->
+<!ENTITY Omicron  CDATA "&#927;" -- greek capital letter omicron, U+039F -->
+<!ENTITY Pi       CDATA "&#928;" -- greek capital letter pi, U+03A0 ISOgrk3 -->
+<!ENTITY Rho      CDATA "&#929;" -- greek capital letter rho, U+03A1 -->
+<!-- there is no Sigmaf, and no U+03A2 character either -->
+<!ENTITY Sigma    CDATA "&#931;" -- greek capital letter sigma,
+                                    U+03A3 ISOgrk3 -->
+<!ENTITY Tau      CDATA "&#932;" -- greek capital letter tau, U+03A4 -->
+<!ENTITY Upsilon  CDATA "&#933;" -- greek capital letter upsilon,
+                                    U+03A5 ISOgrk3 -->
+<!ENTITY Phi      CDATA "&#934;" -- greek capital letter phi,
+                                    U+03A6 ISOgrk3 -->
+<!ENTITY Chi      CDATA "&#935;" -- greek capital letter chi, U+03A7 -->
+<!ENTITY Psi      CDATA "&#936;" -- greek capital letter psi,
+                                    U+03A8 ISOgrk3 -->
+<!ENTITY Omega    CDATA "&#937;" -- greek capital letter omega,
+                                    U+03A9 ISOgrk3 -->
+
+<!ENTITY alpha    CDATA "&#945;" -- greek small letter alpha,
+                                    U+03B1 ISOgrk3 -->
+<!ENTITY beta     CDATA "&#946;" -- greek small letter beta, U+03B2 ISOgrk3 -->
+<!ENTITY gamma    CDATA "&#947;" -- greek small letter gamma,
+                                    U+03B3 ISOgrk3 -->
+<!ENTITY delta    CDATA "&#948;" -- greek small letter delta,
+                                    U+03B4 ISOgrk3 -->
+<!ENTITY epsilon  CDATA "&#949;" -- greek small letter epsilon,
+                                    U+03B5 ISOgrk3 -->
+<!ENTITY zeta     CDATA "&#950;" -- greek small letter zeta, U+03B6 ISOgrk3 -->
+<!ENTITY eta      CDATA "&#951;" -- greek small letter eta, U+03B7 ISOgrk3 -->
+<!ENTITY theta    CDATA "&#952;" -- greek small letter theta,
+                                    U+03B8 ISOgrk3 -->
+<!ENTITY iota     CDATA "&#953;" -- greek small letter iota, U+03B9 ISOgrk3 -->
+<!ENTITY kappa    CDATA "&#954;" -- greek small letter kappa,
+                                    U+03BA ISOgrk3 -->
+<!ENTITY lambda   CDATA "&#955;" -- greek small letter lambda,
+                                    U+03BB ISOgrk3 -->
+<!ENTITY mu       CDATA "&#956;" -- greek small letter mu, U+03BC ISOgrk3 -->
+<!ENTITY nu       CDATA "&#957;" -- greek small letter nu, U+03BD ISOgrk3 -->
+<!ENTITY xi       CDATA "&#958;" -- greek small letter xi, U+03BE ISOgrk3 -->
+<!ENTITY omicron  CDATA "&#959;" -- greek small letter omicron, U+03BF NEW -->
+<!ENTITY pi       CDATA "&#960;" -- greek small letter pi, U+03C0 ISOgrk3 -->
+<!ENTITY rho      CDATA "&#961;" -- greek small letter rho, U+03C1 ISOgrk3 -->
+<!ENTITY sigmaf   CDATA "&#962;" -- greek small letter final sigma,
+                                    U+03C2 ISOgrk3 -->
+<!ENTITY sigma    CDATA "&#963;" -- greek small letter sigma,
+                                    U+03C3 ISOgrk3 -->
+<!ENTITY tau      CDATA "&#964;" -- greek small letter tau, U+03C4 ISOgrk3 -->
+<!ENTITY upsilon  CDATA "&#965;" -- greek small letter upsilon,
+                                    U+03C5 ISOgrk3 -->
+<!ENTITY phi      CDATA "&#966;" -- greek small letter phi, U+03C6 ISOgrk3 -->
+<!ENTITY chi      CDATA "&#967;" -- greek small letter chi, U+03C7 ISOgrk3 -->
+<!ENTITY psi      CDATA "&#968;" -- greek small letter psi, U+03C8 ISOgrk3 -->
+<!ENTITY omega    CDATA "&#969;" -- greek small letter omega,
+                                    U+03C9 ISOgrk3 -->
+<!ENTITY thetasym CDATA "&#977;" -- greek small letter theta symbol,
+                                    U+03D1 NEW -->
+<!ENTITY upsih    CDATA "&#978;" -- greek upsilon with hook symbol,
+                                    U+03D2 NEW -->
+<!ENTITY piv      CDATA "&#982;" -- greek pi symbol, U+03D6 ISOgrk3 -->
+
+<!-- General Punctuation -->
+<!ENTITY bull     CDATA "&#8226;" -- bullet = black small circle,
+                                     U+2022 ISOpub  -->
+<!-- bullet is NOT the same as bullet operator, U+2219 -->
+<!ENTITY hellip   CDATA "&#8230;" -- horizontal ellipsis = three dot leader,
+                                     U+2026 ISOpub  -->
+<!ENTITY prime    CDATA "&#8242;" -- prime = minutes = feet, U+2032 ISOtech -->
+<!ENTITY Prime    CDATA "&#8243;" -- double prime = seconds = inches,
+                                     U+2033 ISOtech -->
+<!ENTITY oline    CDATA "&#8254;" -- overline = spacing overscore,
+                                     U+203E NEW -->
+<!ENTITY frasl    CDATA "&#8260;" -- fraction slash, U+2044 NEW -->
+
+<!-- Letterlike Symbols -->
+<!ENTITY weierp   CDATA "&#8472;" -- script capital P = power set
+                                     = Weierstrass p, U+2118 ISOamso -->
+<!ENTITY image    CDATA "&#8465;" -- blackletter capital I = imaginary part,
+                                     U+2111 ISOamso -->
+<!ENTITY real     CDATA "&#8476;" -- blackletter capital R = real part symbol,
+                                     U+211C ISOamso -->
+<!ENTITY trade    CDATA "&#8482;" -- trade mark sign, U+2122 ISOnum -->
+<!ENTITY alefsym  CDATA "&#8501;" -- alef symbol = first transfinite cardinal,
+                                     U+2135 NEW -->
+<!-- alef symbol is NOT the same as hebrew letter alef,
+     U+05D0 although the same glyph could be used to depict both characters -->
+
+<!-- Arrows -->
+<!ENTITY larr     CDATA "&#8592;" -- leftwards arrow, U+2190 ISOnum -->
+<!ENTITY uarr     CDATA "&#8593;" -- upwards arrow, U+2191 ISOnum-->
+<!ENTITY rarr     CDATA "&#8594;" -- rightwards arrow, U+2192 ISOnum -->
+<!ENTITY darr     CDATA "&#8595;" -- downwards arrow, U+2193 ISOnum -->
+<!ENTITY harr     CDATA "&#8596;" -- left right arrow, U+2194 ISOamsa -->
+<!ENTITY crarr    CDATA "&#8629;" -- downwards arrow with corner leftwards
+                                     = carriage return, U+21B5 NEW -->
+<!ENTITY lArr     CDATA "&#8656;" -- leftwards double arrow, U+21D0 ISOtech -->
+<!-- Unicode does not say that lArr is the same as the 'is implied by' arrow
+    but also does not have any other character for that function. So ? lArr can
+    be used for 'is implied by' as ISOtech suggests -->
+<!ENTITY uArr     CDATA "&#8657;" -- upwards double arrow, U+21D1 ISOamsa -->
+<!ENTITY rArr     CDATA "&#8658;" -- rightwards double arrow,
+                                     U+21D2 ISOtech -->
+<!-- Unicode does not say this is the 'implies' character but does not have 
+     another character with this function so ?
+     rArr can be used for 'implies' as ISOtech suggests -->
+<!ENTITY dArr     CDATA "&#8659;" -- downwards double arrow, U+21D3 ISOamsa -->
+<!ENTITY hArr     CDATA "&#8660;" -- left right double arrow,
+                                     U+21D4 ISOamsa -->
+
+<!-- Mathematical Operators -->
+<!ENTITY forall   CDATA "&#8704;" -- for all, U+2200 ISOtech -->
+<!ENTITY part     CDATA "&#8706;" -- partial differential, U+2202 ISOtech  -->
+<!ENTITY exist    CDATA "&#8707;" -- there exists, U+2203 ISOtech -->
+<!ENTITY empty    CDATA "&#8709;" -- empty set = null set = diameter,
+                                     U+2205 ISOamso -->
+<!ENTITY nabla    CDATA "&#8711;" -- nabla = backward difference,
+                                     U+2207 ISOtech -->
+<!ENTITY isin     CDATA "&#8712;" -- element of, U+2208 ISOtech -->
+<!ENTITY notin    CDATA "&#8713;" -- not an element of, U+2209 ISOtech -->
+<!ENTITY ni       CDATA "&#8715;" -- contains as member, U+220B ISOtech -->
+<!-- should there be a more memorable name than 'ni'? -->
+<!ENTITY prod     CDATA "&#8719;" -- n-ary product = product sign,
+                                     U+220F ISOamsb -->
+<!-- prod is NOT the same character as U+03A0 'greek capital letter pi' though
+     the same glyph might be used for both -->
+<!ENTITY sum      CDATA "&#8721;" -- n-ary sumation, U+2211 ISOamsb -->
+<!-- sum is NOT the same character as U+03A3 'greek capital letter sigma'
+     though the same glyph might be used for both -->
+<!ENTITY minus    CDATA "&#8722;" -- minus sign, U+2212 ISOtech -->
+<!ENTITY lowast   CDATA "&#8727;" -- asterisk operator, U+2217 ISOtech -->
+<!ENTITY radic    CDATA "&#8730;" -- square root = radical sign,
+                                     U+221A ISOtech -->
+<!ENTITY prop     CDATA "&#8733;" -- proportional to, U+221D ISOtech -->
+<!ENTITY infin    CDATA "&#8734;" -- infinity, U+221E ISOtech -->
+<!ENTITY ang      CDATA "&#8736;" -- angle, U+2220 ISOamso -->
+<!ENTITY and      CDATA "&#8743;" -- logical and = wedge, U+2227 ISOtech -->
+<!ENTITY or       CDATA "&#8744;" -- logical or = vee, U+2228 ISOtech -->
+<!ENTITY cap      CDATA "&#8745;" -- intersection = cap, U+2229 ISOtech -->
+<!ENTITY cup      CDATA "&#8746;" -- union = cup, U+222A ISOtech -->
+<!ENTITY int      CDATA "&#8747;" -- integral, U+222B ISOtech -->
+<!ENTITY there4   CDATA "&#8756;" -- therefore, U+2234 ISOtech -->
+<!ENTITY sim      CDATA "&#8764;" -- tilde operator = varies with = similar to,
+                                     U+223C ISOtech -->
+<!-- tilde operator is NOT the same character as the tilde, U+007E,
+     although the same glyph might be used to represent both  -->
+<!ENTITY cong     CDATA "&#8773;" -- approximately equal to, U+2245 ISOtech -->
+<!ENTITY asymp    CDATA "&#8776;" -- almost equal to = asymptotic to,
+                                     U+2248 ISOamsr -->
+<!ENTITY ne       CDATA "&#8800;" -- not equal to, U+2260 ISOtech -->
+<!ENTITY equiv    CDATA "&#8801;" -- identical to, U+2261 ISOtech -->
+<!ENTITY le       CDATA "&#8804;" -- less-than or equal to, U+2264 ISOtech -->
+<!ENTITY ge       CDATA "&#8805;" -- greater-than or equal to,
+                                     U+2265 ISOtech -->
+<!ENTITY sub      CDATA "&#8834;" -- subset of, U+2282 ISOtech -->
+<!ENTITY sup      CDATA "&#8835;" -- superset of, U+2283 ISOtech -->
+<!-- note that nsup, 'not a superset of, U+2283' is not covered by the Symbol 
+     font encoding and is not included. Should it be, for symmetry?
+     It is in ISOamsn  --> 
+<!ENTITY nsub     CDATA "&#8836;" -- not a subset of, U+2284 ISOamsn -->
+<!ENTITY sube     CDATA "&#8838;" -- subset of or equal to, U+2286 ISOtech -->
+<!ENTITY supe     CDATA "&#8839;" -- superset of or equal to,
+                                     U+2287 ISOtech -->
+<!ENTITY oplus    CDATA "&#8853;" -- circled plus = direct sum,
+                                     U+2295 ISOamsb -->
+<!ENTITY otimes   CDATA "&#8855;" -- circled times = vector product,
+                                     U+2297 ISOamsb -->
+<!ENTITY perp     CDATA "&#8869;" -- up tack = orthogonal to = perpendicular,
+                                     U+22A5 ISOtech -->
+<!ENTITY sdot     CDATA "&#8901;" -- dot operator, U+22C5 ISOamsb -->
+<!-- dot operator is NOT the same character as U+00B7 middle dot -->
+
+<!-- Miscellaneous Technical -->
+<!ENTITY lceil    CDATA "&#8968;" -- left ceiling = apl upstile,
+                                     U+2308 ISOamsc  -->
+<!ENTITY rceil    CDATA "&#8969;" -- right ceiling, U+2309 ISOamsc  -->
+<!ENTITY lfloor   CDATA "&#8970;" -- left floor = apl downstile,
+                                     U+230A ISOamsc  -->
+<!ENTITY rfloor   CDATA "&#8971;" -- right floor, U+230B ISOamsc  -->
+<!ENTITY lang     CDATA "&#9001;" -- left-pointing angle bracket = bra,
+                                     U+2329 ISOtech -->
+<!-- lang is NOT the same character as U+003C 'less than' 
+     or U+2039 'single left-pointing angle quotation mark' -->
+<!ENTITY rang     CDATA "&#9002;" -- right-pointing angle bracket = ket,
+                                     U+232A ISOtech -->
+<!-- rang is NOT the same character as U+003E 'greater than' 
+     or U+203A 'single right-pointing angle quotation mark' -->
+
+<!-- Geometric Shapes -->
+<!ENTITY loz      CDATA "&#9674;" -- lozenge, U+25CA ISOpub -->
+
+<!-- Miscellaneous Symbols -->
+<!ENTITY spades   CDATA "&#9824;" -- black spade suit, U+2660 ISOpub -->
+<!-- black here seems to mean filled as opposed to hollow -->
+<!ENTITY clubs    CDATA "&#9827;" -- black club suit = shamrock,
+                                     U+2663 ISOpub -->
+<!ENTITY hearts   CDATA "&#9829;" -- black heart suit = valentine,
+                                     U+2665 ISOpub -->
+<!ENTITY diams    CDATA "&#9830;" -- black diamond suit, U+2666 ISOpub -->
\ No newline at end of file
diff --git a/pubtext/ISOlat1.ent b/pubtext/ISOlat1.ent
new file mode 100644 (file)
index 0000000..7225899
--- /dev/null
@@ -0,0 +1,108 @@
+<!-- (C) International Organization for Standardization 1986
+     Permission to copy in any form is granted for use with
+     conforming SGML systems and applications as defined in
+     ISO 8879, provided this notice is included in all copies.
+     This has been extended for use with HTML to cover the full
+     set of codes in the range 160-255 decimal.
+-->
+<!-- Character entity set. Typical invocation:
+     <!ENTITY % ISOlat1 PUBLIC
+       "ISO 8879-1986//ENTITIES Added Latin 1//EN//HTML">
+     %ISOlat1;
+-->
+<!ENTITY nbsp   CDATA "&#160;" -- no-break space -->
+<!ENTITY iexcl  CDATA "&#161;" -- inverted exclamation mark -->
+<!ENTITY cent   CDATA "&#162;" -- cent sign -->
+<!ENTITY pound  CDATA "&#163;" -- pound sterling sign -->
+<!ENTITY curren CDATA "&#164;" -- general currency sign -->
+<!ENTITY yen    CDATA "&#165;" -- yen sign -->
+<!ENTITY brvbar CDATA "&#166;" -- broken (vertical) bar -->
+<!ENTITY sect   CDATA "&#167;" -- section sign -->
+<!ENTITY uml    CDATA "&#168;" -- umlaut (dieresis) -->
+<!ENTITY copy   CDATA "&#169;" -- copyright sign -->
+<!ENTITY ordf   CDATA "&#170;" -- ordinal indicator, feminine -->
+<!ENTITY laquo  CDATA "&#171;" -- angle quotation mark, left -->
+<!ENTITY not    CDATA "&#172;" -- not sign -->
+<!ENTITY shy    CDATA "&#173;" -- soft hyphen -->
+<!ENTITY reg    CDATA "&#174;" -- registered sign -->
+<!ENTITY macr   CDATA "&#175;" -- macron -->
+<!ENTITY deg    CDATA "&#176;" -- degree sign -->
+<!ENTITY plusmn CDATA "&#177;" -- plus-or-minus sign -->
+<!ENTITY sup2   CDATA "&#178;" -- superscript two -->
+<!ENTITY sup3   CDATA "&#179;" -- superscript three -->
+<!ENTITY acute  CDATA "&#180;" -- acute accent -->
+<!ENTITY micro  CDATA "&#181;" -- micro sign -->
+<!ENTITY para   CDATA "&#182;" -- pilcrow (paragraph sign) -->
+<!ENTITY middot CDATA "&#183;" -- middle dot -->
+<!ENTITY cedil  CDATA "&#184;" -- cedilla -->
+<!ENTITY sup1   CDATA "&#185;" -- superscript one -->
+<!ENTITY ordm   CDATA "&#186;" -- ordinal indicator, masculine -->
+<!ENTITY raquo  CDATA "&#187;" -- angle quotation mark, right -->
+<!ENTITY frac14 CDATA "&#188;" -- fraction one-quarter -->
+<!ENTITY frac12 CDATA "&#189;" -- fraction one-half -->
+<!ENTITY frac34 CDATA "&#190;" -- fraction three-quarters -->
+<!ENTITY iquest CDATA "&#191;" -- inverted question mark -->
+<!ENTITY Agrave CDATA "&#192;" -- capital A, grave accent -->
+<!ENTITY Aacute CDATA "&#193;" -- capital A, acute accent -->
+<!ENTITY Acirc  CDATA "&#194;" -- capital A, circumflex accent -->
+<!ENTITY Atilde CDATA "&#195;" -- capital A, tilde -->
+<!ENTITY Auml   CDATA "&#196;" -- capital A, dieresis or umlaut mark -->
+<!ENTITY Aring  CDATA "&#197;" -- capital A, ring -->
+<!ENTITY AElig  CDATA "&#198;" -- capital AE diphthong (ligature) -->
+<!ENTITY Ccedil CDATA "&#199;" -- capital C, cedilla -->
+<!ENTITY Egrave CDATA "&#200;" -- capital E, grave accent -->
+<!ENTITY Eacute CDATA "&#201;" -- capital E, acute accent -->
+<!ENTITY Ecirc  CDATA "&#202;" -- capital E, circumflex accent -->
+<!ENTITY Euml   CDATA "&#203;" -- capital E, dieresis or umlaut mark -->
+<!ENTITY Igrave CDATA "&#204;" -- capital I, grave accent -->
+<!ENTITY Iacute CDATA "&#205;" -- capital I, acute accent -->
+<!ENTITY Icirc  CDATA "&#206;" -- capital I, circumflex accent -->
+<!ENTITY Iuml   CDATA "&#207;" -- capital I, dieresis or umlaut mark -->
+<!ENTITY ETH    CDATA "&#208;" -- capital Eth, Icelandic -->
+<!ENTITY Ntilde CDATA "&#209;" -- capital N, tilde -->
+<!ENTITY Ograve CDATA "&#210;" -- capital O, grave accent -->
+<!ENTITY Oacute CDATA "&#211;" -- capital O, acute accent -->
+<!ENTITY Ocirc  CDATA "&#212;" -- capital O, circumflex accent -->
+<!ENTITY Otilde CDATA "&#213;" -- capital O, tilde -->
+<!ENTITY Ouml   CDATA "&#214;" -- capital O, dieresis or umlaut mark -->
+<!ENTITY times  CDATA "&#215;" -- multiply sign -->
+<!ENTITY Oslash CDATA "&#216;" -- capital O, slash -->
+<!ENTITY Ugrave CDATA "&#217;" -- capital U, grave accent -->
+<!ENTITY Uacute CDATA "&#218;" -- capital U, acute accent -->
+<!ENTITY Ucirc  CDATA "&#219;" -- capital U, circumflex accent -->
+<!ENTITY Uuml   CDATA "&#220;" -- capital U, dieresis or umlaut mark -->
+<!ENTITY Yacute CDATA "&#221;" -- capital Y, acute accent -->
+<!ENTITY THORN  CDATA "&#222;" -- capital THORN, Icelandic -->
+<!ENTITY szlig  CDATA "&#223;" -- small sharp s, German (sz ligature) -->
+<!ENTITY agrave CDATA "&#224;" -- small a, grave accent -->
+<!ENTITY aacute CDATA "&#225;" -- small a, acute accent -->
+<!ENTITY acirc  CDATA "&#226;" -- small a, circumflex accent -->
+<!ENTITY atilde CDATA "&#227;" -- small a, tilde -->
+<!ENTITY auml   CDATA "&#228;" -- small a, dieresis or umlaut mark -->
+<!ENTITY aring  CDATA "&#229;" -- small a, ring -->
+<!ENTITY aelig  CDATA "&#230;" -- small ae diphthong (ligature) -->
+<!ENTITY ccedil CDATA "&#231;" -- small c, cedilla -->
+<!ENTITY egrave CDATA "&#232;" -- small e, grave accent -->
+<!ENTITY eacute CDATA "&#233;" -- small e, acute accent -->
+<!ENTITY ecirc  CDATA "&#234;" -- small e, circumflex accent -->
+<!ENTITY euml   CDATA "&#235;" -- small e, dieresis or umlaut mark -->
+<!ENTITY igrave CDATA "&#236;" -- small i, grave accent -->
+<!ENTITY iacute CDATA "&#237;" -- small i, acute accent -->
+<!ENTITY icirc  CDATA "&#238;" -- small i, circumflex accent -->
+<!ENTITY iuml   CDATA "&#239;" -- small i, dieresis or umlaut mark -->
+<!ENTITY eth    CDATA "&#240;" -- small eth, Icelandic -->
+<!ENTITY ntilde CDATA "&#241;" -- small n, tilde -->
+<!ENTITY ograve CDATA "&#242;" -- small o, grave accent -->
+<!ENTITY oacute CDATA "&#243;" -- small o, acute accent -->
+<!ENTITY ocirc  CDATA "&#244;" -- small o, circumflex accent -->
+<!ENTITY otilde CDATA "&#245;" -- small o, tilde -->
+<!ENTITY ouml   CDATA "&#246;" -- small o, dieresis or umlaut mark -->
+<!ENTITY divide CDATA "&#247;" -- divide sign -->
+<!ENTITY oslash CDATA "&#248;" -- small o, slash -->
+<!ENTITY ugrave CDATA "&#249;" -- small u, grave accent -->
+<!ENTITY uacute CDATA "&#250;" -- small u, acute accent -->
+<!ENTITY ucirc  CDATA "&#251;" -- small u, circumflex accent -->
+<!ENTITY uuml   CDATA "&#252;" -- small u, dieresis or umlaut mark -->
+<!ENTITY yacute CDATA "&#253;" -- small y, acute accent -->
+<!ENTITY thorn  CDATA "&#254;" -- small thorn, Icelandic -->
+<!ENTITY yuml   CDATA "&#255;" -- small y, dieresis or umlaut mark -->
diff --git a/pubtext/ISOlat1.sgm b/pubtext/ISOlat1.sgm
new file mode 100644 (file)
index 0000000..0236a8c
--- /dev/null
@@ -0,0 +1,74 @@
+<!-- (C) International Organization for Standardization 1986
+     Permission to copy in any form is granted for use with
+     conforming SGML systems and applications as defined in
+     ISO 8879, provided this notice is included in all copies.
+-->
+<!-- Character entity set. Typical invocation:
+     <!ENTITY % ISOlat1 PUBLIC
+       "ISO 8879-1986//ENTITIES Added Latin 1//EN//HTML">
+     %ISOlat1;
+-->
+<!--   Modified for use in HTML
+       $Id: ISOlat1.sgm,v 1.1.1.1 1999/05/02 12:50:44 Avi Exp $ -->
+<!ENTITY AElig  CDATA "&#198;" -- capital AE diphthong (ligature) -->
+<!ENTITY Aacute CDATA "&#193;" -- capital A, acute accent -->
+<!ENTITY Acirc  CDATA "&#194;" -- capital A, circumflex accent -->
+<!ENTITY Agrave CDATA "&#192;" -- capital A, grave accent -->
+<!ENTITY Aring  CDATA "&#197;" -- capital A, ring -->
+<!ENTITY Atilde CDATA "&#195;" -- capital A, tilde -->
+<!ENTITY Auml   CDATA "&#196;" -- capital A, dieresis or umlaut mark -->
+<!ENTITY Ccedil CDATA "&#199;" -- capital C, cedilla -->
+<!ENTITY ETH    CDATA "&#208;" -- capital Eth, Icelandic -->
+<!ENTITY Eacute CDATA "&#201;" -- capital E, acute accent -->
+<!ENTITY Ecirc  CDATA "&#202;" -- capital E, circumflex accent -->
+<!ENTITY Egrave CDATA "&#200;" -- capital E, grave accent -->
+<!ENTITY Euml   CDATA "&#203;" -- capital E, dieresis or umlaut mark -->
+<!ENTITY Iacute CDATA "&#205;" -- capital I, acute accent -->
+<!ENTITY Icirc  CDATA "&#206;" -- capital I, circumflex accent -->
+<!ENTITY Igrave CDATA "&#204;" -- capital I, grave accent -->
+<!ENTITY Iuml   CDATA "&#207;" -- capital I, dieresis or umlaut mark -->
+<!ENTITY Ntilde CDATA "&#209;" -- capital N, tilde -->
+<!ENTITY Oacute CDATA "&#211;" -- capital O, acute accent -->
+<!ENTITY Ocirc  CDATA "&#212;" -- capital O, circumflex accent -->
+<!ENTITY Ograve CDATA "&#210;" -- capital O, grave accent -->
+<!ENTITY Oslash CDATA "&#216;" -- capital O, slash -->
+<!ENTITY Otilde CDATA "&#213;" -- capital O, tilde -->
+<!ENTITY Ouml   CDATA "&#214;" -- capital O, dieresis or umlaut mark -->
+<!ENTITY THORN  CDATA "&#222;" -- capital THORN, Icelandic -->
+<!ENTITY Uacute CDATA "&#218;" -- capital U, acute accent -->
+<!ENTITY Ucirc  CDATA "&#219;" -- capital U, circumflex accent -->
+<!ENTITY Ugrave CDATA "&#217;" -- capital U, grave accent -->
+<!ENTITY Uuml   CDATA "&#220;" -- capital U, dieresis or umlaut mark -->
+<!ENTITY Yacute CDATA "&#221;" -- capital Y, acute accent -->
+<!ENTITY aacute CDATA "&#225;" -- small a, acute accent -->
+<!ENTITY acirc  CDATA "&#226;" -- small a, circumflex accent -->
+<!ENTITY aelig  CDATA "&#230;" -- small ae diphthong (ligature) -->
+<!ENTITY agrave CDATA "&#224;" -- small a, grave accent -->
+<!ENTITY aring  CDATA "&#229;" -- small a, ring -->
+<!ENTITY atilde CDATA "&#227;" -- small a, tilde -->
+<!ENTITY auml   CDATA "&#228;" -- small a, dieresis or umlaut mark -->
+<!ENTITY ccedil CDATA "&#231;" -- small c, cedilla -->
+<!ENTITY eacute CDATA "&#233;" -- small e, acute accent -->
+<!ENTITY ecirc  CDATA "&#234;" -- small e, circumflex accent -->
+<!ENTITY egrave CDATA "&#232;" -- small e, grave accent -->
+<!ENTITY eth    CDATA "&#240;" -- small eth, Icelandic -->
+<!ENTITY euml   CDATA "&#235;" -- small e, dieresis or umlaut mark -->
+<!ENTITY iacute CDATA "&#237;" -- small i, acute accent -->
+<!ENTITY icirc  CDATA "&#238;" -- small i, circumflex accent -->
+<!ENTITY igrave CDATA "&#236;" -- small i, grave accent -->
+<!ENTITY iuml   CDATA "&#239;" -- small i, dieresis or umlaut mark -->
+<!ENTITY ntilde CDATA "&#241;" -- small n, tilde -->
+<!ENTITY oacute CDATA "&#243;" -- small o, acute accent -->
+<!ENTITY ocirc  CDATA "&#244;" -- small o, circumflex accent -->
+<!ENTITY ograve CDATA "&#242;" -- small o, grave accent -->
+<!ENTITY oslash CDATA "&#248;" -- small o, slash -->
+<!ENTITY otilde CDATA "&#245;" -- small o, tilde -->
+<!ENTITY ouml   CDATA "&#246;" -- small o, dieresis or umlaut mark -->
+<!ENTITY szlig  CDATA "&#223;" -- small sharp s, German (sz ligature) -->
+<!ENTITY thorn  CDATA "&#254;" -- small thorn, Icelandic -->
+<!ENTITY uacute CDATA "&#250;" -- small u, acute accent -->
+<!ENTITY ucirc  CDATA "&#251;" -- small u, circumflex accent -->
+<!ENTITY ugrave CDATA "&#249;" -- small u, grave accent -->
+<!ENTITY uuml   CDATA "&#252;" -- small u, dieresis or umlaut mark -->
+<!ENTITY yacute CDATA "&#253;" -- small y, acute accent -->
+<!ENTITY yuml   CDATA "&#255;" -- small y, dieresis or umlaut mark -->
diff --git a/pubtext/html-1.dtd b/pubtext/html-1.dtd
new file mode 100644 (file)
index 0000000..936387b
--- /dev/null
@@ -0,0 +1,29 @@
+<!--   html-1.dtd
+
+        Document Type Definition for the HyperText Markup Language
+       with Level 1 Extensions (HTML Level 1 DTD).
+
+       $Id: html-1.dtd,v 1.1.1.1 1999/05/02 12:50:44 Avi Exp $
+
+       Author: Daniel W. Connolly <connolly@w3.org>
+       See Also: http://info.cern.ch/hypertext/WWW/MarkUp/MarkUp.html
+-->
+
+<!ENTITY % HTML.Version
+       "-//IETF//DTD HTML 2.0 Level 1//EN"
+
+        -- Typical usage:
+
+            <!DOCTYPE HTML PUBLIC
+               "-//IETF//DTD HTML Level 1//EN">
+           <html>
+           ...
+           </html>
+       --
+       >
+
+<!-- Feature Test Entities -->
+<!ENTITY % HTML.Forms "IGNORE">
+
+<!ENTITY % html PUBLIC "-//IETF//DTD HTML 2.0//EN">
+%html;
diff --git a/pubtext/html-1s.dtd b/pubtext/html-1s.dtd
new file mode 100644 (file)
index 0000000..d18ac1d
--- /dev/null
@@ -0,0 +1,29 @@
+<!--   html-1s.dtd
+
+        Document Type Definition for the HyperText Markup Language
+       Struct Level 1
+
+       $Id: html-1s.dtd,v 1.1.1.1 1999/05/02 12:50:44 Avi Exp $
+
+       Author: Daniel W. Connolly <connolly@w3.org>
+       See Also: http://www.w3.org/hypertext/WWW/MarkUp/MarkUp.html
+-->
+
+<!ENTITY % HTML.Version
+       "-//IETF//DTD HTML 2.0 Strict Level 1//EN"
+
+        -- Typical usage:
+
+            <!DOCTYPE HTML PUBLIC
+               "-//IETF//DTD HTML Strict Level 1//EN">
+           <html>
+           ...
+           </html>
+       --
+       >
+
+<!-- Feature Test Entities -->
+<!ENTITY % HTML.Recommended "INCLUDE">
+
+<!ENTITY % html-1 PUBLIC "-//IETF//DTD HTML 2.0 Level 1//EN">
+%html-1;
diff --git a/pubtext/html-s.dtd b/pubtext/html-s.dtd
new file mode 100644 (file)
index 0000000..98eefbd
--- /dev/null
@@ -0,0 +1,29 @@
+<!--   html-s.dtd
+
+        Document Type Definition for the HyperText Markup Language
+       with strict validation (HTML Strict DTD).
+
+       $Id: html-s.dtd,v 1.1.1.1 1999/05/02 12:50:44 Avi Exp $
+
+       Author: Daniel W. Connolly <connolly@w3.org>
+       See Also: http://www.w3.org/hypertext/WWW/MarkUp/MarkUp.html
+-->
+
+<!ENTITY % HTML.Version
+       "-//IETF//DTD HTML 2.0 Strict//EN"
+
+        -- Typical usage:
+
+            <!DOCTYPE HTML PUBLIC
+               "-//IETF//DTD HTML Strict//EN">
+           <html>
+           ...
+           </html>
+       --
+       >
+
+<!-- Feature Test Entities -->
+<!ENTITY % HTML.Recommended "INCLUDE">
+
+<!ENTITY % html PUBLIC "-//IETF//DTD HTML 2.0//EN">
+%html;
diff --git a/pubtext/html.dcl b/pubtext/html.dcl
new file mode 100644 (file)
index 0000000..c1545df
--- /dev/null
@@ -0,0 +1,88 @@
+<!SGML  "ISO 8879:1986"
+--
+       SGML Declaration for HyperText Markup Language (HTML).
+
+--
+
+CHARSET
+         BASESET  "ISO 646:1983//CHARSET
+                   International Reference Version
+                   (IRV)//ESC 2/5 4/0"
+         DESCSET  0   9   UNUSED
+                  9   2   9
+                  11  2   UNUSED
+                  13  1   13
+                  14  18  UNUSED
+                  32  95  32
+                  127 1   UNUSED
+     BASESET   "ISO Registration Number 100//CHARSET
+                ECMA-94 Right Part of
+                Latin Alphabet Nr. 1//ESC 2/13 4/1"
+
+         DESCSET  128  32   UNUSED
+                  160  96    32
+
+CAPACITY        SGMLREF
+                TOTALCAP        150000
+                GRPCAP          150000
+               ENTCAP          150000
+  
+SCOPE    DOCUMENT
+SYNTAX   
+         SHUNCHAR CONTROLS 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
+                17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 127
+         BASESET  "ISO 646:1983//CHARSET
+                   International Reference Version
+                   (IRV)//ESC 2/5 4/0"
+         DESCSET  0 128 0
+         FUNCTION
+                 RE          13
+                  RS          10
+                  SPACE       32
+                  TAB SEPCHAR  9
+       
+
+         NAMING   LCNMSTRT ""
+                  UCNMSTRT ""
+                  LCNMCHAR ".-"
+                  UCNMCHAR ".-"
+                  NAMECASE GENERAL YES
+                           ENTITY  NO
+         DELIM    GENERAL  SGMLREF
+                  SHORTREF SGMLREF
+         NAMES    SGMLREF
+         QUANTITY SGMLREF
+                  ATTSPLEN 2100
+                  LITLEN   1024
+                  NAMELEN  72    -- somewhat arbitrary; taken from
+                                internet line length conventions --
+                  PILEN    1024
+                  TAGLVL   100
+                  TAGLEN   2100
+                  GRPGTCNT 150
+                  GRPCNT   64                   
+
+FEATURES
+  MINIMIZE
+    DATATAG  NO
+    OMITTAG  YES
+    RANK     NO
+    SHORTTAG YES
+  LINK
+    SIMPLE   NO
+    IMPLICIT NO
+    EXPLICIT NO
+  OTHER
+    CONCUR   NO
+    SUBDOC   NO
+    FORMAL   YES
+  APPINFO    "SDA"  -- conforming SGML Document Access application
+                   --
+>
+<!-- 
+       $Id: html.dcl,v 1.1.1.1 1999/05/02 12:50:44 Avi Exp $
+
+       Author: Daniel W. Connolly <connolly@w3.org>
+
+       See also: http://www.w3.org/hypertext/WWW/MarkUp/MarkUp.html
+ -->
diff --git a/pubtext/html.dtd b/pubtext/html.dtd
new file mode 100644 (file)
index 0000000..ad50168
--- /dev/null
@@ -0,0 +1,599 @@
+<!--    html.dtd
+
+        Document Type Definition for the HyperText Markup Language
+                (HTML DTD)
+
+       $Id: html.dtd,v 1.1.1.2 1999/05/02 15:41:46 Avi Exp $
+
+       Author: Daniel W. Connolly <connolly@w3.org>
+       See Also: html.decl, html-1.dtd
+         http://www.w3.org/hypertext/WWW/MarkUp/MarkUp.html
+-->
+
+<!ENTITY % HTML.Version
+        "-//IETF//DTD HTML 2.0//EN"
+
+        -- Typical usage:
+
+            <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+            <html>
+            ...
+            </html>
+        --
+        >
+
+
+<!--============ Feature Test Entities ========================-->
+
+<!ENTITY % HTML.Recommended "IGNORE"
+       -- Certain features of the language are necessary for
+          compatibility with widespread usage, but they may
+          compromise the structural integrity of a document.
+          This feature test entity enables a more prescriptive
+          document type definition that eliminates
+          those features.
+       -->
+
+<![ %HTML.Recommended [
+        <!ENTITY % HTML.Deprecated "IGNORE">
+]]>
+
+<!ENTITY % HTML.Deprecated "INCLUDE"
+       -- Certain features of the language are necessary for
+          compatibility with earlier versions of the specification,
+          but they tend to be used and implemented inconsistently,
+          and their use is deprecated. This feature test entity
+          enables a document type definition that eliminates
+          these features.
+       -->
+
+<!ENTITY % HTML.Highlighting "INCLUDE"
+       -- Use this feature test entity to validate that a
+          document uses no highlighting tags, which may be
+          ignored on minimal implementations.
+       -->
+
+<!ENTITY % HTML.Forms "INCLUDE"
+        -- Use this feature test entity to validate that a document
+           contains no forms, which may not be supported in minimal
+           implementations
+        -->
+
+<!--============== Imported Names ==============================-->
+
+<!ENTITY % Content-Type "CDATA"
+        -- meaning an internet media type
+           (aka MIME content type, as per RFC1521)
+        -->
+
+<!ENTITY % HTTP-Method "GET | POST"
+        -- as per HTTP specification, in progress
+        -->
+
+<!--========= DTD "Macros" =====================-->
+
+<!ENTITY % heading "H1|H2|H3|H4|H5|H6">
+
+<!ENTITY % list " UL | OL | DIR | MENU " >
+
+
+<!--======= Character mnemonic entities =================-->
+
+<!ENTITY % ISOlat1 PUBLIC
+  "ISO 8879-1986//ENTITIES Added Latin 1//EN//HTML">
+%ISOlat1;
+
+<!ENTITY amp CDATA "&#38;"     -- ampersand          -->
+<!ENTITY gt CDATA "&#62;"      -- greater than       -->
+<!ENTITY lt CDATA "&#60;"      -- less than          -->
+<!ENTITY quot CDATA "&#34;"    -- double quote       -->
+
+
+<!--========= SGML Document Access (SDA) Parameter Entities =====-->
+
+<!-- HTML 2.0 contains SGML Document Access (SDA) fixed attributes
+in support of easy transformation to the International Committee
+for Accessible Document Design (ICADD) DTD
+        "-//EC-USA-CDA/ICADD//DTD ICADD22//EN".
+ICADD applications are designed to support usable access to
+structured information by print-impaired individuals through
+Braille, large print and voice synthesis.  For more information on
+SDA & ICADD:  
+        - ISO 12083:1993, Annex A.8, Facilities for Braille,
+         large print and computer voice
+        - ICADD ListServ
+         <ICADD%ASUACAD.BITNET@ARIZVM1.ccit.arizona.edu>
+        - Usenet news group bit.listserv.easi
+        - Recording for the Blind, +1 800 221 4792
+-->
+
+<!ENTITY % SDAFORM  "SDAFORM  CDATA  #FIXED"
+         -- one to one mapping        -->
+<!ENTITY % SDARULE  "SDARULE  CDATA  #FIXED"
+         -- context-sensitive mapping -->
+<!ENTITY % SDAPREF  "SDAPREF  CDATA  #FIXED"
+         -- generated text prefix     -->
+<!ENTITY % SDASUFF  "SDASUFF  CDATA  #FIXED"
+         -- generated text suffix     -->
+<!ENTITY % SDASUSP  "SDASUSP  NAME   #FIXED"
+         -- suspend transform process -->
+
+
+<!--========== Text Markup =====================-->
+
+<![ %HTML.Highlighting [
+
+<!ENTITY % font " TT | B | I ">
+
+<!ENTITY % phrase "EM | STRONG | CODE | SAMP | KBD | VAR | CITE ">
+
+<!ENTITY % text "#PCDATA | A | IMG | BR | %phrase | %font">
+
+<!ELEMENT (%font;|%phrase) - - (%text)*>
+<!ATTLIST ( TT | CODE | SAMP | KBD | VAR )
+        %SDAFORM; "Lit"
+        >
+<!ATTLIST ( B | STRONG )
+        %SDAFORM; "B"
+        >
+<!ATTLIST ( I | EM | CITE )
+        %SDAFORM; "It"
+        >
+
+<!-- <TT>       Typewriter text                         -->
+<!-- <B>        Bold text                               -->
+<!-- <I>        Italic text                             -->
+
+<!-- <EM>       Emphasized phrase                       -->
+<!-- <STRONG>   Strong emphasis                         -->
+<!-- <CODE>     Source code phrase                      -->
+<!-- <SAMP>     Sample text or characters               -->
+<!-- <KBD>      Keyboard phrase, e.g. user input        -->
+<!-- <VAR>      Variable phrase or substitutable        -->
+<!-- <CITE>     Name or title of cited work             -->
+
+<!ENTITY % pre.content "#PCDATA | A | HR | BR | %font | %phrase">
+
+]]>
+
+<!ENTITY % text "#PCDATA | A | IMG | BR">
+
+<!ELEMENT BR    - O EMPTY>
+<!ATTLIST BR
+        %SDAPREF; "&#RE;"
+        >
+
+<!-- <BR>       Line break      -->
+
+
+<!--========= Link Markup ======================-->
+
+<!ENTITY % linkType "NAMES">
+
+<!ENTITY % linkExtraAttributes
+        "REL %linkType #IMPLIED
+        REV %linkType #IMPLIED
+        URN CDATA #IMPLIED
+        TITLE CDATA #IMPLIED
+        METHODS NAMES #IMPLIED
+        ">
+
+<![ %HTML.Recommended [
+        <!ENTITY % A.content   "(%text)*"
+        -- <H1><a name="xxx">Heading</a></H1>
+                is preferred to
+           <a name="xxx"><H1>Heading</H1></a>
+        -->
+]]>
+
+<!ENTITY % A.content   "(%heading|%text)*">
+
+<!ELEMENT A     - - %A.content -(A)>
+<!ATTLIST A
+        HREF CDATA #IMPLIED
+        NAME CDATA #IMPLIED
+        %linkExtraAttributes;
+        %SDAPREF; "<Anchor: #AttList>"
+        >
+<!-- <A>               Anchor; source/destination of link      -->
+<!-- <A NAME="...">    Name of this anchor                     -->
+<!-- <A HREF="...">    Address of link destination             -->
+<!-- <A URN="...">     Permanent address of destination        -->
+<!-- <A REL=...>       Relationship to destination             -->
+<!-- <A REV=...>       Relationship of destination to this     -->
+<!-- <A TITLE="...">   Title of destination (advisory)         -->
+<!-- <A METHODS="..."> Operations on destination (advisory)    -->
+
+
+<!--========== Images ==========================-->
+
+<!ELEMENT IMG    - O EMPTY>
+<!ATTLIST IMG
+        SRC CDATA  #REQUIRED
+        ALT CDATA #IMPLIED
+        ALIGN (top|middle|bottom) #IMPLIED
+        ISMAP (ISMAP) #IMPLIED
+        %SDAPREF; "<Fig><?SDATrans Img: #AttList>#AttVal(Alt)</Fig>"
+        >
+
+<!-- <IMG>              Image; icon, glyph or illustration      -->
+<!-- <IMG SRC="...">    Address of image object                 -->
+<!-- <IMG ALT="...">    Textual alternative                     -->
+<!-- <IMG ALIGN=...>    Position relative to text               -->
+<!-- <IMG ISMAP>        Each pixel can be a link                -->
+
+<!--========== Paragraphs=======================-->
+
+<!ELEMENT P     - O (%text)*>
+<!ATTLIST P
+        %SDAFORM; "Para"
+        >
+
+<!-- <P>        Paragraph       -->
+
+
+<!--========== Headings, Titles, Sections ===============-->
+
+<!ELEMENT HR    - O EMPTY>
+<!ATTLIST HR
+        %SDAPREF; "&#RE;&#RE;"
+        >
+
+<!-- <HR>       Horizontal rule -->
+
+<!ELEMENT ( %heading )  - -  (%text;)*>
+<!ATTLIST H1
+        %SDAFORM; "H1"
+        >
+<!ATTLIST H2
+        %SDAFORM; "H2"
+        >
+<!ATTLIST H3
+        %SDAFORM; "H3"
+        >
+<!ATTLIST H4
+        %SDAFORM; "H4"
+        >
+<!ATTLIST H5
+        %SDAFORM; "H5"
+        >
+<!ATTLIST H6
+        %SDAFORM; "H6"
+        >
+
+<!-- <H1>       Heading, level 1 -->
+<!-- <H2>       Heading, level 2 -->
+<!-- <H3>       Heading, level 3 -->
+<!-- <H4>       Heading, level 4 -->
+<!-- <H5>       Heading, level 5 -->
+<!-- <H6>       Heading, level 6 -->
+
+
+<!--========== Text Flows ======================-->
+
+<![ %HTML.Forms [
+        <!ENTITY % block.forms "BLOCKQUOTE | FORM | ISINDEX">
+]]>
+
+<!ENTITY % block.forms "BLOCKQUOTE">
+
+<![ %HTML.Deprecated [
+        <!ENTITY % preformatted "PRE | XMP | LISTING">
+]]>
+
+<!ENTITY % preformatted "PRE">
+
+<!ENTITY % block "P | %list | DL
+        | %preformatted
+        | %block.forms">
+
+<!ENTITY % flow "(%text|%block)*">
+
+<!ENTITY % pre.content "#PCDATA | A | HR | BR">
+<!ELEMENT PRE - - (%pre.content)*>
+<!ATTLIST PRE
+        WIDTH NUMBER #implied
+        %SDAFORM; "Lit"
+        >
+
+<!-- <PRE>              Preformatted text               -->
+<!-- <PRE WIDTH=...>    Maximum characters per line     -->
+
+<![ %HTML.Deprecated [
+
+<!ENTITY % literal "CDATA"
+        -- historical, non-conforming parsing mode where
+           the only markup signal is the end tag
+           in full
+        -->
+
+<!ELEMENT (XMP|LISTING) - -  %literal>
+<!ATTLIST XMP
+        %SDAFORM; "Lit"
+        %SDAPREF; "Example:&#RE;"
+        >
+<!ATTLIST LISTING
+        %SDAFORM; "Lit"
+        %SDAPREF; "Listing:&#RE;"
+        >
+
+<!-- <XMP>              Example section         -->
+<!-- <LISTING>          Computer listing        -->
+
+<!ELEMENT PLAINTEXT - O %literal>
+<!-- <PLAINTEXT>        Plain text passage      -->
+
+<!ATTLIST PLAINTEXT
+        %SDAFORM; "Lit"
+        >
+]]>
+
+
+<!--========== Lists ==================-->
+
+<!ELEMENT DL    - -  (DT | DD)+>
+<!ATTLIST DL
+        COMPACT (COMPACT) #IMPLIED
+        %SDAFORM; "List"
+        %SDAPREF; "Definition List:"
+        >
+
+<!ELEMENT DT    - O (%text)*>
+<!ATTLIST DT
+        %SDAFORM; "Term"
+        >
+
+<!ELEMENT DD    - O %flow>
+<!ATTLIST DD
+        %SDAFORM; "LItem"
+        >
+
+<!-- <DL>               Definition list, or glossary    -->
+<!-- <DL COMPACT>       Compact style list              -->
+<!-- <DT>               Term in definition list         -->
+<!-- <DD>               Definition of term              -->
+
+<!ELEMENT (OL|UL) - -  (LI)+>
+<!ATTLIST OL
+        COMPACT (COMPACT) #IMPLIED
+        %SDAFORM; "List"
+        >
+<!ATTLIST UL
+        COMPACT (COMPACT) #IMPLIED
+        %SDAFORM; "List"
+        >
+<!-- <UL>               Unordered list                  -->
+<!-- <UL COMPACT>       Compact list style              -->
+<!-- <OL>               Ordered, or numbered list       -->
+<!-- <OL COMPACT>       Compact list style              -->
+
+
+<!ELEMENT (DIR|MENU) - -  (LI)+ -(%block)>
+<!ATTLIST DIR
+        COMPACT (COMPACT) #IMPLIED
+        %SDAFORM; "List"
+        %SDAPREF; "<LHead>Directory</LHead>"
+        >
+<!ATTLIST MENU
+        COMPACT (COMPACT) #IMPLIED
+        %SDAFORM; "List"
+        %SDAPREF; "<LHead>Menu</LHead>"
+        >
+
+<!-- <DIR>              Directory list                  -->
+<!-- <DIR COMPACT>      Compact list style              -->
+<!-- <MENU>             Menu list                       -->
+<!-- <MENU COMPACT>     Compact list style              -->
+
+<!ELEMENT LI    - O %flow>
+<!ATTLIST LI
+        %SDAFORM; "LItem"
+        >
+
+<!-- <LI>               List item                       -->
+
+<!--========== Document Body ===================-->
+
+<![ %HTML.Recommended [
+       <!ENTITY % body.content "(%heading|%block|HR|ADDRESS|IMG)*"
+       -- <h1>Heading</h1>
+          <p>Text ...
+               is preferred to
+          <h1>Heading</h1>
+          Text ...
+       -->
+]]>
+
+<!ENTITY % body.content "(%heading | %text | %block |
+                                HR | ADDRESS)*">
+
+<!ELEMENT BODY O O  %body.content>
+
+<!-- <BODY>     Document body   -->
+
+<!ELEMENT BLOCKQUOTE - - %body.content>
+<!ATTLIST BLOCKQUOTE
+        %SDAFORM; "BQ"
+        >
+
+<!-- <BLOCKQUOTE>       Quoted passage  -->
+
+<!ELEMENT ADDRESS - - (%text|P)*>
+<!ATTLIST  ADDRESS
+        %SDAFORM; "Lit"
+        %SDAPREF; "Address:&#RE;"
+        >
+
+<!-- <ADDRESS> Address, signature, or byline   -->
+
+
+<!--======= Forms ====================-->
+
+<![ %HTML.Forms [
+
+<!ELEMENT FORM - - %body.content -(FORM) +(INPUT|SELECT|TEXTAREA)>
+<!ATTLIST FORM
+        ACTION CDATA #IMPLIED
+        METHOD (%HTTP-Method) GET
+        ENCTYPE %Content-Type; "application/x-www-form-urlencoded"
+        %SDAPREF; "<Para>Form:</Para>"
+        %SDASUFF; "<Para>Form End.</Para>"
+        >
+
+<!-- <FORM>                     Fill-out or data-entry form     -->
+<!-- <FORM ACTION="...">        Address for completed form      -->
+<!-- <FORM METHOD=...>          Method of submitting form       -->
+<!-- <FORM ENCTYPE="...">       Representation of form data     -->
+
+<!ENTITY % InputType "(TEXT | PASSWORD | CHECKBOX |
+                        RADIO | SUBMIT | RESET |
+                        IMAGE | HIDDEN )">
+<!ELEMENT INPUT - O EMPTY>
+<!ATTLIST INPUT
+       TYPE %InputType TEXT
+       NAME CDATA #IMPLIED
+       VALUE CDATA #IMPLIED
+       SRC CDATA #IMPLIED
+       CHECKED (CHECKED) #IMPLIED
+       SIZE CDATA #IMPLIED
+       MAXLENGTH NUMBER #IMPLIED
+       ALIGN (top|middle|bottom) #IMPLIED
+        %SDAPREF; "Input: "
+       >
+
+<!-- <INPUT>                   Form input datum                -->
+<!-- <INPUT TYPE=...>          Type of input interaction       -->
+<!-- <INPUT NAME=...>          Name of form datum              -->
+<!-- <INPUT VALUE="...">       Default/initial/selected value  -->
+<!-- <INPUT SRC="...">         Address of image                -->
+<!-- <INPUT CHECKED>           Initial state is "on"           -->
+<!-- <INPUT SIZE=...>          Field size hint                 -->
+<!-- <INPUT MAXLENGTH=...>     Data length maximum             -->
+<!-- <INPUT ALIGN=...>         Image alignment                 -->
+
+<!ELEMENT SELECT - - (OPTION+) -(INPUT|SELECT|TEXTAREA)>
+<!ATTLIST SELECT
+        NAME CDATA #REQUIRED
+        SIZE NUMBER #IMPLIED
+        MULTIPLE (MULTIPLE) #IMPLIED
+        %SDAFORM; "List"
+        %SDAPREF;
+        "<LHead>Select #AttVal(Multiple)</LHead>"
+       >
+
+<!-- <SELECT>                  Selection of option(s)          -->
+<!-- <SELECT NAME=...>         Name of form datum              -->
+<!-- <SELECT SIZE=...>         Options displayed at a time     -->
+<!-- <SELECT MULTIPLE>         Multiple selections allowed     -->
+
+<!ELEMENT OPTION - O (#PCDATA)*>
+<!ATTLIST OPTION
+        SELECTED (SELECTED) #IMPLIED
+        VALUE CDATA #IMPLIED
+        %SDAFORM; "LItem"
+        %SDAPREF;
+        "Option: #AttVal(Value) #AttVal(Selected)"
+       >
+
+<!-- <OPTION>                  A selection option              -->
+<!-- <OPTION SELECTED>         Initial state                   -->
+<!-- <OPTION VALUE="...">      Form datum value for this option-->
+
+<!ELEMENT TEXTAREA - - (#PCDATA)* -(INPUT|SELECT|TEXTAREA)>
+<!ATTLIST TEXTAREA
+        NAME CDATA #REQUIRED
+        ROWS NUMBER #REQUIRED
+        COLS NUMBER #REQUIRED
+        %SDAFORM; "Para"
+        %SDAPREF; "Input Text -- #AttVal(Name): "
+        >
+
+<!-- <TEXTAREA>                        An area for text input          -->
+<!-- <TEXTAREA NAME=...>       Name of form datum              -->
+<!-- <TEXTAREA ROWS=...>       Height of area                  -->
+<!-- <TEXTAREA COLS=...>       Width of area                   -->
+
+]]>
+
+
+<!--======= Document Head ======================-->
+
+<![ %HTML.Recommended [
+       <!ENTITY % head.extra "">
+]]>
+<!ENTITY % head.extra "& NEXTID?">
+
+<!ENTITY % head.content "TITLE & ISINDEX? & BASE? %head.extra">
+
+<!ELEMENT HEAD O O  (%head.content) +(META|LINK)>
+
+<!-- <HEAD>     Document head   -->
+
+<!ELEMENT TITLE - -  (#PCDATA)*  -(META|LINK)>
+<!ATTLIST TITLE
+        %SDAFORM; "Ti"    >
+
+<!-- <TITLE>    Title of document -->
+
+<!ELEMENT LINK - O EMPTY>
+<!ATTLIST LINK
+        HREF CDATA #REQUIRED
+        %linkExtraAttributes;
+        %SDAPREF; "Linked to : #AttVal (TITLE) (URN) (HREF)>"    >
+
+<!-- <LINK>            Link from this document                 -->
+<!-- <LINK HREF="..."> Address of link destination             -->
+<!-- <LINK URN="...">  Lasting name of destination             -->
+<!-- <LINK REL=...>    Relationship to destination             -->
+<!-- <LINK REV=...>    Relationship of destination to this     -->
+<!-- <LINK TITLE="...">        Title of destination (advisory)         -->
+<!-- <LINK METHODS="..."> Operations allowed (advisory)                -->
+
+<!ELEMENT ISINDEX - O EMPTY>
+<!ATTLIST ISINDEX
+        %SDAPREF;
+   "<Para>[Document is indexed/searchable.]</Para>">
+
+<!-- <ISINDEX>          Document is a searchable index          -->
+
+<!ELEMENT BASE - O EMPTY>
+<!ATTLIST BASE
+        HREF CDATA #REQUIRED     >
+
+<!-- <BASE>             Base context document                   -->
+<!-- <BASE HREF="...">  Address for this document               -->
+
+<!ELEMENT NEXTID - O EMPTY>
+<!ATTLIST NEXTID
+        N CDATA #REQUIRED     >
+
+<!-- <NEXTID>          Next ID to use for link name            -->
+<!-- <NEXTID N=...>    Next ID to use for link name            -->
+
+<!ELEMENT META - O EMPTY>
+<!ATTLIST META
+        HTTP-EQUIV  NAME    #IMPLIED
+        NAME        NAME    #IMPLIED
+        CONTENT     CDATA   #REQUIRED    >
+
+<!-- <META>                     Generic Meta-information        -->
+<!-- <META HTTP-EQUIV=...>      HTTP response header name       -->
+<!-- <META NAME=...>           Meta-information name           -->
+<!-- <META CONTENT="...">       Associated information          -->
+
+<!--======= Document Structure =================-->
+
+<![ %HTML.Deprecated [
+        <!ENTITY % html.content "HEAD, BODY, PLAINTEXT?">
+]]>
+<!ENTITY % html.content "HEAD, BODY">
+
+<!ELEMENT HTML O O  (%html.content)>
+<!ENTITY % version.attr "VERSION CDATA #FIXED '%HTML.Version;'">
+
+<!ATTLIST HTML
+        %version.attr;
+        %SDAFORM; "Book"
+        >
+
+<!-- <HTML>                    HTML Document   -->
diff --git a/pubtext/html.soc b/pubtext/html.soc
new file mode 100644 (file)
index 0000000..0e9c836
--- /dev/null
@@ -0,0 +1,31 @@
+       -- catalog: SGML Open style entity catalog for HTML --
+       -- $Id: html.soc,v 1.1.1.2 1999/05/02 15:41:46 Avi Exp $ --
+       -- Hacked by jjc --
+
+       -- Ways to refer to Level 2: most general to most specific --
+PUBLIC "-//IETF//DTD HTML//EN"                 html.dtd
+PUBLIC "-//IETF//DTD HTML 2.0//EN"             html.dtd
+PUBLIC "-//IETF//DTD HTML Level 2//EN"         html.dtd
+PUBLIC "-//IETF//DTD HTML 2.0 Level 2//EN"     html.dtd
+
+       -- Ways to refer to Level 1: most general to most specific --
+PUBLIC "-//IETF//DTD HTML Level 1//EN"         html-1.dtd
+PUBLIC "-//IETF//DTD HTML 2.0 Level 1//EN"     html-1.dtd
+
+       -- Ways to refer to
+                Strict Level 2: most general to most specific --
+PUBLIC "-//IETF//DTD HTML Strict//EN"                  html-s.dtd
+PUBLIC "-//IETF//DTD HTML 2.0 Strict//EN"              html-s.dtd
+PUBLIC "-//IETF//DTD HTML Strict Level 2//EN"          html-s.dtd
+PUBLIC "-//IETF//DTD HTML 2.0 Strict Level 2//EN"      html-s.dtd
+
+       -- Ways to refer to
+                Strict Level 1: most general to most specific --
+PUBLIC "-//IETF//DTD HTML Strict Level 1//EN"          html-1s.dtd
+PUBLIC "-//IETF//DTD HTML 2.0 Strict Level 1//EN"      html-1s.dtd
+
+       -- ISO latin 1 entity set for HTML -- 
+PUBLIC "ISO 8879-1986//ENTITIES Added Latin 1//EN//HTML"       ISOlat1.sgm
+
+SGMLDECL html.dcl
+DOCTYPE html html.dtd
diff --git a/pubtext/xml.dcl b/pubtext/xml.dcl
new file mode 100644 (file)
index 0000000..fed2103
--- /dev/null
@@ -0,0 +1,179 @@
+<!SGML -- SGML Declaration for valid XML documents --
+     "ISO 8879:1986 (WWW)"
+
+     CHARSET
+         BASESET
+             "ISO Registration Number 176//CHARSET
+             ISO/IEC 10646-1:1993 UCS-4 with implementation 
+             level 3//ESC 2/5 2/15 4/6"
+         DESCSET
+                0       9       UNUSED
+                9       2       9
+                11      2       UNUSED
+                13      1       13
+                14      18      UNUSED
+                32      95      32
+                127     1       UNUSED
+                128     32      UNUSED
+             -- use this instead of the official declaration because SP only
+                supports 16-bit characters --
+                160     65374   160
+                65534   2       UNUSED 
+             -- 55296   2048    UNUSED
+                57344   8190    57344
+                65534   2       UNUSED
+                65536   1048576 65536 --
+     CAPACITY NONE
+
+     SCOPE DOCUMENT
+
+     SYNTAX
+         SHUNCHAR NONE
+         BASESET "ISO Registration Number 176//CHARSET
+                 ISO/IEC 10646-1:1993 UCS-4 with implementation 
+                 level 3//ESC 2/5 2/15 4/6"
+         DESCSET
+             0 1114112 0
+         FUNCTION
+             RE    13
+             RS    10
+             SPACE 32
+             TAB   SEPCHAR 9
+
+         NAMING
+             LCNMSTRT ""
+             UCNMSTRT ""
+             NAMESTRT
+                 58 95 192-214 216-246 248-305 308-318 321-328
+                 330-382 384-451 461-496 500-501 506-535 592-680
+                 699-705 902 904-906 908 910-929 931-974 976-982
+                 986 988 990 992 994-1011 1025-1036 1038-1103
+                 1105-1116 1118-1153 1168-1220 1223-1224
+                 1227-1228 1232-1259 1262-1269 1272-1273
+                 1329-1366 1369 1377-1414 1488-1514 1520-1522
+                 1569-1594 1601-1610 1649-1719 1722-1726
+                 1728-1742 1744-1747 1749 1765-1766 2309-2361
+                 2365 2392-2401 2437-2444 2447-2448 2451-2472
+                 2474-2480 2482 2486-2489 2524-2525 2527-2529
+                 2544-2545 2565-2570 2575-2576 2579-2600
+                 2602-2608 2610-2611 2613-2614 2616-2617
+                 2649-2652 2654 2674-2676 2693-2699 2701
+                 2703-2705 2707-2728 2730-2736 2738-2739
+                 2741-2745 2749 2784 2821-2828 2831-2832
+                 2835-2856 2858-2864 2866-2867 2870-2873 2877
+                 2908-2909 2911-2913 2949-2954 2958-2960
+                 2962-2965 2969-2970 2972 2974-2975 2979-2980
+                 2984-2986 2990-2997 2999-3001 3077-3084
+                 3086-3088 3090-3112 3114-3123 3125-3129
+                 3168-3169 3205-3212 3214-3216 3218-3240
+                 3242-3251 3253-3257 3294 3296-3297 3333-3340
+                 3342-3344 3346-3368 3370-3385 3424-3425
+                 3585-3630 3632 3634-3635 3648-3653 3713-3714
+                 3716 3719-3720 3722 3725 3732-3735 3737-3743
+                 3745-3747 3749 3751 3754-3755 3757-3758 3760
+                 3762-3763 3773 3776-3780 3904-3911 3913-3945
+                 4256-4293 4304-4342 4352 4354-4355 4357-4359
+                 4361 4363-4364 4366-4370 4412 4414 4416 4428
+                 4430 4432 4436-4437 4441 4447-4449 4451 4453
+                 4455 4457 4461-4462 4466-4467 4469 4510 4520
+                 4523 4526-4527 4535-4536 4538 4540-4546 4587
+                 4592 4601 7680-7835 7840-7929 7936-7957
+                 7960-7965 7968-8005 8008-8013 8016-8023 8025
+                 8027 8029 8031-8061 8064-8116 8118-8124 8126
+                 8130-8132 8134-8140 8144-8147 8150-8155
+                 8160-8172 8178-8180 8182-8188 8486 8490-8491
+                 8494 8576-8578 12295 12321-12329 12353-12436
+                 12449-12538 12549-12588 19968-40869 44032-55203
+
+             LCNMCHAR ""
+             UCNMCHAR ""
+             NAMECHAR
+                 45-46 183 720-721 768-837 864-865 903 1155-1158
+                 1425-1441 1443-1465 1467-1469 1471 1473-1474
+                 1476 1600 1611-1618 1632-1641 1648 1750-1764
+                 1767-1768 1770-1773 1776-1785 2305-2307 2364
+                 2366-2381 2385-2388 2402-2403 2406-2415
+                 2433-2435 2492 2494-2500 2503-2504 2507-2509
+                 2519 2530-2531 2534-2543 2562 2620 2622-2626
+                 2631-2632 2635-2637 2662-2673 2689-2691 2748
+                 2750-2757 2759-2761 2763-2765 2790-2799
+                 2817-2819 2876 2878-2883 2887-2888 2891-2893
+                 2902-2903 2918-2927 2946-2947 3006-3010
+                 3014-3016 3018-3021 3031 3047-3055 3073-3075
+                 3134-3140 3142-3144 3146-3149 3157-3158
+                 3174-3183 3202-3203 3262-3268 3270-3272
+                 3274-3277 3285-3286 3302-3311 3330-3331
+                 3390-3395 3398-3400 3402-3405 3415 3430-3439
+                 3633 3636-3642 3654-3662 3664-3673 3761
+                 3764-3769 3771-3772 3782 3784-3789 3792-3801
+                 3864-3865 3872-3881 3893 3895 3897 3902-3903
+                 3953-3972 3974-3979 3984-3989 3991 3993-4013
+                 4017-4023 4025 8400-8412 8417 12293 12330-12335
+                 12337-12341 12441-12442 12445-12446 12540-12542
+
+             NAMECASE
+                 GENERAL NO
+                 ENTITY  NO
+
+         DELIM
+             GENERAL SGMLREF
+             HCRO "&#38;#x" -- 38 is the number for ampersand --
+             NESTC "/"
+             NET ">"
+             PIC "?>"
+             SHORTREF NONE
+
+         NAMES
+             SGMLREF
+
+         QUANTITY NONE
+
+         ENTITIES
+             "amp" 38
+             "lt" 60
+             "gt" 62
+             "quot" 34
+             "apos" 39
+
+     FEATURES
+         MINIMIZE
+             DATATAG NO
+             OMITTAG NO
+             RANK NO
+             SHORTTAG
+                 STARTTAG
+                     EMPTY NO
+                     UNCLOSED NO 
+                     NETENABL IMMEDNET
+                 ENDTAG
+                     EMPTY NO 
+                     UNCLOSED NO
+                 ATTRIB
+                     DEFAULT YES
+                     OMITNAME NO
+                     VALUE NO
+             EMPTYNRM YES
+             IMPLYDEF
+                 ATTLIST NO
+                 DOCTYPE NO
+                 ELEMENT NO
+                 ENTITY NO
+                 NOTATION NO
+         LINK
+             SIMPLE NO
+             IMPLICIT NO
+             EXPLICIT NO
+         OTHER
+             CONCUR NO
+             SUBDOC NO
+             FORMAL NO
+             URN NO
+             KEEPRSRE YES
+             VALIDITY TYPE
+             ENTITIES
+                 REF ANY
+                 INTEGRAL YES
+     APPINFO NONE
+     SEEALSO "ISO 8879:1986//NOTATION
+             Extensible Markup Language (XML) 1.0//EN"
+>
diff --git a/pubtext/xml.soc b/pubtext/xml.soc
new file mode 100644 (file)
index 0000000..278c6f3
--- /dev/null
@@ -0,0 +1 @@
+SGMLDECL "xml.dcl"
diff --git a/releasenotes.html b/releasenotes.html
new file mode 100644 (file)
index 0000000..3300eaa
--- /dev/null
@@ -0,0 +1,3463 @@
+<HTML
+><HEAD
+><TITLE
+>OpenJade 1.3.2</TITLE
+><META
+NAME="GENERATOR"
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
+"></HEAD
+><BODY
+CLASS="book"
+BGCOLOR="#FFFFFF"
+TEXT="#000000"
+><DIV
+CLASS="BOOK"
+><A
+NAME="AEN1"><DIV
+CLASS="TITLEPAGE"
+><H1
+CLASS="title"
+><A
+NAME="AEN2">OpenJade 1.3.2</H1
+><H2
+CLASS="subtitle"
+>Release Notes</H2
+><H3
+CLASS="corpauthor"
+>OpenJade Project</H3
+><P
+CLASS="copyright"
+>Copyright &copy; 2002 by OpenJade Project</P
+><HR></DIV
+><DIV
+CLASS="TOC"
+><DL
+><DT
+><B
+>Table of Contents</B
+></DT
+><DT
+>1. <A
+HREF="#AEN11"
+>OpenJade 1.3.2 Release Notes</A
+></DT
+><DD
+><DL
+><DT
+><A
+HREF="#AEN15"
+>Applications of OpenJade</A
+></DT
+><DT
+><A
+HREF="#AEN18"
+>Obtaining OpenJade</A
+></DT
+><DT
+><A
+HREF="#AEN22"
+>Supported Platforms</A
+></DT
+><DT
+><A
+HREF="#AEN107"
+>Building OpenJade from Source</A
+></DT
+><DT
+><A
+HREF="#AEN176"
+>Binary Distributions</A
+></DT
+><DT
+><A
+HREF="#AEN179"
+>Installation</A
+></DT
+><DT
+><A
+HREF="#AEN187"
+>Support</A
+></DT
+><DT
+><A
+HREF="#AEN200"
+>Version 1.3.2</A
+></DT
+><DT
+><A
+HREF="#AEN319"
+>Version 1.3.1</A
+></DT
+><DT
+><A
+HREF="#AEN837"
+>Version 1.3</A
+></DT
+><DT
+><A
+HREF="#AEN962"
+>Version 1.2.2</A
+></DT
+><DT
+><A
+HREF="#AEN1019"
+>Jade Version 1.2.1</A
+></DT
+></DL
+></DD
+></DL
+></DIV
+><DIV
+CLASS="LOT"
+><DL
+CLASS="LOT"
+><DT
+><B
+>List of Tables</B
+></DT
+><DT
+>1-1. <A
+HREF="#platforms"
+>Platforms on which OpenJade 1.3.2 is known to build.</A
+></DT
+><DT
+>1-2. <A
+HREF="#configure"
+>OpenJade specific configure options</A
+></DT
+><DT
+>1-3. <A
+HREF="#openjade132fixes"
+>Changes for release 1.3.2</A
+></DT
+><DT
+>1-4. <A
+HREF="#openjade131fixes"
+>Changes for release 1.3.1</A
+></DT
+></DL
+></DIV
+><DIV
+CLASS="chapter"
+><HR><H1
+><A
+NAME="AEN11">Chapter 1. OpenJade 1.3.2 Release Notes</H1
+><P
+>OpenJade is a suite of tools for validating, processing and applying DSSSL (Document Style Semantics and Specification Language) style sheets to SGML and XML documents.</P
+><P
+>OpenJade is a project undertaken by the DSSSL community to maintain
+and extend James Clark's Jade, as well as the related SP suite of SGML/XML processing tools. OpenJade and OpenSP are distributed under the same license as Jade.</P
+><DIV
+CLASS="sect1"
+><HR><H2
+CLASS="sect1"
+><A
+NAME="AEN15">Applications of OpenJade</H2
+><P
+>Many different projects, organizations and companies make use of OpenJade to publish documentation. The SGML/XML backend enables the generation of "world wide web ready" documents while the TeX backend allows high quality "ready for press" output to be obtained. The FreeBSD Handbook (second edition) ISBN: 1571763031 is one such example of a book created using OpenJade.</P
+></DIV
+><DIV
+CLASS="sect1"
+><HR><H2
+CLASS="sect1"
+><A
+NAME="AEN18">Obtaining OpenJade</H2
+><P
+>OpenJade is a project hosted at sourceforge.net and is available
+from the OpenJade web site at http://openjade.sourceforge.net or directly
+from the OpenJade project page at http://sourceforge.net/projects/openjade</P
+><P
+>OpenJade is provided in source code form. However as a courtesy
+to Win32 users where development tools are not always available, a binary release for the Win32 platform is usually available.</P
+></DIV
+><DIV
+CLASS="sect1"
+><HR><H2
+CLASS="sect1"
+><A
+NAME="AEN22">Supported Platforms</H2
+><P
+>OpenJade is intended to be as portable as possible. It should be
+possible to compile and build on most contemporary UNIX type platforms. In
+addition OpenJade will also build on Microsoft's Win32 based operating systems.
+</P
+><P
+>OpenJade is known to compile with both the GNU gcc c++ compiler and
+Microsoft Visual C++. Other compilers have not been extensively tested.</P
+><P
+>OpenJade has been successfully built with the following GNU compilers: 
+Red Hat g++ 2.96, GCC g++ 2.95.3, GCC g++ 3.2</P
+><P
+>OpenJade has been built on a number of architectures including Intel i386 and ia64, Alpha AXP, Sparc, PPC and S/390, S/390x.</P
+><P
+>The following table details known successful builds</P
+><DIV
+CLASS="table"
+><A
+NAME="platforms"><P
+><B
+>Table 1-1. Platforms on which OpenJade 1.3.2 is known to build.</B
+></P
+><TABLE
+BORDER="1"
+CLASS="CALSTABLE"
+><THEAD
+><TR
+><TH
+WIDTH="12%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Arch.</TH
+><TH
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>OS</TH
+><TH
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Compiler</TH
+><TH
+WIDTH="38%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Notes</TH
+></TR
+></THEAD
+><TBODY
+><TR
+><TD
+WIDTH="12%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>alpha</TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Debian 3.0</TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>GNU gcc 3.2</TD
+><TD
+WIDTH="38%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>&nbsp;</TD
+></TR
+><TR
+><TD
+WIDTH="12%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>arm</TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Debian 3.0</TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>GNU gcc 3.2</TD
+><TD
+WIDTH="38%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>&nbsp;</TD
+></TR
+><TR
+><TD
+WIDTH="12%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>hppa</TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Debian 3.0</TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>GNU gcc 3.2</TD
+><TD
+WIDTH="38%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>&nbsp;</TD
+></TR
+><TR
+><TD
+ROWSPAN="4"
+WIDTH="12%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>i386</TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Debian 3.0</TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>GNU gcc 3.2</TD
+><TD
+WIDTH="38%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>&nbsp;</TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Red Hat Linux 7.3</TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Red Hat gcc 2.96</TD
+><TD
+WIDTH="38%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>&nbsp;</TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Red Hat Linux 7.3</TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>GNU gcc 3.2</TD
+><TD
+WIDTH="38%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>&nbsp;</TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>SuSE Linux 8.1</TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>GNU gcc 3.2</TD
+><TD
+WIDTH="38%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>&nbsp;</TD
+></TR
+><TR
+><TD
+WIDTH="12%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>ia64</TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Debian 3.0</TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>GNU gcc 3.2</TD
+><TD
+WIDTH="38%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>&nbsp;</TD
+></TR
+><TR
+><TD
+WIDTH="12%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>m68k</TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Debian 3.0</TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>GNU gcc 3.2</TD
+><TD
+WIDTH="38%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>&nbsp;</TD
+></TR
+><TR
+><TD
+WIDTH="12%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>mips, mipsel</TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Debian 3.0</TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>GNU gcc 3.2</TD
+><TD
+WIDTH="38%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>&nbsp;</TD
+></TR
+><TR
+><TD
+WIDTH="12%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>powerpc</TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Debian 3.0</TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>GNU gcc 3.2</TD
+><TD
+WIDTH="38%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>&nbsp;</TD
+></TR
+><TR
+><TD
+WIDTH="12%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>s390</TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Debian 3.0</TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>GNU gcc 3.2</TD
+><TD
+WIDTH="38%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>&nbsp;</TD
+></TR
+><TR
+><TD
+WIDTH="12%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>sparc</TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Debian 3.0</TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>GNU gcc 3.2</TD
+><TD
+WIDTH="38%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>&nbsp;</TD
+></TR
+></TBODY
+></TABLE
+></DIV
+><P
+>Please report any successful builds not mentioned above to <TT
+CLASS="email"
+>&#60;<A
+HREF="mailto:openjade-devel@lists.sourceforge.net"
+>openjade-devel@lists.sourceforge.net</A
+>&#62;</TT
+>, including any diffs/patches you have used.</P
+></DIV
+><DIV
+CLASS="sect1"
+><HR><H2
+CLASS="sect1"
+><A
+NAME="AEN107">Building OpenJade from Source</H2
+><P
+>OpenJade requires 40Mb to 50Mb of disk space to build. An installation
+will require around 15Mb to 20Mb depending on architecture.</P
+><P
+>OpenJade makes use of the GNU software configuration tools (autoconf, libtool, automake etc).
+The GNU C++ compiler and make utility should also be used.
+The steps required to build the OpenJade tools (<B
+CLASS="command"
+>onsgmls</B
+>, <B
+CLASS="command"
+>openjade</B
+>, <B
+CLASS="command"
+>osgmlnorm</B
+>, <B
+CLASS="command"
+>ospam</B
+>, <B
+CLASS="command"
+>ospent</B
+>, <B
+CLASS="command"
+>osx</B
+>) and libraries are as follows:
+<PRE
+CLASS="screen"
+>gzip -d openjade-1.3.2.tar.gz | tar xvf -
+cd openjade-1.3.2
+./configure [<SPAN
+CLASS="optional"
+><TT
+CLASS="option"
+><TT
+CLASS="replaceable"
+><I
+>options&#8230;</I
+></TT
+></TT
+></SPAN
+>]
+make
+</PRE
+>
+You may need to switch to the super user <B
+CLASS="command"
+>root</B
+> to complete the installation
+<PRE
+CLASS="screen"
+>&#13;make install
+</PRE
+>
+If you wish to install man pages for the various commands you should then do
+<PRE
+CLASS="screen"
+>&#13;make install-man</PRE
+>
+The <B
+CLASS="command"
+>configure</B
+> script supports many options. These can be displayed using the command
+<PRE
+CLASS="screen"
+>&#13;./configure --help
+</PRE
+>
+In addition to the standard options, the following table describes options specific to openjade.</P
+><DIV
+CLASS="table"
+><A
+NAME="configure"><P
+><B
+>Table 1-2. OpenJade specific configure options</B
+></P
+><TABLE
+BORDER="1"
+CLASS="CALSTABLE"
+><THEAD
+><TR
+><TH
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Option</TH
+><TH
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Default</TH
+><TH
+WIDTH="50%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Explanation</TH
+></TR
+></THEAD
+><TBODY
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><TT
+CLASS="option"
+>--enable-spincludedir=path</TT
+></TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>/usr/include/OpenSP</TD
+><TD
+WIDTH="50%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Define the path where the OpenSP include files may be found.</TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><TT
+CLASS="option"
+>--enable-splibdir=path</TT
+></TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>/usr/lib</TD
+><TD
+WIDTH="50%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Define the path where the OpenSP library (libosp) may be found.</TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><TT
+CLASS="option"
+>--disable-mif</TT
+></TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>MIF support is enabled</TD
+><TD
+WIDTH="50%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>disable support for FrameMaker MIF output (the <TT
+CLASS="option"
+>-t mif</TT
+> option) to <B
+CLASS="command"
+>openjade</B
+>.</TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><TT
+CLASS="option"
+>--disable-html</TT
+></TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>html support enabled</TD
+><TD
+WIDTH="50%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>disable support for HTML+CSS output (the <TT
+CLASS="option"
+>-t html</TT
+> to <B
+CLASS="command"
+>openjade</B
+>).</TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><TT
+CLASS="option"
+>--enable-default-catalog=<TT
+CLASS="replaceable"
+><I
+>pathlist</I
+></TT
+></TT
+></TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Not enabled</TD
+><TD
+WIDTH="50%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Provide one or more default catalog files or sysids, e.g. /usr/local/lib/sgml/catalog</TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><TT
+CLASS="option"
+>--enable-default-search-path=<TT
+CLASS="replaceable"
+><I
+>pathlist</I
+></TT
+></TT
+></TD
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Not enabled</TD
+><TD
+WIDTH="50%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Provide a default value for <TT
+CLASS="varname"
+>SGML_SEARCH_PATH</TT
+></TD
+></TR
+></TBODY
+></TABLE
+></DIV
+><P
+>Please refer to the system documentation for details on building on the Win32 platform.</P
+></DIV
+><DIV
+CLASS="sect1"
+><HR><H2
+CLASS="sect1"
+><A
+NAME="AEN176">Binary Distributions</H2
+><P
+>Although the OpenJade project does not make binary distributions available, OpenJade has been a part of many software distributions, including the major Linux distributions as well as FreeBSD. Expect pre-compiled and packaged versions of the latest version of OpenJade to be available from your distributor in due course.</P
+></DIV
+><DIV
+CLASS="sect1"
+><HR><H2
+CLASS="sect1"
+><A
+NAME="AEN179">Installation</H2
+><P
+>In addition to the OpenJade executables and libraries you will also need various DTDs and stylesheets.
+Some DTDs and associated files (entity definitions) are available in the <TT
+CLASS="filename"
+>pubtext</TT
+> directory of the distribution.
+However, more authoritative sources should be referenced to ensure that up-to-date versions are used. If you wish to process XML files, then suitable SGML declarations for valid XML documents should be used. Again, a sample set of declarations (<TT
+CLASS="filename"
+>xml.dcl</TT
+>) is provided in the <TT
+CLASS="filename"
+>pubtext</TT
+>, but more complete or recent versions may be available from other sources.</P
+><P
+>OpenJade supports the standard SGML catalog facility; it is
+recommended that you set up and use such a catalog system.
+Generally speaking
+you will create your own DSSSL stylesheets for use with OpenJade, however, users
+of the OASIS DocBook DTD should be aware that extensive, and modular, stylesheets are available from the DocBook project at http://docbook.sourceforge.net.</P
+><P
+>If you wish to make use of the TeX backend you will require an up to
+date distribution of laTeX such as teTeX, TeXlive or fpTeX. In addition you
+will also require the jadetex package, available from http://jadetex.sourceforge.net.</P
+></DIV
+><DIV
+CLASS="sect1"
+><HR><H2
+CLASS="sect1"
+><A
+NAME="AEN187">Support</H2
+><P
+>If, after reading the documentation, you still have a problem, then you
+may require some additional help.
+The OpenJade project is a volunteer effort and as such does not provide any formal support.
+Instead, you should look to the community for support.
+Once part of the community, you, in turn, will be able to play your part in
+helping those that come after you. Here are some pointers to obtaining help:</P
+><P
+></P
+><UL
+><LI
+><P
+>If you obtained your OpenJade tools in binary form from your operating system distributor and you have a build related problem -
+such as openjade crashing, then your first port of call should be your distributor.</P
+></LI
+><LI
+><P
+>If you have a problem with the usage of openjade and tools, or general queries about DSSSL then you should try the DSSSL mailing list, see http://www.mulberrytech.com/dsssl/dssslist/ for details.</P
+></LI
+><LI
+><P
+>If you are using the DocBook DTD and especially if you are also using the Modular DocBook DSSSL stylesheets, then the docbook-apps mailing list is the place to go.
+See http://www.oasis-open.org/docbook/mailinglist/ for details.</P
+></LI
+><LI
+><P
+>If you have a patch or bug fix for OpenJade, or are trying to use the OpenSP API then the openjade-devel mailing list is the appropriate forum.</P
+></LI
+></UL
+><P
+>Please choose only one mailing list to post to, as cross-posting is generally frowned upon.
+The various mailing lists are archived and searchable.
+It is always worth searching for your problem first, as it is often the case that someone has had the same problem before.</P
+></DIV
+><DIV
+CLASS="sect1"
+><HR><H2
+CLASS="sect1"
+><A
+NAME="AEN200">Version 1.3.2</H2
+><DIV
+CLASS="formalpara"
+><P
+><B
+>Released December 2002. </B
+>This release allows openjade to be built against the most recent OpenSP release - version 1.5. It also contains some fixes for the MIF backend which were omitted from the 1.3.1 release. OpenSP is now distributed in a separate package and made available on its own release cycle</P
+></DIV
+><DIV
+CLASS="table"
+><A
+NAME="openjade132fixes"><P
+><B
+>Table 1-3. Changes for release 1.3.2</B
+></P
+><TABLE
+BORDER="1"
+CLASS="CALSTABLE"
+><THEAD
+><TR
+><TH
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Item 1</TH
+><TH
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>MIF Backend Fixes</TH
+></TR
+></THEAD
+><TBODY
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>References</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>G. Seshadri et al.</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Category</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Software Bug</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Problem</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Issues with page size and page header/footers</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Resolution</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Fix to make sure that right header is shown in documents and
+that document page size is initialised correctly.</P
+></TD
+></TR
+></TBODY
+></TABLE
+><TABLE
+BORDER="1"
+CLASS="CALSTABLE"
+><THEAD
+><TR
+><TH
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Item 2</TH
+><TH
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Support for building OpenSP 1.5</TH
+></TR
+></THEAD
+><TBODY
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>References</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Ian Castle, Karl Eichwalder</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Category</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Software Bug</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Problem</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>OpenSP is now at version 1.5 which has many improvements
+over 1.3.4</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Resolution</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>It is desirable to use OpenSP 1.5 which has many improvements
+over version 1.3.4 which shipped with openjade 1.3.1. However, it is
+awkward having to have two versions of OpenSP at the same time. OpenJade
+1.4 is not ready for release yet, so version 1.3.2 will link against
+OpenSP 1.5 and later - and no longer includes the old version 1.3.4 of OpenSP.  </P
+></TD
+></TR
+></TBODY
+></TABLE
+><TABLE
+BORDER="1"
+CLASS="CALSTABLE"
+><THEAD
+><TR
+><TH
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Item 3</TH
+><TH
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Correct definition of "attribute" in builtin.dsl</TH
+></TR
+></THEAD
+><TBODY
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>References</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Toby Speight, Debian Bug #145242</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Category</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Software Bug</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Problem</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>The definition of "attribute" (ISO/IEC 10179:1996, section 10.2.5) for SGML property operations was not correct.</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Resolution</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>The definition has been corrected in accordance
+with the standard.</P
+></TD
+></TR
+></TBODY
+></TABLE
+><TABLE
+BORDER="1"
+CLASS="CALSTABLE"
+><THEAD
+><TR
+><TH
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Item 4</TH
+><TH
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>XML backend doesn't quote "&#38;" in attribute values</TH
+></TR
+></THEAD
+><TBODY
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>References</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Toby Speight, Debian Bug #147073</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Category</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Software Bug</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Problem</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>When using OpenJade with the XML or SGML backend to output
+attribute values containing the '&#38;' character, the output is not
+well-formed.</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Resolution</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Fixed the Transform FOT Builder so that for XML output the
+'&#38;' character is properly quoted.</P
+></TD
+></TR
+></TBODY
+></TABLE
+></DIV
+></DIV
+><DIV
+CLASS="sect1"
+><HR><H2
+CLASS="sect1"
+><A
+NAME="AEN319">Version 1.3.1</H2
+><DIV
+CLASS="formalpara"
+><P
+><B
+>Released January 2002. </B
+>This release is primarily a maintenance release. It delivers two key advantages over the OpenJade 1.3 release: Support for contemporary platforms (operating systems and compilers) and incorporates the various patches and improvements, especially to the TeX backend, which have been extensively used over the last few years. Probably the biggest benefit to TeX backend users are the enhanced table support and improved two sided output support (in conjunction with improvements to the companion jadetex package).</P
+></DIV
+><P
+>The following table details the major improvements in Openjade 1.3.1</P
+><DIV
+CLASS="table"
+><A
+NAME="openjade131fixes"><P
+><B
+>Table 1-4. Changes for release 1.3.1</B
+></P
+><TABLE
+BORDER="1"
+CLASS="CALSTABLE"
+><THEAD
+><TR
+><TH
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Item 1</TH
+><TH
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Support for MacOS X/ Darwin</TH
+></TR
+></THEAD
+><TBODY
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>References</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Fink Project; Kogulé, Ryo</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Category</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Software Bug</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Problem</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>OpenJade 1.3 does not build and run on the Mac OS X/Darwin platform</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Resolution</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>OpenJade 1.3.1 has been enhanced to support Mac OS X/Darwin 1.4. The
+autoconf configuration system has been upgraded and also includes specific
+platform support. Some minor code alterations to improve code portability (C++
+style changes). Note that the POSIX locale feature is not available on this platform.</P
+></TD
+></TR
+></TBODY
+></TABLE
+><TABLE
+BORDER="1"
+CLASS="CALSTABLE"
+><THEAD
+><TR
+><TH
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Item 2</TH
+><TH
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>UNIX on-line manual pages</TH
+></TR
+></THEAD
+><TBODY
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>References</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>None</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Category</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Documentation Bug</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Problem</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>No on-line manual (man) pages available on UNIX platforms</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Resolution</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>OpenJade 1.3.1 now has a man page for every command. Additionally, if
+OpenJade is used as a replacement for Jade, then compatibility man pages are included (i.e.
+man jade is synonymous with man openjade).</P
+></TD
+></TR
+></TBODY
+></TABLE
+><TABLE
+BORDER="1"
+CLASS="CALSTABLE"
+><THEAD
+><TR
+><TH
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Item 3</TH
+><TH
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Upgrade GNU source configuration tools</TH
+></TR
+></THEAD
+><TBODY
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>References</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Various sourceforge problem reports, SuSE Linux 7.3, Red Hat 7.2, Red Hat Bugzilla #46212</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Category</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Software Bug</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Problem</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>The source configuration system is based on old versions of libtool and autoconf.
+In addition, there are problems with the generated Makefile files such that installation
+directories are not created.</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Resolution</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Upgraded to autoconf 2.52 and libtool 1.4. Upgraded the various support files.
+Included elements of automake support. Made the Makefiles more robust. These changes
+should facilitate porting to new/updated environments (i.e. those supported by
+newer versions of autoconf). Work has been done to enhance some of the custom autoconf tests to
+improve reliability.</P
+></TD
+></TR
+></TBODY
+></TABLE
+><TABLE
+BORDER="1"
+CLASS="CALSTABLE"
+><THEAD
+><TR
+><TH
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Item 4</TH
+><TH
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Support for XML Byte Order Marks (BOM)</TH
+></TR
+></THEAD
+><TBODY
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>References</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Source Forge bug #442560 (Terje Bless/Liam Quinn)</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Category</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Software Bug</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Problem</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Since OpenJade 1.3 was released, a second edition of the XML 1.0 specification
+has been released (REC-xml-20001006). This specification introduced the concept
+of Byte Order Marks to increase the sophistication of the detection of
+the character encoding system. OpenJade 1.3 would not recognize these, and rejected
+any XML file which included these as invalid.</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Resolution</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>XML 1.0 Byte Order Marks are now accepted as valid XML.</P
+></TD
+></TR
+></TBODY
+></TABLE
+><TABLE
+BORDER="1"
+CLASS="CALSTABLE"
+><THEAD
+><TR
+><TH
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Item 5</TH
+><TH
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Fix missing white space problem in processing instruction flow object</TH
+></TR
+></THEAD
+><TBODY
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>References</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Source Forge Ref #505113, #505124 (Markus Hoenicka)</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Category</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Software Bug</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Problem</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>No white space was emitted between the public-id and the system-id
+       causing a malformed XML file to be generated.</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Resolution</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Fixed OpenJade to output a space between the public-id and the system-id.</P
+></TD
+></TR
+></TBODY
+></TABLE
+><TABLE
+BORDER="1"
+CLASS="CALSTABLE"
+><THEAD
+><TR
+><TH
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Item 6</TH
+><TH
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Jadetex is now distributed independently</TH
+></TR
+></THEAD
+><TBODY
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>References</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>None</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Category</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Software Bug</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Problem</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>OpenJade 1.3 shipped with Jadetex 2.7. Jadetex is developed and released
+separately from OpenJade.</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Resolution</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Removed jadetex files. Jadetex can be obtained from http://jadetex.sourceforge.net</P
+></TD
+></TR
+></TBODY
+></TABLE
+><TABLE
+BORDER="1"
+CLASS="CALSTABLE"
+><THEAD
+><TR
+><TH
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Item 7</TH
+><TH
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Support for FreeBSD 4.4</TH
+></TR
+></THEAD
+><TBODY
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>References</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>FreeBSD 4.4 openjade port</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Category</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Software Bug</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Problem</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>OpenJade 1.3 would not build on FreeBSD 4.x</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Resolution</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>The source configuration system has been enhanced to support
+FreeBSD out of the box. Note that the POSIX locale feature of OpenJade is not
+available under FreeBSD.</P
+></TD
+></TR
+></TBODY
+></TABLE
+><TABLE
+BORDER="1"
+CLASS="CALSTABLE"
+><THEAD
+><TR
+><TH
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Item 8</TH
+><TH
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Allow non alpha numeric characters in Table of Contents</TH
+></TR
+></THEAD
+><TBODY
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>References</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Red Hat Bugzilla #31525</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Category</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Software Bug</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Problem</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>&#13;Certain non alpha-numeric characters (such as $) do not appear correctly in the table of contents. This problem is confined to the TeX backend.
+</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Resolution</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Special characters are now correctly escaped in the TeX output file.</P
+></TD
+></TR
+></TBODY
+></TABLE
+><TABLE
+BORDER="1"
+CLASS="CALSTABLE"
+><THEAD
+><TR
+><TH
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Item 9</TH
+><TH
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Support for latest Win32 build environments</TH
+></TR
+></THEAD
+><TBODY
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>References</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>None</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Category</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Software Bug</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Problem</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>OpenJade 1.3 does not build with Visual C++ 6.0</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Resolution</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Fix C++ style to be compatible with Visual C++. Update build environment. OpenJade 1.3.1 should run in all Windows 32 environments from Windows 95 through Windows NT to Windows XP.</P
+></TD
+></TR
+></TBODY
+></TABLE
+><TABLE
+BORDER="1"
+CLASS="CALSTABLE"
+><THEAD
+><TR
+><TH
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Item 10</TH
+><TH
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Enhancements for Software Packaging</TH
+></TR
+></THEAD
+><TBODY
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>References</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>SuSE Linux 7.3</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Category</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Software Bug</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Problem</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Numerous patches need to be applied to OpenJade 1.3 to enable packages to be built (RPM)</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Resolution</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Enhance Makefiles to ensure that packages are easy to build (including addition of <TT
+CLASS="varname"
+>DESTDIR</TT
+> environment variable). It should now be possible to build RPM packages and BSD ports without resorting to patches.</P
+></TD
+></TR
+></TBODY
+></TABLE
+><TABLE
+BORDER="1"
+CLASS="CALSTABLE"
+><THEAD
+><TR
+><TH
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Item 11</TH
+><TH
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Support for newer GNU C++ compilers</TH
+></TR
+></THEAD
+><TBODY
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>References</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>SuSE Linux 7.3 (Andreas Schwab), Red Hat Linux 7.2, Connectiva Linux</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Category</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Software Bug</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Problem</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>C++ is a shifting target. New compilers/standards demand changes.</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Resolution</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Various enhancements to allow OpenJade to build with the new GNU GCC 3.0 and the soon to be released GNU GCC 3.1 c++ compilers</P
+></TD
+></TR
+></TBODY
+></TABLE
+><TABLE
+BORDER="1"
+CLASS="CALSTABLE"
+><THEAD
+><TR
+><TH
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Item 12</TH
+><TH
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Support for jadetex 3.4 and greater macros for two sided support</TH
+></TR
+></THEAD
+><TBODY
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>References</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Sourceforge patch #439755,
+       http://iNdev.iNsu.COM/openjade/ (Francis J. Lacoste)</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Category</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Software Bug</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Problem</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Two Sided output support with the TeX backend is unreliable in OpenJade 1.3 and Jadetex 2.x.</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Resolution</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Enhance the TeX backend two sided output support and bring into line with advances in the jadetex latex front end. Two extension characteristics are introduced to allow control of <TT
+CLASS="function"
+>two-side</TT
+> and <TT
+CLASS="function"
+>two-side-start-on-right</TT
+>. This also fixes the "blank page at the end of the document" problem. The following new characteristics are available:
+<PRE
+CLASS="screen"
+>&#13;  "UNREGISTERED::OpenJade//Characteristic::page-two-side?"
+
+  "UNREGISTERED::OpenJade//Characteristic::two-side-start-on-right?"
+</PRE
+></P
+></TD
+></TR
+></TBODY
+></TABLE
+><TABLE
+BORDER="1"
+CLASS="CALSTABLE"
+><THEAD
+><TR
+><TH
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Item 13</TH
+><TH
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Prevent incorrect generation of ligatures in the TeX Backend</TH
+></TR
+></THEAD
+><TBODY
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>References</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Red Hat Bugzilla #11497, #11779</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Category</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Software Bug</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Problem</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Certain sequences of characters (such as --) are not correctly escaped in the TeX backend, so that TeX incorrectly creates ligatures out of them (so that -- becomes an em dash &#8212;).</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Resolution</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>OpenJade 1.3.1 now correctly escapes these character sequences. This is a particular problem when representing program code where sequences such as -- are often operators.</P
+></TD
+></TR
+></TBODY
+></TABLE
+><TABLE
+BORDER="1"
+CLASS="CALSTABLE"
+><THEAD
+><TR
+><TH
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Item 14</TH
+><TH
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Improved time string handling</TH
+></TR
+></THEAD
+><TBODY
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>References</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>http://iNdev.iNsu.COM/openjade/ (Francis J. Lacoste)</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Category</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Software Bug</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Problem</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>OpenJade 1.3 does not support the <TT
+CLASS="function"
+>(time&#60;=?)</TT
+> comparison</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Resolution</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Various bugs fixed in the time string support of OpenJade.
+It is now possible to compare time, date and datetime.
+Also partial formats (such as YY-MM-DD, YYYY-MM or HH:MM) are now supported</P
+></TD
+></TR
+></TBODY
+></TABLE
+><TABLE
+BORDER="1"
+CLASS="CALSTABLE"
+><THEAD
+><TR
+><TH
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Item 15</TH
+><TH
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Improvements in handling <TT
+CLASS="function"
+>sosofo-append</TT
+></TH
+></TR
+></THEAD
+><TBODY
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>References</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>http://iNdev.iNsu.COM/openjade/ (Francis J. Lacoste)</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Category</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Software Bug</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Problem</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>sosofo-append has problems with memory/stack usage when
+handling large lists of sosofo</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Resolution</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>The fix optimizes <TT
+CLASS="function"
+>sosofo-append</TT
+> to reduce its memory and stack
+       usage when using it to build long list of sosofo :
+<PRE
+CLASS="screen"
+>&#13;    (let loop ( (res (empty-sosofo))
+        (nl  (node-list-rest (children (current-node)))))
+           (loop (sosofo-append res (process-node-list
+        (node-list-first nl)))
+            (node-list-rest nl)))
+</PRE
+></P
+></TD
+></TR
+></TBODY
+></TABLE
+><TABLE
+BORDER="1"
+CLASS="CALSTABLE"
+><THEAD
+><TR
+><TH
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Item 16</TH
+><TH
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Improved Table handling in TeX Backend</TH
+></TR
+></THEAD
+><TBODY
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>References</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>http://iNdev.iNsu.COM/openjade/ (Francis J. Lacoste)</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Category</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Software Bug</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Problem</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Table handling in the TeX backend has numerous problems.
+</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Resolution</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Support for tables in the TeX backend has been improved with:</P
+>
+<P
+></P
+><UL
+><LI
+><P
+>Support for nested tables.</P
+></LI
+><LI
+><P
+><TT
+CLASS="function"
+>cell-after-column-margin:</TT
+> and <TT
+CLASS="function"
+>cell-before-column-margin:</TT
+> wasn't really working.</P
+></LI
+><LI
+><P
+>Row spanning was broken. This fix only supports
+               <TT
+CLASS="function"
+>'start</TT
+> row alignment though.</P
+></LI
+><LI
+><P
+>Paragraphs in cell spanning multiple column are now
+       working.</P
+></LI
+><LI
+><P
+>Support for the <TT
+CLASS="function"
+>row-alignment:</TT
+> characteristic.</P
+></LI
+><LI
+><P
+>Support for <TT
+CLASS="function"
+>cell-background?</TT
+> and <TT
+CLASS="function"
+>background-color</TT
+> properties</P
+></LI
+></UL
+>
+</TD
+></TR
+></TBODY
+></TABLE
+><TABLE
+BORDER="1"
+CLASS="CALSTABLE"
+><THEAD
+><TR
+><TH
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Item 17</TH
+><TH
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+>Support for <TT
+CLASS="function"
+>'asis</TT
+> and <TT
+CLASS="function"
+>'asis-wrap</TT
+></TH
+></TR
+></THEAD
+><TBODY
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>References</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>http://iNdev.iNsu.COM/openjade/ (Francis J. Lacoste)</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Category</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Software Bug</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Problem</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>The <TT
+CLASS="function"
+>lines:</TT
+> characteristic in the paragraph flow object does not
+support the <TT
+CLASS="function"
+>'asis</TT
+> and <TT
+CLASS="function"
+>'asis-wrap</TT
+> values.</P
+></TD
+></TR
+><TR
+><TD
+WIDTH="25%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>Resolution</P
+></TD
+><TD
+WIDTH="75%"
+ALIGN="LEFT"
+VALIGN="MIDDLE"
+><P
+>&#13;   This adds support for the <TT
+CLASS="function"
+>'asis</TT
+> and <TT
+CLASS="function"
+>'asis-wrap</TT
+> values for the
+         paragraph's lines: characteristic.
+</P
+></TD
+></TR
+></TBODY
+></TABLE
+></DIV
+></DIV
+><DIV
+CLASS="sect1"
+><HR><H2
+CLASS="sect1"
+><A
+NAME="AEN837">Version 1.3</H2
+><DIV
+CLASS="formalpara"
+><P
+><B
+>Released October 1999. </B
+>Version 1.3 added many improvements to increase the scope of the implementation of DSSSL. Changes include:</P
+></DIV
+><P
+></P
+><UL
+><LI
+><P
+>The SGML backend will now emit linebreaks when used as <TT
+CLASS="option"
+>-t sgml-raw</TT
+>.</P
+></LI
+><LI
+><P
+>&#13;Jade can bind variables to arbitrary values on the command line with the <TT
+CLASS="option"
+>-V</TT
+> option. 
+    </P
+></LI
+><LI
+><P
+>&#13;The <TT
+CLASS="function"
+>prlabs1</TT
+> module of the SGML property set is supported.
+    </P
+></LI
+><LI
+><P
+>&#13;Style sheet <TT
+CLASS="filename"
+>extensions.dsl</TT
+> lists all known
+  external procedures ready for easy inclusion
+  as an <TT
+CLASS="function"
+>external-specification</TT
+>.
+    </P
+></LI
+><LI
+><P
+>&#13;External procedure with public identifier
+<PRE
+CLASS="screen"
+>&#13;  "UNREGISTERED::OpenJade//Procedure::expt"
+</PRE
+>
+  to provide integral powers of quantities.
+    </P
+></LI
+><LI
+><P
+>&#13;External procedure with public identifier
+<PRE
+CLASS="screen"
+>&#13;  "UNREGISTERED::OpenJade//Procedure::sgml-parse"
+</PRE
+>
+  allows to parse w.r.t. an architecture.
+    </P
+></LI
+><LI
+><P
+>&#13;Jade supports <TT
+CLASS="function"
+>force!</TT
+> for inherited characteristics.
+    </P
+></LI
+><LI
+><P
+>&#13;Jade supports character properties.
+    </P
+></LI
+><LI
+><P
+>&#13;Jade supports <TT
+CLASS="function"
+>special-query-expressions</TT
+>.
+    </P
+></LI
+><LI
+><P
+>&#13;Jade can bind variables to string values on the command line.
+    </P
+></LI
+><LI
+><P
+>&#13;All standard color spaces supported. 
+    </P
+></LI
+><LI
+><P
+>&#13;Jade ignores duplicate keywords in make expressions, as 
+  mandated by DSSSL.
+    </P
+></LI
+><LI
+><P
+>&#13;External procedure with public identifier
+<PRE
+CLASS="screen"
+>&#13;  "UNREGISTERED::OpenJade//Procedure::language"
+</PRE
+>
+  to create a language object by reference to a POSIX locale.
+    </P
+></LI
+><LI
+><P
+>&#13;Language-dependent procedures of the expression language:
+<TT
+CLASS="function"
+>language?,</TT
+>
+<TT
+CLASS="function"
+>current-language,</TT
+>
+<TT
+CLASS="function"
+>declare-default-language,</TT
+>
+<TT
+CLASS="function"
+>with-language,</TT
+>
+<TT
+CLASS="function"
+>define-language,</TT
+>
+<TT
+CLASS="function"
+>char&#60;?,</TT
+>
+<TT
+CLASS="function"
+>char&#62;?,</TT
+>
+<TT
+CLASS="function"
+>char&#60;=?,</TT
+>
+<TT
+CLASS="function"
+>char&#62;=?,</TT
+>
+<TT
+CLASS="function"
+>char-ci=?,</TT
+>
+<TT
+CLASS="function"
+>char-ci&#60;?,</TT
+>
+<TT
+CLASS="function"
+>char-ci&#62;?,</TT
+>
+<TT
+CLASS="function"
+>char-ci&#60;=?,</TT
+>
+<TT
+CLASS="function"
+>char-ci&#60;=?,</TT
+>
+<TT
+CLASS="function"
+>char-upcase,</TT
+>
+<TT
+CLASS="function"
+>char-downcase,</TT
+>
+<TT
+CLASS="function"
+>string-ci=?,</TT
+>
+<TT
+CLASS="function"
+>string-equiv?,</TT
+>
+<TT
+CLASS="function"
+>string&#60;?,</TT
+>
+<TT
+CLASS="function"
+>string&#62;?,</TT
+>
+<TT
+CLASS="function"
+>string&#60;=?,</TT
+>
+<TT
+CLASS="function"
+>string&#62;=?,</TT
+>
+<TT
+CLASS="function"
+>string-ci&#60;?,</TT
+>
+<TT
+CLASS="function"
+>string-ci&#62;?,</TT
+>
+<TT
+CLASS="function"
+>string-ci&#60;=?,</TT
+>
+<TT
+CLASS="function"
+>string-ci&#62;=?.</TT
+>
+    </P
+></LI
+><LI
+><P
+>&#13;The style-sheet.dtd derived from the DSSSL architecture
+  has been extended (in a backward compatible way) to
+  include the declaration element type forms supported by
+  Jade. The public identifier for the dtd is 
+<PRE
+CLASS="screen"
+>&#13;  "-//OpenJade//DTD DSSSL Style Sheet//EN" 
+</PRE
+>
+    </P
+></LI
+><LI
+><P
+>&#13;<TT
+CLASS="function"
+>char-repertoire</TT
+>, <TT
+CLASS="function"
+>add-name-chars</TT
+> and <TT
+CLASS="function"
+>add-separator-chars</TT
+>
+  declaration element type forms are supported. When given
+  the <TT
+CLASS="option"
+>-s</TT
+> command line flag, Jade doesn't use its built in 
+  character repertoire.
+    </P
+></LI
+><LI
+><P
+>&#13;Most of the derived procedures in the query language:
+<TT
+CLASS="function"
+>current-root</TT
+>,
+<TT
+CLASS="function"
+>node-list-reduce</TT
+>,
+<TT
+CLASS="function"
+>node-list-contains?</TT
+>,
+<TT
+CLASS="function"
+>node-list-remove-duplicates</TT
+>,
+<TT
+CLASS="function"
+>node-list-union</TT
+>, 
+<TT
+CLASS="function"
+>node-list-intersection</TT
+>,
+<TT
+CLASS="function"
+>node-list-difference</TT
+>, 
+<TT
+CLASS="function"
+>node-list-symmetric-difference</TT
+>,
+<TT
+CLASS="function"
+>node-list-union-map</TT
+>,
+<TT
+CLASS="function"
+>node-list-some?</TT
+>,
+<TT
+CLASS="function"
+>node-list-every?</TT
+>,
+<TT
+CLASS="function"
+>node-list-filter</TT
+>,
+<TT
+CLASS="function"
+>node-list-&#62;list</TT
+>,
+<TT
+CLASS="function"
+>node-list-tail</TT
+>,
+<TT
+CLASS="function"
+>node-list-head</TT
+>,
+<TT
+CLASS="function"
+>node-list-sublist</TT
+>,
+<TT
+CLASS="function"
+>node-list-count</TT
+>,
+<TT
+CLASS="function"
+>node-list-last</TT
+>,
+<TT
+CLASS="function"
+>node-list-property</TT
+>,
+<TT
+CLASS="function"
+>origin</TT
+>,
+<TT
+CLASS="function"
+>origin-to-subnode-rel</TT
+>,
+<TT
+CLASS="function"
+>tree-root</TT
+>,
+<TT
+CLASS="function"
+>grove-root</TT
+>,
+<TT
+CLASS="function"
+>source</TT
+>,
+<TT
+CLASS="function"
+>subtree</TT
+>,
+<TT
+CLASS="function"
+>subgrove</TT
+>,
+<TT
+CLASS="function"
+>ancestors</TT
+>,
+<TT
+CLASS="function"
+>grove-root-path</TT
+>,
+<TT
+CLASS="function"
+>rsiblings</TT
+>,
+<TT
+CLASS="function"
+>ipreced</TT
+>,
+<TT
+CLASS="function"
+>ifollow</TT
+>,
+<TT
+CLASS="function"
+>grove-before?</TT
+>,
+<TT
+CLASS="function"
+>sort-in-tree-order</TT
+>,
+<TT
+CLASS="function"
+>tree-before?</TT
+>,
+<TT
+CLASS="function"
+>tree-before</TT
+>,
+<TT
+CLASS="function"
+>property-lookup</TT
+>,
+<TT
+CLASS="function"
+>select-by-property</TT
+>, 
+<TT
+CLASS="function"
+>select-by-null-property</TT
+>,
+<TT
+CLASS="function"
+>select-by-missing-property</TT
+>,
+<TT
+CLASS="function"
+>attribute</TT
+>,
+<TT
+CLASS="function"
+>referent</TT
+>,
+<TT
+CLASS="function"
+>q-element</TT
+>,
+<TT
+CLASS="function"
+>q-class</TT
+>,
+<TT
+CLASS="function"
+>q-sdata</TT
+>.
+    </P
+></LI
+></UL
+></DIV
+><DIV
+CLASS="sect1"
+><HR><H2
+CLASS="sect1"
+><A
+NAME="AEN962">Version 1.2.2</H2
+><DIV
+CLASS="formalpara"
+><P
+><B
+>Released June 1999. </B
+>The first release of OpenJade.</P
+></DIV
+><P
+>Changes in OpenJade 1.2.2</P
+><P
+></P
+><UL
+><LI
+><P
+>&#13;The HTML and MIF backends are now enabled by default.
+    </P
+></LI
+><LI
+><P
+>&#13;The TeX backend has support for PDF bookmarks. This is
+  supported by the new version of jadetex which is included.
+    </P
+></LI
+><LI
+><P
+>&#13;Predefined character names <TT
+CLASS="function"
+>line-feed</TT
+> and <TT
+CLASS="function"
+>carriage-return</TT
+> 
+  for the character numbers 10 and 13.
+    </P
+></LI
+><LI
+><P
+>&#13;standard-chars and map-sdata-entity declaration element
+type forms are supported.
+    </P
+></LI
+><LI
+><P
+>&#13;Style language additions: map-constructor.
+    </P
+></LI
+><LI
+><P
+>&#13;<TT
+CLASS="function"
+>+</TT
+> and <TT
+CLASS="function"
+>-</TT
+> return a <TT
+CLASS="function"
+>length-spec</TT
+> if any of there arguments
+  is a <TT
+CLASS="function"
+>length-spec</TT
+>.
+    </P
+></LI
+><LI
+><P
+>&#13;Most of the DSSSL non-core expression language:
+<TT
+CLASS="function"
+>c...r</TT
+>,
+<TT
+CLASS="function"
+>assoc</TT
+>,
+<TT
+CLASS="function"
+>keyword-&#62;string</TT
+>,
+<TT
+CLASS="function"
+>string-&#62;keyword</TT
+>,
+<TT
+CLASS="function"
+>exact?</TT
+>,
+<TT
+CLASS="function"
+>inexact?</TT
+>,
+<TT
+CLASS="function"
+>zero?</TT
+>,
+<TT
+CLASS="function"
+>positive?</TT
+>,
+<TT
+CLASS="function"
+>negative?</TT
+>,
+<TT
+CLASS="function"
+>odd?</TT
+>,
+<TT
+CLASS="function"
+>even?</TT
+>,
+<TT
+CLASS="function"
+>exp</TT
+>,
+<TT
+CLASS="function"
+>log</TT
+>,
+<TT
+CLASS="function"
+>sin</TT
+>,
+<TT
+CLASS="function"
+>cos</TT
+>,
+<TT
+CLASS="function"
+>tan</TT
+>,
+<TT
+CLASS="function"
+>asin</TT
+>,
+<TT
+CLASS="function"
+>acos</TT
+>,
+<TT
+CLASS="function"
+>atan</TT
+>,
+<TT
+CLASS="function"
+>expt</TT
+>,
+<TT
+CLASS="function"
+>exact-&#62;inexact</TT
+>,
+<TT
+CLASS="function"
+>inexact-&#62;exact</TT
+>,
+<TT
+CLASS="function"
+>quantity-&#62;number</TT
+>,
+<TT
+CLASS="function"
+>string-&#62;list</TT
+>,
+<TT
+CLASS="function"
+>list-&#62;string</TT
+>,
+<TT
+CLASS="function"
+>map</TT
+>,
+<TT
+CLASS="function"
+>time&#60;?</TT
+>,
+<TT
+CLASS="function"
+>time&#62;?</TT
+>,
+<TT
+CLASS="function"
+>time&#60;=?</TT
+>,
+<TT
+CLASS="function"
+>time&#62;=?</TT
+>.
+    </P
+></LI
+></UL
+></DIV
+><DIV
+CLASS="sect1"
+><HR><H2
+CLASS="sect1"
+><A
+NAME="AEN1019">Jade Version 1.2.1</H2
+><DIV
+CLASS="formalpara"
+><P
+><B
+>Released October 1998. </B
+>Jade 1.2.1 was the final release of jade from James Clark. OpenJade is based on this code base.</P
+></DIV
+></DIV
+></DIV
+></DIV
+></BODY
+></HTML
+>
\ No newline at end of file
diff --git a/releasenotes.pdf b/releasenotes.pdf
new file mode 100644 (file)
index 0000000..bd6cb77
Binary files /dev/null and b/releasenotes.pdf differ
diff --git a/releasenotes.ps b/releasenotes.ps
new file mode 100644 (file)
index 0000000..4f4414c
--- /dev/null
@@ -0,0 +1,31112 @@
+%!PS-Adobe-3.0
+%%Title: (releasenotes.pdf)
+%%Version: 1 3
+%%Creator: (LaTeX with hyperref package)
+%%CreationDate: (D:20021201161700)
+%%For: (OpenJade Project)
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%BoundingBox: 0 0 610 789
+%%Pages: 18
+%%DocumentProcessColors: (atend)
+%%DocumentNeededResources: (atend)
+%%DocumentSuppliedResources:
+%%+ procset (Adobe Acrobat - PDF operators) 1.2 0
+%%+ procset (Adobe Acrobat - type operators) 1.2 0
+%%+ procset (Adobe Acrobat - general image support) 1.2 0
+%%+ procset (Adobe Acrobat - monochrome image support) 1.2 0
+%%+ procset (Adobe Acrobat - color image support) 1.2 0
+%%EndComments
+%%BeginDefaults
+%%EndDefaults
+%%BeginProlog
+%%EndProlog
+%%BeginSetup
+%%BeginResource: l2check
+%%Copyright: Copyright 1993 Adobe Systems Incorporated. All Rights Reserved.
+systemdict /languagelevel known
+{ systemdict /languagelevel get 1 eq }
+{ true }
+ifelse
+{
+initgraphics /Helvetica findfont 18 scalefont setfont
+72 600 moveto (Error: Your printer driver needs to be configured) dup show
+72 580 moveto (for printing to a PostScript Language Level 1 printer.) dup show
+exch = =
+/Helvetica-Bold findfont 16 scalefont setfont
+72 520 moveto (Windows and Unix) show
+/Times-Roman findfont 16 scalefont setfont
+72 500 moveto (Select ÂªLanguage Level 1º in the PostScript options section) show
+72 480 moveto (of the Acrobat print dialog.) show
+/Helvetica-Bold findfont 16 scalefont setfont
+72 440 moveto (Macintosh) show
+/Times-Roman findfont 16 scalefont setfont
+72 420 moveto (In the Chooser, select your printer driver.) show
+72 400 moveto (Then select your printer and click the Setup button.) show
+72 380 moveto (Follow any on-screen dialogs that may appear.) show
+showpage
+quit
+}
+if
+%%EndResource
+/currentpacking where{pop currentpacking true setpacking}if
+%%BeginResource: procset pdfvars
+%%Copyright: Copyright 1987-1999 Adobe Systems Incorporated. All Rights Reserved.
+%%Version: 4.0 2
+%%Title: definition of dictionary of variables used by PDF & PDFText procsets
+userdict /PDF 160 dict put
+userdict /PDFVars 86 dict dup begin put
+/_save 0 def
+/_cshow 0 def
+/InitAll 0 def
+/TermAll 0 def
+/DocInitAll 0 def
+/DocTermAll 0 def
+/_lp /none def
+/_doClip 0 def
+/sfc 0 def
+/_sfcs 0 def
+/_sfc 0 def
+/ssc 0 def
+/_sscs 0 def
+/_ssc 0 def
+/_fcs 0 def
+/_scs 0 def
+/_fp 0 def
+/_sp 0 def
+/AGM_MAX_CS_COMPONENTS 10 def
+/_fillColors [ 0 1 AGM_MAX_CS_COMPONENTS { array } for ] def
+/_strokeColors [ 0 1 AGM_MAX_CS_COMPONENTS { array } for ] def
+/_fc null def
+/_sc null def
+/DefaultGray [/DeviceGray] def
+/DefaultRGB [/DeviceRGB] def
+/DefaultCMYK [/DeviceCMYK] def
+/_inT false def
+/_tr -1 def
+/_rise 0 def
+/_ax 0 def
+/_cx 0 def
+/_ld 0 def
+/_tm matrix def
+/_ctm matrix def
+/_mtx matrix def
+/_hy (-) def
+/_fScl 0 def
+/_hs 1 def
+/_pdfEncodings 2 array def
+/_baselineadj 0 def
+/_fTzero false def
+/_Tj 0 def
+/_italMtx [1 0 .212557 1 0 0] def
+/_italMtx_WMode1 [1 -.212557 0 1 0 0] def
+/_italMtxType0 [1 0 .1062785 1 0 0] def
+/_italMtx_WMode1Type0 [1 -.1062785 0 1 0 0] def
+/_basefont 0 def
+/_basefonto 0 def
+/_pdf_oldCIDInit null def
+/_pdf_FontDirectory 30 dict def
+/_categories 10 dict def
+/_sa? true def
+/_op? false def
+/_OP? false def
+/_opmode 0 def
+/_ColorSep5044? false def
+/_tmpcolr? [] def
+/_tmpop? {} def
+/_processColors 0 def
+/_defaulttransfer currenttransfer def
+/_defaultflatness currentflat def
+/_defaulthalftone null def
+/_defaultcolortransfer null def
+/_defaultblackgeneration null def
+/_defaultundercolorremoval null def
+/_defaultcolortransfer null def
+end
+%%EndResource
+PDFVars begin PDF begin
+%%BeginResource: procset pdfutil
+%%Copyright: Copyright 1993-1999 Adobe Systems Incorporated. All Rights Reserved.
+%%Version: 4.0 2
+%%Title: Basic utilities used by other PDF procsets
+/bd {bind def} bind def
+/ld {load def} bd
+/bld {
+dup length dict begin
+{ null def } forall
+bind
+end
+def
+} bd
+/dd { PDFVars 3 1 roll put } bd
+/xdd { exch dd } bd
+/Level2?
+systemdict /languagelevel known
+{ systemdict /languagelevel get 2 ge } { false } ifelse
+def
+/Level3?
+systemdict /languagelevel known
+{systemdict /languagelevel get 3 eq } { false } ifelse
+def
+/getifknown {
+2 copy known { get true } { pop pop false } ifelse
+} bd
+/here {
+currentdict exch getifknown
+} bd
+/isdefined? { where { pop true } { false } ifelse } bd
+/StartLoad { dup dup not { /_save save dd } if } bd
+/EndLoad { if not { _save restore } if } bd
+%%EndResource
+%%BeginResource: procset pdf
+%%Version: 4.0 3
+%%Copyright: Copyright 1998-1999 Adobe Systems Incorporated. All Rights Reserved.
+%%Title: General operators for PDF, common to all Language Levels.
+[/b/B/b*/B*/BDC/BI/BMC/BT/BX/c/cm/cs/CS/d/d0/d1/Do/DP/EI/EMC/ET/EX/f/f*/g/G/gs
+/h/i/j/J/k/K/l/m/M/MP/n/q/Q/re/rg/RG/ri/s/S/sc/SC/scn/SCN/sg/Tc/Td/TD/Tf/Tj/TJ
+/TL/Tm/Tr/Ts/Tw/Tz/T*/v/w/W/W*/y/'/"
+/applyInterpFunc/applystitchFunc/domainClip/EF/encodeInput/gsDI/ilp/icl
+/initgs/int/limit/PS/rangeClip/RC/rf/makePat/csfamily 
+/? /! /| /: /+ /GetGlyphDirectory
+] {null def} bind forall
+/v { currentpoint 6 2 roll c } bd
+/y { 2 copy c } bd
+/h/closepath ld
+/d/setdash ld
+/j/setlinejoin ld
+/J/setlinecap ld
+/M/setmiterlimit ld
+/w/setlinewidth ld
+/i {
+dup 0 eq { pop _defaultflatness } if
+setflat
+} bd
+/gsDI {
+begin
+/OP here { /_OP? xdd } if
+/op here { /_op? xdd }
+{ /OP here { /_op? xdd } if }
+ifelse
+/OPM here { /_opmode xdd } if
+/Font here { aload pop Tf } if
+/LW here { w } if
+/LC here { J } if
+/LJ here { j } if
+/ML here { M } if
+/D here { aload pop d } if
+end
+} bd
+/ilp { /_lp /none dd } bd
+/icl { /_doClip 0 dd } bd
+/W { /_doClip 1 dd } bd
+/W* { /_doClip 2 dd } bd
+/n {
+{{} {clip} {eoclip}} _doClip get exec
+icl
+newpath
+} bd
+/s { h S } bd
+/B { q f Q S } bd
+/B* { q f* Q S } bd
+/b { h B } bd
+/b* { h B* } bd
+/q/save ld
+/Q { restore ilp } bd
+/GetCSFamily {
+dup type /arraytype eq {0 get} if
+} bd
+/GetCompsDict
+11 dict begin
+/DeviceGray { pop 1 } bd
+/DeviceRGB { pop 3 } bd
+/DeviceCMYK { pop 4 } bd
+/CIEBasedA { pop 1 } bd
+/CIEBasedABC { pop 3 } bd
+/CIEBasedDEF { pop 3 } bd
+/CIEBasedDEFG { pop 4 } bd
+/DeviceN { 1 get length } bd
+/Separation { pop 1 } bd
+/Indexed { pop 1 } bd
+/Pattern { pop 0 } bd
+currentdict
+end
+def
+/GetComps {
+GetCompsDict
+1 index GetCSFamily
+get exec
+} bd
+/cs
+{
+dup _fcs eq
+{ pop }
+{ dup /_fcs xdd
+GetComps
+_fillColors exch get
+/_fc xdd
+/_fp null dd
+} ifelse
+} bd
+/CS
+{
+dup _scs eq
+{ pop }
+{ dup /_scs xdd GetComps _strokeColors exch get /_sc xdd /_sp null dd }
+ifelse
+} bd
+/sc {
+_fc astore pop
+ilp
+} bd
+/SC {
+_sc astore pop
+ilp
+} bd
+/g { DefaultGray cs sc } bd
+/rg { DefaultRGB cs sc } bd
+/k { DefaultCMYK cs sc } bd
+/G { DefaultGray CS SC } bd
+/RG { DefaultRGB CS SC } bd
+/K { DefaultCMYK CS SC } bd
+/cm { _mtx astore concat } bd
+/re {
+4 2 roll m
+1 index 0 rlineto
+0 exch rlineto
+neg 0 rlineto
+h
+} bd
+/RC/rectclip ld
+/EF/execform ld
+/PS { cvx exec } bd
+/initgs {
+/DefaultGray [/DeviceGray] dd
+/DefaultRGB [/DeviceRGB] dd
+/DefaultCMYK [/DeviceCMYK] dd
+0 g 0 G
+[] 0 d
+0 j
+0 J
+10 M
+1 w
+true setSA
+/_op? false dd
+/_OP? false dd
+/_opmode 0 dd
+/_defaulttransfer load settransfer
+0 i
+/RelativeColorimetric ri
+newpath
+} bd
+/int {
+dup 2 index sub 3 index 5 index sub div 6 -2 roll sub mul
+exch pop add exch pop
+} bd
+/limit {
+dup 2 index le { exch } if pop
+dup 2 index ge { exch } if pop
+} bd
+/domainClip {
+Domain aload pop 3 2 roll
+limit
+} [/Domain] bld
+/applyInterpFunc {
+0 1 DimOut 1 sub
+{
+dup C0 exch get exch
+dup C1 exch get exch
+3 1 roll
+1 index sub
+3 index
+N exp mul add
+exch
+currentdict /Range_lo known
+{
+dup Range_lo exch get exch
+Range_hi exch get
+3 2 roll limit
+}
+{
+pop
+}
+ifelse
+exch
+} for
+pop
+} [/DimOut /C0 /C1 /N /Range_lo /Range_hi] bld
+/encodeInput {
+NumParts 1 sub
+0 1 2 index
+{
+dup Bounds exch get
+2 index gt
+{ exit }
+{ dup
+3 index eq
+{ exit }
+{ pop } ifelse
+} ifelse
+} for
+3 2 roll pop
+dup Bounds exch get exch
+dup 1 add Bounds exch get exch
+2 mul
+dup Encode exch get exch
+1 add Encode exch get
+int
+} [/NumParts /Bounds /Encode] bld
+/rangeClip {
+exch dup Range_lo exch get
+exch Range_hi exch get
+3 2 roll
+limit
+} [/Range_lo /Range_hi] bld
+/applyStitchFunc {
+Functions exch get exec
+currentdict /Range_lo known {
+0 1 DimOut 1 sub {
+DimOut 1 add -1 roll
+rangeClip
+} for
+} if
+} [/Functions /Range_lo /DimOut] bld
+%%EndResource
+%%BeginResource: procset pdflev2
+%%Version: 4.0 5
+%%Copyright: Copyright 1987-1999 Adobe Systems Incorporated. All Rights Reserved.
+%%LanguageLevel: 2
+%%Title: PDF operators, with code specific for Level 2
+/_defaulthalftone currenthalftone dd
+/_defaultblackgeneration currentblackgeneration dd
+/_defaultundercolorremoval currentundercolorremoval dd
+/_defaultcolortransfer [currentcolortransfer] dd
+/initialize {
+_defaulthalftone sethalftone
+/_defaultblackgeneration load setblackgeneration
+/_defaultundercolorremoval load setundercolorremoval
+_defaultcolortransfer aload pop setcolortransfer
+false setoverprint
+<</MaxFormItem 0>> setuserparams
+} bd
+/terminate { } bd
+/m/moveto ld
+/l/lineto ld
+/c/curveto ld
+/setSA/setstrokeadjust ld
+/defineRes/defineresource ld
+/findRes/findresource ld
+currentglobal
+true systemdict /setglobal get exec
+[/Function /ExtGState /Form /Shading /FunctionDictionary /MadePattern /PatternPrototype /DataSource]
+{ /Generic /Category findresource dup length dict copy /Category defineresource pop }
+forall
+systemdict /setglobal get exec
+/ri
+{
+/findcolorrendering isdefined?
+{
+mark exch
+findcolorrendering
+counttomark 2 eq
+{ type /booleantype eq
+{ dup type /nametype eq
+{ dup /ColorRendering resourcestatus
+{ pop pop
+dup /DefaultColorRendering ne
+{
+/ColorRendering findresource
+setcolorrendering
+} if
+} if
+} if
+} if
+} if
+cleartomark
+}
+{ pop
+} ifelse
+} bd
+/_sfcs {_fcs setcolorspace} bind dd
+/_sscs {_scs setcolorspace} bind dd
+/_sfc
+{
+_fc aload pop
+_fp null eq
+{ setcolor }
+{ _fp setpattern }
+ifelse
+} bind dd
+/_ssc
+{
+_sc aload pop
+_sp null eq { setcolor} { _sp setpattern } ifelse
+} bind dd
+/scn {
+dup type /dicttype eq
+{ dup /_fp xdd
+/PaintType get 1 eq
+{ /_fc _fillColors 0 get dd ilp }
+{ /_fc _fillColors
+_fcs 1 get
+GetComps get dd
+sc
+}
+ifelse
+}
+{ sc }
+ifelse
+} bd
+/SCN {
+dup type /dicttype eq
+{ dup /_sp xdd
+/PaintType get 1 eq
+{ /_sc _strokeColors 0 get dd ilp }
+{ /_sc _strokeColors _scs 1 get GetComps get dd
+SC
+}
+ifelse
+}
+{ SC }
+ifelse
+} bd
+/gs
+{
+begin
+/SA here { setstrokeadjust } if
+/BG here { setblackgeneration } if
+/UCR here { setundercolorremoval } if
+/FL here { i } if
+/RI here { ri } if
+/TR here
+{
+dup xcheck
+{ settransfer }
+{ aload pop setcolortransfer }
+ifelse
+} if
+/sethalftonephase isdefined? { /HTP here { sethalftonephase } if } if
+/HT here { sethalftone } if
+currentdict gsDI
+end
+} bd
+/sfc {
+_op? setoverprint
+_lp /fill ne {
+_sfcs
+_sfc
+/_lp /fill dd
+} if
+} dd
+/ssc {
+_OP? setoverprint
+_lp /stroke ne {
+_sscs
+_ssc
+/_lp /stroke dd
+} if
+} dd
+/f {
+{ { sfc fill }
+{gsave sfc fill grestore clip newpath icl ilp}
+{gsave sfc fill grestore eoclip newpath icl ilp}
+} _doClip get exec
+} bd
+/f* {
+{ { sfc eofill }
+{gsave sfc eofill grestore clip newpath icl ilp}
+{gsave sfc eofill grestore eoclip newpath icl ilp}
+} _doClip get exec
+} bd
+/S {
+{ { ssc stroke }
+{gsave ssc stroke grestore clip newpath icl ilp}
+{gsave ssc stroke grestore eoclip newpath icl ilp}
+} _doClip get exec
+} bd
+/rf {
+{ { sfc rectfill }
+{gsave sfc rectfill grestore clip newpath icl ilp}
+{gsave sfc rectfill grestore eoclip newpath icl ilp}
+} _doClip get exec
+} bd
+/knownColorants? {
+pop false
+} bd
+/makePat {
+gsave
+dup /Matrix get concat
+matrix makepattern
+grestore
+/MadePattern defineRes pop
+} bd
+%%EndResource
+%%BeginResource: procset spots
+%%Version: 4.0 1
+%%Copyright: Copyright 1987-1999 Adobe Systems Incorporated. All Rights Reserved.
+%%Title: Predefined (named) spot functions for PDF
+21 dict dup begin
+/CosineDot
+{ 180 mul cos exch 180 mul cos add 2 div } bd
+/Cross
+{ abs exch abs 2 copy gt { exch } if pop neg } bd
+/Diamond
+{ abs exch abs 2 copy add .75 le
+{ dup mul exch dup mul add 1 exch sub }
+{ 2 copy add 1.23 le
+{ .85 mul add 1 exch sub }
+{ 1 sub dup mul exch 1 sub dup mul add 1 sub }
+ifelse }
+ifelse } bd
+/Double
+{ exch 2 div exch 2 { 360 mul sin 2 div exch } repeat add } bd
+/DoubleDot
+{ 2 { 360 mul sin 2 div exch } repeat add } bd
+/Ellipse
+{ abs exch abs 2 copy 3 mul exch 4 mul add 3 sub dup 0 lt
+{ pop dup mul exch .75 div dup mul add 4 div
+1 exch sub }
+{ dup 1 gt
+{pop 1 exch sub dup mul exch 1 exch sub
+.75 div dup mul add 4 div 1 sub }
+{ .5 exch sub exch pop exch pop }
+ifelse }
+ifelse } bd
+/EllipseA
+{ dup mul .9 mul exch dup mul add 1 exch sub } bd
+/EllipseB
+{ dup 5 mul 8 div mul exch dup mul exch add sqrt 1 exch sub } bd
+/EllipseC
+{ dup mul exch dup mul .9 mul add 1 exch sub } bd
+/InvertedDouble
+{ exch 2 div exch 2 { 360 mul sin 2 div exch } repeat add neg } bd
+/InvertedDoubleDot
+{ 2 { 360 mul sin 2 div exch } repeat add neg } bd
+/InvertedEllipseA
+{ dup mul .9 mul exch dup mul add 1 sub } bd
+/InvertedEllipseC
+{ dup mul exch dup mul .9 mul add 1 sub } bd
+/InvertedSimpleDot
+{ dup mul exch dup mul add 1 sub } bd
+/Line
+{ exch pop abs neg } bd
+/LineX
+{ pop } bd
+/LineY
+{ exch pop } bd
+/Rhomboid
+{ abs exch abs 0.9 mul add 2 div } bd
+/Round
+{ abs exch abs 2 copy add 1 le
+{ dup mul exch dup mul add 1 exch sub }
+{ 1 sub dup mul exch 1 sub dup mul add 1 sub }
+ifelse } bd
+/SimpleDot
+{ dup mul exch dup mul add 1 exch sub } bd
+/Square
+{ abs exch abs 2 copy lt { exch } if pop neg } bd
+end
+{ /Function defineRes pop } forall
+%%EndResource
+%%BeginResource: procset pdftext
+%%Version: 4.0 2
+%%Copyright: Copyright 1987-1998 Adobe Systems Incorporated. All Rights Reserved.
+%%Title: Text operators for PDF
+PDF /PDFText 75 dict dup begin put
+/docinitialize
+{
+/resourcestatus where {
+pop
+/CIDParams /ProcSet resourcestatus {
+pop pop
+false /CIDParams /ProcSet findresource /SetBuildCompatible get exec
+} if
+} if
+PDF begin
+PDFText /_pdfDefineIdentity-H known
+{ PDFText /_pdfDefineIdentity-H get exec}
+if
+end
+} bd
+/initialize {
+PDFText begin
+/_intT false dd
+0 Tr
+} bd
+/terminate { end } bd
+/_safeput
+{
+Level2? not
+{
+2 index load dup dup length exch maxlength ge
+{ dup length 5 add dict copy
+3 index xdd
+}
+{ pop }
+ifelse
+}
+if
+3 -1 roll load 3 1 roll put
+}
+bd
+/pdf_has_composefont? systemdict /composefont known def
+/CopyFont {
+{
+1 index /FID ne 2 index /UniqueID ne and
+{ def } { pop pop } ifelse
+} forall
+} bd
+/Type0CopyFont
+{
+exch
+dup length dict
+begin
+CopyFont
+[
+exch
+FDepVector
+{
+dup /FontType get 0 eq
+{
+1 index Type0CopyFont
+/_pdfType0 exch definefont
+}
+{
+/_pdfBaseFont exch
+2 index exec
+}
+ifelse
+exch
+}
+forall
+pop
+]
+/FDepVector exch def
+currentdict
+end
+} bd
+/cHexEncoding
+[/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12
+/c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25
+/c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38
+/c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B
+/c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E
+/c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71
+/c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84
+/c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97
+/c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA
+/cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD
+/cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0
+/cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3
+/cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6
+/cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF] def
+/modEnc {
+/_enc xdd
+/_icode 0 dd
+counttomark 1 sub -1 0
+{
+index
+dup type /nametype eq
+{
+_enc _icode 3 -1 roll put
+_icode 1 add
+}
+if
+/_icode xdd
+} for
+cleartomark
+_enc
+} bd
+/trEnc {
+/_enc xdd
+255 -1 0 {
+exch dup -1 eq
+{ pop /.notdef }
+{ Encoding exch get }
+ifelse
+_enc 3 1 roll put
+} for
+pop
+_enc
+} bd
+/TE {
+/_i xdd
+StandardEncoding 256 array copy modEnc
+_pdfEncodings exch _i exch put
+} bd
+/TZ
+{
+/_usePDFEncoding xdd
+findfont
+dup length 6 add dict
+begin
+{
+1 index /FID ne { def } { pop pop } ifelse
+} forall
+/pdf_origFontName FontName def
+/FontName exch def
+_usePDFEncoding 0 ge
+{
+/Encoding _pdfEncodings _usePDFEncoding get def
+pop
+}
+{
+_usePDFEncoding -1 eq
+{
+counttomark 0 eq
+{ pop }
+{
+Encoding 256 array copy
+modEnc /Encoding exch def
+}
+ifelse
+}
+{
+256 array
+trEnc /Encoding exch def
+}
+ifelse
+}
+ifelse
+pdf_EuroProcSet pdf_origFontName known
+{
+pdf_origFontName pdf_AddEuroGlyphProc
+} if
+FontName currentdict
+end
+definefont pop
+}
+bd
+/Level2?
+systemdict /languagelevel known
+{systemdict /languagelevel get 2 ge}
+{false}
+ifelse
+def
+Level2?
+{
+/_pdfFontStatus
+{
+currentglobal exch
+/Font resourcestatus
+{pop pop true}
+{false}
+ifelse
+exch setglobal
+} bd
+}
+{
+/_pdfFontStatusString 50 string def
+_pdfFontStatusString 0 (fonts/) putinterval
+/_pdfFontStatus
+{
+FontDirectory 1 index known
+{ pop true }
+{
+_pdfFontStatusString 6 42 getinterval
+cvs length 6 add
+_pdfFontStatusString exch 0 exch getinterval
+{ status } stopped
+{pop false}
+{
+{ pop pop pop pop true}
+{ false }
+ifelse
+}
+ifelse
+}
+ifelse
+} bd
+}
+ifelse
+Level2?
+{
+/_pdfCIDFontStatus
+{
+/CIDFont /Category resourcestatus
+{
+pop pop
+/CIDFont resourcestatus
+{pop pop true}
+{false}
+ifelse
+}
+{ pop false }
+ifelse
+} bd
+}
+if
+/_pdfString100 100 string def
+/_pdfComposeFontName
+{
+dup length 1 eq
+{
+0 get
+1 index
+type /nametype eq
+{
+_pdfString100 cvs
+length dup dup _pdfString100 exch (-) putinterval
+_pdfString100 exch 1 add dup _pdfString100 length exch sub getinterval
+2 index exch cvs length
+add 1 add _pdfString100 exch 0 exch getinterval
+exch pop
+true
+}
+{
+pop pop
+false
+}
+ifelse
+}
+{
+false
+}
+ifelse
+dup {exch cvn exch} if
+} bd
+/_pdfConcatNames
+{
+exch
+_pdfString100 cvs
+length dup dup _pdfString100 exch (-) putinterval
+_pdfString100 exch 1 add dup _pdfString100 length exch sub getinterval
+3 -1 roll exch cvs length
+add 1 add _pdfString100 exch 0 exch getinterval
+cvn
+} bind def
+/_pdfTextTempString 50 string def
+/_pdfRegOrderingArray [(Adobe-Japan1) (Adobe-CNS1) (Adobe-Korea1) (Adobe-GB1)] def
+/_pdf_CheckSupplements
+{
+1 index _pdfTextTempString cvs
+false
+_pdfRegOrderingArray
+{
+2 index exch
+anchorsearch
+{ pop pop pop true exit}
+{ pop }
+ifelse
+}
+forall
+exch pop
+{
+/CIDFont findresource
+/CIDSystemInfo get /Supplement get
+exch /CMap findresource
+/CIDSystemInfo get
+dup type /dicttype eq
+{/Supplement get}
+{pop 0 }
+ifelse
+ge
+}
+{ pop pop true }
+ifelse
+} bind def
+pdf_has_composefont?
+{
+/_pdfComposeFont
+{
+2 copy _pdfComposeFontName not
+{
+2 index
+}
+if
+(pdf) exch _pdfConcatNames
+dup _pdfFontStatus
+{ dup findfont 5 2 roll pop pop pop true}
+{
+4 1 roll
+1 index /CMap resourcestatus
+{
+pop pop
+true
+}
+{false}
+ifelse
+1 index true exch
+{
+_pdfCIDFontStatus not
+{pop false exit}
+if
+}
+forall
+and
+{
+1 index 1 index 0 get _pdf_CheckSupplements
+{
+3 -1 roll pop
+2 index 3 1 roll
+composefont true
+}
+{
+pop pop exch pop false
+}
+ifelse
+}
+{
+_pdfComposeFontName
+{
+dup _pdfFontStatus
+{
+exch pop
+1 index exch
+findfont definefont true
+}
+{
+pop exch pop
+false
+}
+ifelse
+}
+{
+exch pop
+false
+}
+ifelse
+}
+ifelse
+{ true }
+{
+dup _pdfFontStatus
+{ dup findfont true }
+{ pop false }
+ifelse
+}
+ifelse
+}
+ifelse
+} bd
+}
+{
+/_pdfComposeFont
+{
+_pdfComposeFontName not
+{
+dup
+}
+if
+dup
+_pdfFontStatus
+{exch pop dup findfont true}
+{
+1 index
+dup type /nametype eq
+{pop}
+{cvn}
+ifelse
+eq
+{pop false}
+{
+dup _pdfFontStatus
+{dup findfont true}
+{pop false}
+ifelse
+}
+ifelse
+}
+ifelse
+} bd
+}
+ifelse
+/_pdfStyleDicts 4 dict dup begin
+/Adobe-Japan1 4 dict dup begin
+Level2?
+{
+/Serif
+/HeiseiMin-W3-83pv-RKSJ-H _pdfFontStatus
+{/HeiseiMin-W3}
+{
+/HeiseiMin-W3 _pdfCIDFontStatus
+{/HeiseiMin-W3}
+{/Ryumin-Light}
+ifelse
+}
+ifelse
+def
+/SansSerif
+/HeiseiKakuGo-W5-83pv-RKSJ-H _pdfFontStatus
+{/HeiseiKakuGo-W5}
+{
+/HeiseiKakuGo-W5 _pdfCIDFontStatus
+{/HeiseiKakuGo-W5}
+{/GothicBBB-Medium}
+ifelse
+}
+ifelse
+def
+/HeiseiMaruGo-W4-83pv-RKSJ-H _pdfFontStatus
+{/HeiseiMaruGo-W4}
+{
+/HeiseiMaruGo-W4 _pdfCIDFontStatus
+{/HeiseiMaruGo-W4}
+{
+/Jun101-Light-RKSJ-H _pdfFontStatus
+{ /Jun101-Light }
+{ SansSerif }
+ifelse
+}
+ifelse
+}
+ifelse
+/RoundSansSerif exch def
+/Default Serif def
+}
+{
+/Serif /Ryumin-Light def
+/SansSerif /GothicBBB-Medium def
+{
+(fonts/Jun101-Light-83pv-RKSJ-H) status
+}stopped
+{pop}{
+{ pop pop pop pop /Jun101-Light }
+{ SansSerif }
+ifelse
+/RoundSansSerif exch def
+}ifelse
+/Default Serif def
+}
+ifelse
+end
+def
+/Adobe-Korea1 4 dict dup begin
+/Serif /HYSMyeongJo-Medium def
+/SansSerif /HYGoThic-Medium def
+/RoundSansSerif SansSerif def
+/Default Serif def
+end
+def
+/Adobe-GB1 4 dict dup begin
+/Serif /STSong-Light def
+/SansSerif /STHeiti-Regular def
+/RoundSansSerif SansSerif def
+/Default Serif def
+end
+def
+/Adobe-CNS1 4 dict dup begin
+/Serif /MKai-Medium def
+/SansSerif /MHei-Medium def
+/RoundSansSerif SansSerif def
+/Default Serif def
+end
+def
+end
+def
+/TZzero
+{
+/_fyAdj xdd
+/_wmode xdd
+/_styleArr xdd
+/_regOrdering xdd
+3 copy
+_pdfComposeFont
+{
+5 2 roll pop pop pop
+}
+{
+[
+0 1 _styleArr length 1 sub
+{
+_styleArr exch get
+_pdfStyleDicts _regOrdering 2 copy known
+{
+get
+exch 2 copy known not
+{ pop /Default }
+if
+get
+}
+{
+pop pop pop /Unknown
+}
+ifelse
+}
+for
+]
+exch pop
+2 index 3 1 roll
+_pdfComposeFont
+{3 -1 roll pop}
+{
+findfont dup /FontName get exch
+}
+ifelse
+}
+ifelse
+dup /WMode 2 copy known
+{ get _wmode ne }
+{ pop pop _wmode 1 eq}
+ifelse
+_fyAdj 0 ne or
+{
+exch _wmode _pdfConcatNames _fyAdj _pdfConcatNames
+dup _pdfFontStatus
+{ exch pop dup findfont false}
+{ exch true }
+ifelse
+}
+{
+dup /FontType get 0 ne
+}
+ifelse
+{
+dup /FontType get 3 eq _wmode 1 eq and
+{
+_pdfVerticalRomanT3Font dup length 10 add dict copy
+begin
+/_basefont exch
+dup length 3 add dict
+begin
+{1 index /FID ne {def}{pop pop} ifelse }
+forall
+/Encoding Encoding dup length array copy
+dup 16#27 /quotesingle put
+dup 16#60 /grave put
+_regOrdering /Adobe-Japan1 eq
+{dup 16#5c /yen put dup 16#a5 /yen put dup 16#b4 /yen put}
+if
+def
+FontName
+currentdict
+end
+definefont
+def
+/Encoding _basefont /Encoding get def
+/_fauxfont true def
+}
+{
+dup length 3 add dict
+begin
+{1 index /FID ne {def}{pop pop} ifelse }
+forall
+FontType 0 ne
+{
+/Encoding Encoding dup length array copy
+dup 16#27 /quotesingle put
+dup 16#60 /grave put
+_regOrdering /Adobe-Japan1 eq
+{dup 16#5c /yen put}
+if
+def
+/_fauxfont true def
+} if
+} ifelse
+/WMode _wmode def
+/BaseLineAdj _fyAdj def
+dup dup /FontName exch def
+currentdict
+end
+definefont pop
+}
+{
+pop
+}
+ifelse
+/_pdf_FontDirectory 3 1 roll _safeput
+}
+bd
+/swj {
+dup 4 1 roll
+dup length exch stringwidth
+exch 5 -1 roll 3 index mul add
+4 1 roll 3 1 roll mul add
+6 2 roll /_cnt 0 dd
+{1 index eq {/_cnt _cnt 1 add dd} if} forall pop
+exch _cnt mul exch _cnt mul 2 index add 4 1 roll 2 index add 4 1 roll pop pop
+} bd
+/jss {
+4 1 roll
+{
+pop pop
+(0) exch 2 copy 0 exch put
+gsave
+exch false charpath currentpoint
+5 index setmatrix stroke
+3 -1 roll
+32 eq
+{
+moveto
+5 index 5 index rmoveto currentpoint
+}
+if
+grestore
+moveto
+2 copy rmoveto
+} exch cshow
+6 {pop} repeat
+} def
+/jsfTzero {
+{
+pop pop
+(0) exch 2 copy 0 exch put
+exch show
+32 eq
+{
+4 index 4 index rmoveto
+}
+if
+2 copy rmoveto
+} exch cshow
+5 {pop} repeat
+} def
+/jsp
+{
+{
+pop pop
+(0) exch 2 copy 0 exch put
+32 eq
+dup {currentfont /Encoding get dup length 33 ge 
+{32 get /space eq and}{pop}ifelse
+}if
+{ exch 5 index 5 index 5 index 5 -1 roll widthshow }
+{ false charpath }
+ifelse
+2 copy rmoveto
+} exch cshow
+5 {pop} repeat
+} bd
+/trj { _cx 0 fWModeProc 32 _ax 0 fWModeProc 6 5 roll } bd
+/pjsf { trj sfc fawidthshowProc } bd
+/pjss { trj _ctm ssc jss } bd
+/pjsc { trj jsp } bd
+/_Tjdef [
+/pjsf load
+/pjss load
+{
+dup
+currentpoint 3 2 roll
+pjsf
+newpath moveto
+pjss
+} bind
+{
+trj swj rmoveto
+} bind
+{
+dup currentpoint 4 2 roll gsave
+pjsf
+grestore 3 1 roll moveto
+pjsc
+} bind
+{
+dup currentpoint 4 2 roll
+currentpoint gsave newpath moveto
+pjss
+grestore 3 1 roll moveto
+pjsc
+} bind
+{
+dup currentpoint 4 2 roll gsave
+dup currentpoint 3 2 roll
+pjsf
+newpath moveto
+pjss
+grestore 3 1 roll moveto
+pjsc
+} bind
+/pjsc load
+] def
+/BT
+{
+/_inT true dd
+_ctm currentmatrix pop matrix _tm copy pop
+0 _rise _baselineadj add translate _hs 1 scale
+0 0 moveto
+} bd
+/ET
+{
+/_inT false dd
+_tr 3 gt {clip} if
+_ctm setmatrix newpath
+} bd
+/Tr {
+_inT { _tr 3 le {currentpoint newpath moveto} if } if
+dup /_tr xdd
+_Tjdef exch get /_Tj xdd
+} bd
+/Tj {
+userdict /$$copystring 2 index put
+_Tj
+} bd
+/iTm { _ctm setmatrix _tm concat 0 _rise _baselineadj add translate _hs 1 scale } bd
+/Tm { _tm astore pop iTm 0 0 moveto } bd
+/Td { _mtx translate _tm _tm concatmatrix pop iTm 0 0 moveto } bd
+/TD { dup /_ld xdd Td } bd
+/_nullProc {} bd
+/Tf {
+dup 1000 div /_fScl xdd
+_pdf_FontDirectory 2 index 2 copy known
+{get exch 3 -1 roll pop}
+{pop pop}
+ifelse
+Level2?
+{ selectfont }
+{ exch findfont exch scalefont setfont}
+ifelse
+currentfont dup
+/_nullProc exch
+/WMode known
+{
+1 index /WMode get 1 eq
+{pop /exch}
+if
+}
+if
+load /fWModeProc xdd
+dup
+/FontType get 0 eq dup _cx 0 ne and
+{ /jsfTzero }
+{ /awidthshow }
+ifelse
+load /fawidthshowProc xdd
+/_fTzero xdd
+dup /BaseLineAdj known
+{ dup /BaseLineAdj get _fScl mul }
+{ 0 }
+ifelse
+/_baselineadj xdd
+dup /_pdfT3Font known
+{ 0 }
+{_tr}
+ifelse
+_Tjdef exch get /_Tj xdd
+_intT
+{currentpoint iTm moveto}
+if
+pop
+} bd
+/TL { neg /_ld xdd } bd
+/Tw {
+/_cx xdd
+_cx 0 ne _fTzero and
+{ /jsfTzero }
+{ /awidthshow }
+ifelse
+load /fawidthshowProc xdd
+} bd
+/Tc { /_ax xdd } bd
+/Ts { /_rise xdd currentpoint iTm moveto } bd
+/Tz { 100 div /_hs xdd iTm } bd
+/Tk { exch pop _fScl mul neg 0 fWModeProc rmoveto } bd
+/T* { 0 _ld Td } bd
+/' { T* Tj } bd
+/" { exch Tc exch Tw ' } bd
+/TJ {
+{
+dup type /stringtype eq
+{ Tj }
+{ 0 exch Tk }
+ifelse
+} forall
+} bd
+/T- { _hy Tj } bd
+/d0/setcharwidth ld
+/d1 { setcachedevice /sfc{}dd /ssc{}dd } bd
+/nND {{/.notdef} repeat} bd
+/T3Defs {
+/BuildChar
+{
+1 index /Encoding get exch get
+1 index /BuildGlyph get exec
+}
+def
+/BuildGlyph {
+exch begin
+GlyphProcs exch get exec
+end
+} def
+/_pdfT3Font true def
+} bd
+/_pdfBoldRomanWidthProc
+{
+stringwidth 1 index 0 ne { exch .03 add exch }if setcharwidth
+0 0
+} bd
+/_pdfType0WidthProc
+{
+dup stringwidth 0 0 moveto
+2 index true charpath pathbbox
+0 -1
+7 index 2 div .88
+setcachedevice2
+pop
+0 0
+} bd
+/_pdfType0WMode1WidthProc
+{
+dup stringwidth
+pop 2 div neg -0.88
+2 copy
+moveto
+0 -1
+5 -1 roll true charpath pathbbox
+setcachedevice
+} bd
+/_pdfBoldBaseFont
+11 dict begin
+/FontType 3 def
+/FontMatrix[1 0 0 1 0 0]def
+/FontBBox[0 0 1 1]def
+/Encoding cHexEncoding def
+/_setwidthProc /_pdfBoldRomanWidthProc load def
+/_bcstr1 1 string def
+/BuildChar
+{
+exch begin
+_basefont setfont
+_bcstr1 dup 0 4 -1 roll put
+dup
+_setwidthProc
+3 copy
+moveto
+show
+_basefonto setfont
+moveto
+show
+end
+}bd
+currentdict
+end
+def
+pdf_has_composefont?
+{
+/_pdfBoldBaseCIDFont
+11 dict begin
+/CIDFontType 1 def
+/CIDFontName /_pdfBoldBaseCIDFont def
+/FontMatrix[1 0 0 1 0 0]def
+/FontBBox[0 0 1 1]def
+/_setwidthProc /_pdfType0WidthProc load def
+/_bcstr2 2 string def
+/BuildGlyph
+{
+exch begin
+_basefont setfont
+_bcstr2 1 2 index 256 mod put
+_bcstr2 0 3 -1 roll 256 idiv put
+_bcstr2 dup _setwidthProc
+3 copy
+moveto
+show
+_basefonto setfont
+moveto
+show
+end
+}bd
+currentdict
+end
+def
+/_pdfDefineIdentity-H
+{
+/Identity-H /CMap resourcestatus
+{
+pop pop
+}
+{
+/CIDInit/ProcSet findresource begin 12 dict begin
+begincmap
+/CIDSystemInfo
+3 dict begin
+/Registry (Adobe) def
+/Ordering (Identity) def
+/Supplement 0 def
+currentdict
+end
+def
+/CMapName /Identity-H def
+/CMapVersion 1 def
+/CMapType 1 def
+1 begincodespacerange
+<0000> <ffff>
+endcodespacerange
+1 begincidrange
+<0000> <ffff> 0
+endcidrange
+endcmap
+CMapName currentdict/CMap defineresource pop
+end
+end
+} ifelse
+} def
+} if
+/_pdfVerticalRomanT3Font
+10 dict begin
+/FontType 3 def
+/FontMatrix[1 0 0 1 0 0]def
+/FontBBox[0 0 1 1]def
+/_bcstr1 1 string def
+/BuildChar
+{
+exch begin
+_basefont setfont
+_bcstr1 dup 0 4 -1 roll put
+dup
+_pdfType0WidthProc
+moveto
+show
+end
+}bd
+currentdict
+end
+def
+/MakeBoldFont
+{
+dup /ct_SyntheticBold known
+{
+dup length 3 add dict begin
+CopyFont
+/ct_StrokeWidth .03 0 FontMatrix idtransform pop def
+/ct_SyntheticBold true def
+currentdict
+end
+definefont
+}
+{
+dup dup length 3 add dict
+begin
+CopyFont
+/PaintType 2 def
+/StrokeWidth .03 0 FontMatrix idtransform pop def
+/dummybold currentdict
+end
+definefont
+dup /FontType get dup 9 ge exch 11 le and
+{
+_pdfBoldBaseCIDFont
+dup length 3 add dict copy begin
+dup /CIDSystemInfo get /CIDSystemInfo exch def
+/_Type0Identity /Identity-H 3 -1 roll [ exch ] composefont
+/_basefont exch def
+/_Type0Identity /Identity-H 3 -1 roll [ exch ] composefont
+/_basefonto exch def
+currentdict
+end
+/CIDFont defineresource
+}
+{
+_pdfBoldBaseFont
+dup length 3 add dict copy begin
+/_basefont exch def
+/_basefonto exch def
+currentdict
+end
+definefont
+}
+ifelse
+}
+ifelse
+} bd
+/MakeBold {
+1 index
+_pdf_FontDirectory 2 index 2 copy known
+{get}
+{exch pop}
+ifelse
+findfont
+dup
+/FontType get 0 eq
+{
+dup /WMode known {dup /WMode get 1 eq }{false} ifelse
+version length 4 ge
+and
+{version 0 4 getinterval cvi 2015 ge }
+{true}
+ifelse
+{/_pdfType0WidthProc}
+{/_pdfType0WMode1WidthProc}
+ifelse
+_pdfBoldBaseFont /_setwidthProc 3 -1 roll load put
+{MakeBoldFont} Type0CopyFont definefont
+}
+{
+dup /_fauxfont known not 1 index /SubstMaster known not and
+{
+_pdfBoldBaseFont /_setwidthProc /_pdfBoldRomanWidthProc load put
+MakeBoldFont
+}
+{
+2 index 2 index eq
+{ exch pop }
+{
+dup length dict begin
+CopyFont
+currentdict
+end
+definefont
+}
+ifelse
+}
+ifelse
+}
+ifelse
+pop pop
+dup /dummybold ne
+{/_pdf_FontDirectory exch dup _safeput }
+{ pop }
+ifelse
+}bd
+/MakeItalic {
+_pdf_FontDirectory exch 2 copy known
+{get}
+{exch pop}
+ifelse
+dup findfont
+dup /FontInfo 2 copy known
+{
+get
+/ItalicAngle 2 copy known
+{get 0 eq }
+{ pop pop true}
+ifelse
+}
+{ pop pop true}
+ifelse
+{
+exch pop
+dup /FontType get 0 eq Level2? not and
+{ dup /FMapType get 6 eq }
+{ false }
+ifelse
+{
+dup /WMode 2 copy known
+{
+get 1 eq
+{ _italMtx_WMode1Type0 }
+{ _italMtxType0 }
+ifelse
+}
+{ pop pop _italMtxType0 }
+ifelse
+}
+{
+dup /WMode 2 copy known
+{
+get 1 eq
+{ _italMtx_WMode1 }
+{ _italMtx }
+ifelse
+}
+{ pop pop _italMtx }
+ifelse
+}
+ifelse
+makefont
+dup /FontType get 42 eq Level2? not or
+{
+dup length dict begin
+CopyFont
+currentdict
+end
+}
+if
+1 index exch
+definefont pop
+/_pdf_FontDirectory exch dup _safeput
+}
+{
+pop
+2 copy ne
+{
+/_pdf_FontDirectory 3 1 roll _safeput
+}
+{ pop pop }
+ifelse
+}
+ifelse
+}bd
+/MakeBoldItalic {
+/dummybold exch
+MakeBold
+/dummybold
+MakeItalic
+}bd
+Level2?
+{
+/pdf_CopyDict
+{1 index length add dict copy}
+def
+}
+{
+/pdf_CopyDict
+{
+1 index length add dict
+1 index wcheck
+{ copy }
+{ begin
+{def} forall
+currentdict
+end
+}
+ifelse
+}
+def
+}
+ifelse
+/pdf_AddEuroGlyphProc
+{
+currentdict /CharStrings known
+{
+CharStrings /Euro known not
+{
+dup
+/CharStrings
+CharStrings 1 pdf_CopyDict
+begin
+/Euro pdf_EuroProcSet 4 -1 roll get def
+currentdict
+end
+def
+/pdf_PSBuildGlyph /pdf_PSBuildGlyph load def
+/pdf_PathOps /pdf_PathOps load def
+/Symbol eq
+{
+/Encoding Encoding dup length array copy
+dup 160 /Euro put def
+}
+if
+}
+{ pop
+}
+ifelse
+}
+{ pop
+}
+ifelse
+}
+def
+/pdf_PathOps 4 dict dup begin
+/m {moveto} def
+/l {lineto} def
+/c {curveto} def
+/cp {closepath} def
+end
+def
+/pdf_PSBuildGlyph
+{
+gsave
+8 -1 roll pop
+7 1 roll
+currentdict /PaintType 2 copy known {get 2 eq}{pop pop false} ifelse
+dup 9 1 roll
+{
+currentdict /StrokeWidth 2 copy known
+{
+get 2 div
+5 1 roll
+4 -1 roll 4 index sub
+4 1 roll
+3 -1 roll 4 index sub
+3 1 roll
+exch 4 index add exch
+4 index add
+5 -1 roll pop
+}
+{
+pop pop
+}
+ifelse
+}
+if
+setcachedevice
+pdf_PathOps begin
+exec
+end
+{
+currentdict /StrokeWidth 2 copy known
+{ get }
+{ pop pop 0 }
+ifelse
+setlinewidth stroke
+}
+{
+fill
+}
+ifelse
+grestore
+} def
+/pdf_EuroProcSet 13 dict def
+pdf_EuroProcSet
+begin
+/Courier-Bold
+{
+600 0 6 -12 585 612
+{
+385 274 m
+180 274 l
+179 283 179 293 179 303 c
+179 310 179 316 180 323 c
+398 323 l
+423 404 l
+197 404 l
+219 477 273 520 357 520 c
+409 520 466 490 487 454 c
+487 389 l
+579 389 l
+579 612 l
+487 612 l
+487 560 l
+449 595 394 612 349 612 c
+222 612 130 529 98 404 c
+31 404 l
+6 323 l
+86 323 l
+86 304 l
+86 294 86 284 87 274 c
+31 274 l
+6 193 l
+99 193 l
+129 77 211 -12 359 -12 c
+398 -12 509 8 585 77 c
+529 145 l
+497 123 436 80 356 80 c
+285 80 227 122 198 193 c
+360 193 l
+cp
+600 0 m
+}
+pdf_PSBuildGlyph
+} def
+/Courier-BoldOblique /Courier-Bold load def
+/Courier
+{
+600 0 17 -12 578 584
+{
+17 204 m
+97 204 l
+126 81 214 -12 361 -12 c
+440 -12 517 17 578 62 c
+554 109 l
+501 70 434 43 366 43 c
+266 43 184 101 154 204 c
+380 204 l
+400 259 l
+144 259 l
+144 270 143 281 143 292 c
+143 299 143 307 144 314 c
+418 314 l
+438 369 l
+153 369 l
+177 464 249 529 345 529 c
+415 529 484 503 522 463 c
+522 391 l
+576 391 l
+576 584 l
+522 584 l
+522 531 l
+473 566 420 584 348 584 c
+216 584 122 490 95 369 c
+37 369 l
+17 314 l
+87 314 l
+87 297 l
+87 284 88 272 89 259 c
+37 259 l
+cp
+600 0 m
+}
+pdf_PSBuildGlyph
+} def
+/Courier-Oblique /Courier load def
+/Helvetica
+{
+556 0 24 -19 541 703
+{
+541 628 m
+510 669 442 703 354 703 c
+201 703 117 607 101 444 c
+50 444 l
+25 372 l
+97 372 l
+97 301 l
+49 301 l
+24 229 l
+103 229 l
+124 67 209 -19 350 -19 c
+435 -19 501 25 509 32 c
+509 131 l
+492 105 417 60 343 60 c
+267 60 204 127 197 229 c
+406 229 l
+430 301 l
+191 301 l
+191 372 l
+455 372 l
+479 444 l
+194 444 l
+201 531 245 624 348 624 c
+433 624 484 583 509 534 c
+cp
+556 0 m
+}
+pdf_PSBuildGlyph
+} def
+/Helvetica-Oblique /Helvetica load def
+/Helvetica-Bold
+{
+556 0 12 -19 563 710
+{
+563 621 m
+537 659 463 710 363 710 c
+216 710 125 620 101 462 c
+51 462 l
+12 367 l
+92 367 l
+92 346 l
+92 337 93 328 93 319 c
+52 319 l
+12 224 l
+102 224 l
+131 58 228 -19 363 -19 c
+417 -19 471 -12 517 18 c
+517 146 l
+481 115 426 93 363 93 c
+283 93 254 166 246 224 c
+398 224 l
+438 319 l
+236 319 l
+236 367 l
+457 367 l
+497 462 l
+244 462 l
+259 552 298 598 363 598 c
+425 598 464 570 486 547 c
+507 526 513 517 517 509 c
+cp
+556 0 m
+}
+pdf_PSBuildGlyph
+} def
+/Helvetica-BoldOblique /Helvetica-Bold load def
+/Symbol
+{
+750 0 20 -12 714 685
+{
+714 581 m
+650 645 560 685 465 685 c
+304 685 165 580 128 432 c
+50 432 l
+20 369 l
+116 369 l
+115 356 115 347 115 337 c
+115 328 115 319 116 306 c
+50 306 l
+20 243 l
+128 243 l
+165 97 300 -12 465 -12 c
+560 -12 635 25 685 65 c
+685 155 l
+633 91 551 51 465 51 c
+340 51 238 131 199 243 c
+555 243 l
+585 306 l
+184 306 l
+183 317 182 326 182 336 c
+182 346 183 356 184 369 c
+614 369 l 644 432 l
+199 432 l
+233 540 340 622 465 622 c
+555 622 636 580 685 520 c
+cp
+750 0 m
+}
+pdf_PSBuildGlyph
+} def
+/Times-Bold
+{
+500 0 16 -14 478 700
+{
+367 308 m
+224 308 l
+224 368 l
+375 368 l
+380 414 l
+225 414 l
+230 589 257 653 315 653 c
+402 653 431 521 444 457 c
+473 457 l
+473 698 l
+444 697 l
+441 679 437 662 418 662 c
+393 662 365 700 310 700 c
+211 700 97 597 73 414 c
+21 414 l
+16 368 l
+69 368 l
+69 359 68 350 68 341 c
+68 330 68 319 69 308 c
+21 308 l
+16 262 l
+73 262 l
+91 119 161 -14 301 -14 c
+380 -14 443 50 478 116 c
+448 136 l
+415 84 382 40 323 40 c
+262 40 231 77 225 262 c
+362 262 l
+cp
+500 0 m
+}
+pdf_PSBuildGlyph
+} def
+/Times-BoldItalic
+{
+500 0 9 -20 542 686
+{
+542 686 m
+518 686 l
+513 673 507 660 495 660 c
+475 660 457 683 384 683 c
+285 683 170 584 122 430 c
+58 430 l
+34 369 l
+105 369 l
+101 354 92 328 90 312 c
+34 312 l
+9 251 l
+86 251 l
+85 238 84 223 84 207 c
+84 112 117 -14 272 -14 c
+326 -14 349 9 381 9 c
+393 9 393 -10 394 -20 c
+420 -20 l
+461 148 l
+429 148 l
+416 109 362 15 292 15 c
+227 15 197 55 197 128 c
+197 162 204 203 216 251 c
+378 251 l
+402 312 l
+227 312 l
+229 325 236 356 241 369 c
+425 369 l
+450 430 l
+255 430 l
+257 435 264 458 274 488 c
+298 561 337 654 394 654 c
+437 654 484 621 484 530 c
+484 516 l
+516 516 l
+cp
+500 0 m
+}
+pdf_PSBuildGlyph
+} def
+/Times-Italic
+{
+500 0 23 -10 595 692
+{
+399 317 m
+196 317 l
+199 340 203 363 209 386 c
+429 386 l
+444 424 l
+219 424 l
+246 514 307 648 418 648 c
+448 648 471 638 492 616 c
+529 576 524 529 527 479 c
+549 475 l
+595 687 l
+570 687 l
+562 674 558 664 542 664 c
+518 664 474 692 423 692 c
+275 692 162 551 116 424 c
+67 424 l
+53 386 l
+104 386 l
+98 363 93 340 90 317 c
+37 317 l
+23 279 l
+86 279 l
+85 266 85 253 85 240 c
+85 118 137 -10 277 -10 c
+370 -10 436 58 488 128 c
+466 149 l
+424 101 375 48 307 48 c
+212 48 190 160 190 234 c
+190 249 191 264 192 279 c
+384 279 l
+cp
+500 0 m
+}
+pdf_PSBuildGlyph
+} def
+/Times-Roman
+{
+500 0 10 -12 484 692
+{
+347 298 m
+171 298 l
+170 310 170 322 170 335 c
+170 362 l
+362 362 l
+374 403 l
+172 403 l
+184 580 244 642 308 642 c
+380 642 434 574 457 457 c
+481 462 l
+474 691 l
+449 691 l
+433 670 429 657 410 657 c
+394 657 360 692 299 692 c
+204 692 94 604 73 403 c
+22 403 l
+10 362 l
+70 362 l
+69 352 69 341 69 330 c
+69 319 69 308 70 298 c
+22 298 l
+10 257 l
+73 257 l
+97 57 216 -12 295 -12 c
+364 -12 427 25 484 123 c
+458 142 l
+425 101 384 37 316 37 c
+256 37 189 84 173 257 c
+335 257 l
+cp
+500 0 m
+}
+pdf_PSBuildGlyph
+} def
+end
+currentdict readonly pop end
+%%EndResource
+PDFText begin
+[39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis
+/Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute
+/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde
+/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex
+/udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
+/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash
+/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef
+/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash
+/questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef
+/guillemotleft/guillemotright/ellipsis/space/Agrave/Atilde/Otilde/OE/oe
+/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide
+/.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright
+/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand
+/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex
+/Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex
+/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla
+/hungarumlaut/ogonek/caron
+0 TE
+[1/dotlessi/caron 39/quotesingle 96/grave 
+127/bullet/Euro/bullet/quotesinglbase/florin/quotedblbase/ellipsis
+/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE
+/bullet/Zcaron/bullet/bullet/quoteleft/quoteright/quotedblleft
+/quotedblright/bullet/endash/emdash/tilde/trademark/scaron
+/guilsinglright/oe/bullet/zcaron/Ydieresis/space/exclamdown/cent/sterling
+/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine
+/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus
+/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla
+/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters
+/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla
+/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis
+/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash
+/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave
+/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute
+/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde
+/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute
+/ucircumflex/udieresis/yacute/thorn/ydieresis
+1 TE
+end
+%%BeginResource: pdfimage.prc
+%%Copyright: Copyright 1987-1993 Adobe Systems Incorporated. All Rights Reserved.
+PDF /PDFImage 38 dict put
+PDF /PDFIVars 20 dict put
+PDF /PDFImage get begin
+/initialize { PDFImage begin } bd
+/terminate { end } bd
+/nulldict 0 dict def
+/gv { PDFIVars exch get } bd
+/pv { PDFIVars 3 1 roll put } bd
+/BI { save /savelevel exch pv mark } bd
+/EI { /savelevel gv restore } bd
+end
+%%EndResource
+%%BeginResource: pdfimg2.prc
+%%Version: 4.0 4
+%%Copyright: Copyright 1987-1993 Adobe Systems Incorporated. All Rights Reserved.
+PDF /PDFImage get begin
+Level2? StartLoad {
+/ID {
+5 counttomark 2 idiv
+dup 3 1 roll add
+dict begin
+{ def } repeat
+cleartomark
+currentdict
+end
+begin
+/ImageType here { pop } { /ImageType 1 def } ifelse
+/ImageMatrix [ Width 0 0 Height neg 0 Height ] def
+/ImageMask here { not } { true } ifelse
+{ /ImageMask false def } if
+ImageMask not { ColorSpace setcolorspace } if
+/Intent here { ri } if
+SLBApplies?
+{ ApplySLB }
+{
+mark
+/DataSource here { } { currentfile } ifelse
+/Filter here {
+dup type /arraytype eq { length } { pop 1 } ifelse
+1 sub 0 1 3 -1 roll {
+/DecodeParms here {
+dup type /arraytype eq {
+1 index get
+} if
+dup null eq { pop } { exch } ifelse
+} if
+Filter dup type /arraytype eq
+{ exch get } { exch pop } ifelse
+filter
+dup
+} for
+} if
+/DataSource exch def
+currentdict /ImageMask here not {false} if
+{ sfc imagemask } { image } ifelse
+counttomark
+{ dup status
+dup currentfile ne and
+{ dup flushfile closefile }
+{ pop }
+ifelse
+}
+repeat
+pop
+}ifelse
+end
+} [/Width /Height /ImageMask /ColorSpace /Filter] bld
+/SLBApplies?
+{
+{
+languagelevel 3 lt {stop} if
+currentsystemparams /SourceListBypass known not {stop} if
+currentsystemparams /SourceListBypass get not {stop} if
+currentdict /Filter known not {stop} if
+Filter /CCITTFaxDecode ne {stop} if
+currentdict /DecodeParms known not {stop} if
+DecodeParms /K known not {stop} if
+DecodeParms /K get -1 ne {stop} if
+} stopped not
+} [/DecodeParms] bld
+/ApplySLB
+{
+{
+/UncompressedLength
+Width
+DecodeParms /EncodedByteAlign getifknown
+{ { 7 add 3 bitshift } if } if
+Height mul def
+/DataSource dup here { } {currentfile} ifelse
+5 dict begin
+/Filter Filter def
+/DecodeParms DecodeParms def
+/Intent 3 def
+/AsyncRead false def
+/CloseSource false def
+currentdict end /ReusableStreamDecode filter def
+currentdict /ImageMask here not {false} if
+{ sfc imagemask } { image } ifelse
+} exec
+} [/Width /DecodeParms /Height] bld
+currentdict readonly pop
+} EndLoad
+end
+%%EndResource
+currentdict readonly pop
+end end
+/currentpacking where {pop setpacking}if
+PDFVars/DocInitAll{[ PDFText]{/docinitialize get exec}forall }put
+PDFVars/InitAll{[PDF PDFText PDFImage]{/initialize get exec}forall initgs}put
+PDFVars/TermAll{[PDFImage PDFText PDF]{/terminate get exec}forall}put
+PDFVars begin PDF begin
+PDFVars/DocInitAll get exec PDFVars/InitAll get exec
+%%IncludeResource Times-Roman
+[ 0 /.notdef/dotaccent/fi/fl/fraction/hungarumlaut
+/Lslash/lslash/ogonek/ring/.notdef/breve
+/minus/.notdef/Zcaron/zcaron/caron/dotlessi
+/dotlessj/ff/ffi/ffl/.notdef 30 /grave
+/quotesingle/space/exclam/quotedbl/numbersign/dollar
+/percent/ampersand/quoteright/parenleft/parenright/asterisk
+/plus/comma/hyphen/period/slash/zero
+/one/two/three/four/five/six
+/seven/eight/nine/colon/semicolon/less
+/equal/greater/question/at/A/B
+/C/D/E/F/G/H
+/I/J/K/L/M/N
+/O/P/Q/R/S/T
+/U/V/W/X/Y/Z
+/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft
+/a/b/c/d/e/f
+/g/h/i/j/k/l
+/m/n/o/p/q/r
+/s/t/u/v/w/x
+/y/z/braceleft/bar/braceright/asciitilde
+/.notdef/.notdef/.notdef/quotesinglbase/florin/quotedblbase
+/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron
+/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash
+/emdash/tilde/trademark/scaron/guilsinglright/oe
+/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent
+/sterling/currency/yen/brokenbar/section/dieresis
+/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered
+/macron/degree/plusminus/twosuperior/threesuperior/acute
+/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine
+/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave
+/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE
+/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave
+/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve
+/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash
+/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn
+/germandbls/agrave/aacute/acircumflex/atilde/adieresis
+/aring/ae/ccedilla/egrave/eacute/ecircumflex
+/edieresis/igrave/iacute/icircumflex/idieresis/eth
+/ntilde/ograve/oacute/ocircumflex/otilde/odieresis
+/divide/oslash/ugrave/uacute/ucircumflex/udieresis
+/yacute/thorn/ydieresis
+/N81/Times-Roman -1 TZ
+%%IncludeResource Times-Bold
+[ 0 /.notdef/dotaccent/fi/fl/fraction/hungarumlaut
+/Lslash/lslash/ogonek/ring/.notdef/breve
+/minus/.notdef/Zcaron/zcaron/caron/dotlessi
+/dotlessj/ff/ffi/ffl/.notdef 30 /grave
+/quotesingle/space/exclam/quotedbl/numbersign/dollar
+/percent/ampersand/quoteright/parenleft/parenright/asterisk
+/plus/comma/hyphen/period/slash/zero
+/one/two/three/four/five/six
+/seven/eight/nine/colon/semicolon/less
+/equal/greater/question/at/A/B
+/C/D/E/F/G/H
+/I/J/K/L/M/N
+/O/P/Q/R/S/T
+/U/V/W/X/Y/Z
+/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft
+/a/b/c/d/e/f
+/g/h/i/j/k/l
+/m/n/o/p/q/r
+/s/t/u/v/w/x
+/y/z/braceleft/bar/braceright/asciitilde
+/.notdef/.notdef/.notdef/quotesinglbase/florin/quotedblbase
+/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron
+/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash
+/emdash/tilde/trademark/scaron/guilsinglright/oe
+/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent
+/sterling/currency/yen/brokenbar/section/dieresis
+/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered
+/macron/degree/plusminus/twosuperior/threesuperior/acute
+/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine
+/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave
+/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE
+/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave
+/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve
+/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash
+/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn
+/germandbls/agrave/aacute/acircumflex/atilde/adieresis
+/aring/ae/ccedilla/egrave/eacute/ecircumflex
+/edieresis/igrave/iacute/icircumflex/idieresis/eth
+/ntilde/ograve/oacute/ocircumflex/otilde/odieresis
+/divide/oslash/ugrave/uacute/ucircumflex/udieresis
+/yacute/thorn/ydieresis
+/N90/Times-Bold -1 TZ
+%%IncludeResource Helvetica-Bold
+[ 0 /.notdef/dotaccent/fi/fl/fraction/hungarumlaut
+/Lslash/lslash/ogonek/ring/.notdef/breve
+/minus/.notdef/Zcaron/zcaron/caron/dotlessi
+/dotlessj/ff/ffi/ffl/.notdef 30 /grave
+/quotesingle/space/exclam/quotedbl/numbersign/dollar
+/percent/ampersand/quoteright/parenleft/parenright/asterisk
+/plus/comma/hyphen/period/slash/zero
+/one/two/three/four/five/six
+/seven/eight/nine/colon/semicolon/less
+/equal/greater/question/at/A/B
+/C/D/E/F/G/H
+/I/J/K/L/M/N
+/O/P/Q/R/S/T
+/U/V/W/X/Y/Z
+/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft
+/a/b/c/d/e/f
+/g/h/i/j/k/l
+/m/n/o/p/q/r
+/s/t/u/v/w/x
+/y/z/braceleft/bar/braceright/asciitilde
+/.notdef/.notdef/.notdef/quotesinglbase/florin/quotedblbase
+/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron
+/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash
+/emdash/tilde/trademark/scaron/guilsinglright/oe
+/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent
+/sterling/currency/yen/brokenbar/section/dieresis
+/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered
+/macron/degree/plusminus/twosuperior/threesuperior/acute
+/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine
+/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave
+/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE
+/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave
+/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve
+/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash
+/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn
+/germandbls/agrave/aacute/acircumflex/atilde/adieresis
+/aring/ae/ccedilla/egrave/eacute/ecircumflex
+/edieresis/igrave/iacute/icircumflex/idieresis/eth
+/ntilde/ograve/oacute/ocircumflex/otilde/odieresis
+/divide/oslash/ugrave/uacute/ucircumflex/udieresis
+/yacute/thorn/ydieresis
+/N87/Helvetica-Bold -1 TZ
+%%IncludeResource Times-Italic
+[ 0 /.notdef/dotaccent/fi/fl/fraction/hungarumlaut
+/Lslash/lslash/ogonek/ring/.notdef/breve
+/minus/.notdef/Zcaron/zcaron/caron/dotlessi
+/dotlessj/ff/ffi/ffl/.notdef 30 /grave
+/quotesingle/space/exclam/quotedbl/numbersign/dollar
+/percent/ampersand/quoteright/parenleft/parenright/asterisk
+/plus/comma/hyphen/period/slash/zero
+/one/two/three/four/five/six
+/seven/eight/nine/colon/semicolon/less
+/equal/greater/question/at/A/B
+/C/D/E/F/G/H
+/I/J/K/L/M/N
+/O/P/Q/R/S/T
+/U/V/W/X/Y/Z
+/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft
+/a/b/c/d/e/f
+/g/h/i/j/k/l
+/m/n/o/p/q/r
+/s/t/u/v/w/x
+/y/z/braceleft/bar/braceright/asciitilde
+/.notdef/.notdef/.notdef/quotesinglbase/florin/quotedblbase
+/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron
+/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash
+/emdash/tilde/trademark/scaron/guilsinglright/oe
+/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent
+/sterling/currency/yen/brokenbar/section/dieresis
+/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered
+/macron/degree/plusminus/twosuperior/threesuperior/acute
+/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine
+/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave
+/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE
+/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave
+/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve
+/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash
+/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn
+/germandbls/agrave/aacute/acircumflex/atilde/adieresis
+/aring/ae/ccedilla/egrave/eacute/ecircumflex
+/edieresis/igrave/iacute/icircumflex/idieresis/eth
+/ntilde/ograve/oacute/ocircumflex/otilde/odieresis
+/divide/oslash/ugrave/uacute/ucircumflex/udieresis
+/yacute/thorn/ydieresis
+/N117/Times-Italic -1 TZ
+%%IncludeResource Courier
+[ 0 /.notdef/dotaccent/fi/fl/fraction/hungarumlaut
+/Lslash/lslash/ogonek/ring/.notdef/breve
+/minus/.notdef/Zcaron/zcaron/caron/dotlessi
+/dotlessj/ff/ffi/ffl/.notdef 30 /grave
+/quotesingle/space/exclam/quotedbl/numbersign/dollar
+/percent/ampersand/quoteright/parenleft/parenright/asterisk
+/plus/comma/hyphen/period/slash/zero
+/one/two/three/four/five/six
+/seven/eight/nine/colon/semicolon/less
+/equal/greater/question/at/A/B
+/C/D/E/F/G/H
+/I/J/K/L/M/N
+/O/P/Q/R/S/T
+/U/V/W/X/Y/Z
+/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft
+/a/b/c/d/e/f
+/g/h/i/j/k/l
+/m/n/o/p/q/r
+/s/t/u/v/w/x
+/y/z/braceleft/bar/braceright/asciitilde
+/.notdef/.notdef/.notdef/quotesinglbase/florin/quotedblbase
+/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron
+/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash
+/emdash/tilde/trademark/scaron/guilsinglright/oe
+/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent
+/sterling/currency/yen/brokenbar/section/dieresis
+/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered
+/macron/degree/plusminus/twosuperior/threesuperior/acute
+/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine
+/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave
+/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE
+/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave
+/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve
+/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash
+/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn
+/germandbls/agrave/aacute/acircumflex/atilde/adieresis
+/aring/ae/ccedilla/egrave/eacute/ecircumflex
+/edieresis/igrave/iacute/icircumflex/idieresis/eth
+/ntilde/ograve/oacute/ocircumflex/otilde/odieresis
+/divide/oslash/ugrave/uacute/ucircumflex/udieresis
+/yacute/thorn/ydieresis
+/N177/Courier -1 TZ
+%%IncludeResource Courier-Bold
+[ 0 /.notdef/dotaccent/fi/fl/fraction/hungarumlaut
+/Lslash/lslash/ogonek/ring/.notdef/breve
+/minus/.notdef/Zcaron/zcaron/caron/dotlessi
+/dotlessj/ff/ffi/ffl/.notdef 30 /grave
+/quotesingle/space/exclam/quotedbl/numbersign/dollar
+/percent/ampersand/quoteright/parenleft/parenright/asterisk
+/plus/comma/hyphen/period/slash/zero
+/one/two/three/four/five/six
+/seven/eight/nine/colon/semicolon/less
+/equal/greater/question/at/A/B
+/C/D/E/F/G/H
+/I/J/K/L/M/N
+/O/P/Q/R/S/T
+/U/V/W/X/Y/Z
+/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft
+/a/b/c/d/e/f
+/g/h/i/j/k/l
+/m/n/o/p/q/r
+/s/t/u/v/w/x
+/y/z/braceleft/bar/braceright/asciitilde
+/.notdef/.notdef/.notdef/quotesinglbase/florin/quotedblbase
+/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron
+/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash
+/emdash/tilde/trademark/scaron/guilsinglright/oe
+/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent
+/sterling/currency/yen/brokenbar/section/dieresis
+/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered
+/macron/degree/plusminus/twosuperior/threesuperior/acute
+/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine
+/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave
+/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE
+/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave
+/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve
+/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash
+/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn
+/germandbls/agrave/aacute/acircumflex/atilde/adieresis
+/aring/ae/ccedilla/egrave/eacute/ecircumflex
+/edieresis/igrave/iacute/icircumflex/idieresis/eth
+/ntilde/ograve/oacute/ocircumflex/otilde/odieresis
+/divide/oslash/ugrave/uacute/ucircumflex/udieresis
+/yacute/thorn/ydieresis
+/N289/Courier-Bold -1 TZ
+%%IncludeResource Courier-Oblique
+[ 0 /.notdef/dotaccent/fi/fl/fraction/hungarumlaut
+/Lslash/lslash/ogonek/ring/.notdef/breve
+/minus/.notdef/Zcaron/zcaron/caron/dotlessi
+/dotlessj/ff/ffi/ffl/.notdef 30 /grave
+/quotesingle/space/exclam/quotedbl/numbersign/dollar
+/percent/ampersand/quoteright/parenleft/parenright/asterisk
+/plus/comma/hyphen/period/slash/zero
+/one/two/three/four/five/six
+/seven/eight/nine/colon/semicolon/less
+/equal/greater/question/at/A/B
+/C/D/E/F/G/H
+/I/J/K/L/M/N
+/O/P/Q/R/S/T
+/U/V/W/X/Y/Z
+/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft
+/a/b/c/d/e/f
+/g/h/i/j/k/l
+/m/n/o/p/q/r
+/s/t/u/v/w/x
+/y/z/braceleft/bar/braceright/asciitilde
+/.notdef/.notdef/.notdef/quotesinglbase/florin/quotedblbase
+/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron
+/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash
+/emdash/tilde/trademark/scaron/guilsinglright/oe
+/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent
+/sterling/currency/yen/brokenbar/section/dieresis
+/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered
+/macron/degree/plusminus/twosuperior/threesuperior/acute
+/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine
+/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave
+/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE
+/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave
+/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve
+/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash
+/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn
+/germandbls/agrave/aacute/acircumflex/atilde/adieresis
+/aring/ae/ccedilla/egrave/eacute/ecircumflex
+/edieresis/igrave/iacute/icircumflex/idieresis/eth
+/ntilde/ograve/oacute/ocircumflex/otilde/odieresis
+/divide/oslash/ugrave/uacute/ucircumflex/udieresis
+/yacute/thorn/ydieresis
+/N191/Courier-Oblique -1 TZ
+PDFVars/TermAll get exec end end
+
+%%EndSetup
+%%Page: 1 1
+%%BeginPageSetup
+userdict /pgsave save put
+PDFVars begin PDF begin PDFVars/InitAll get exec
+1.14301 1.47949 translate
+%%BeginResource: font WOWAIH+URWPalladioL-Bold
+%!PS-AdobeFont-1.0: URWPalladioL-Bold 1.05
+%%CreationDate: Wed Dec 22 1999
+% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development
+% (URW)++,Copyright 1999 by (URW)++ Design & Development
+% See the file PUBLIC (Aladdin Free Public License) for license conditions.
+% As a special exception, permission is granted to include this font
+% program in a Postscript or PDF file that consists of a document that
+% contains text to be displayed or printed using this font, regardless
+% of the conditions or license applying to the document itself.
+12 dict begin
+/FontInfo 10 dict dup begin
+/version (1.05) readonly def
+/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def
+/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def
+/FullName (URW Palladio L Bold) readonly def
+/FamilyName (URW Palladio L) readonly def
+/Weight (Bold) readonly def
+/ItalicAngle 0.0 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/FontName /WOWAIH+URWPalladioL-Bold def
+/PaintType 0 def
+/WMode 0 def
+/FontBBox {-152 -301 1000 935} readonly def
+/FontType 1 def
+/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
+/Encoding StandardEncoding def
+/UniqueID 5021142 def
+currentdict end
+currentfile eexec
+d9d66f633b846a989b9974b0179fc6cc445bc2c03103c68570a7b354a4a280ae
+6fbf7f9888e039ab60fcaf852eb4ce3afeb979d5ea70fde44a2ae5c8c0166c27
+bf9665eea11c7d2329c1a211dd26bb372be5822f5ea70d99eb578c7befd44cdf
+045a363056e5e1cc51525ea6fc061dcebb337208eff729802376a2801424f670
+0e7e6397b28f15bc10b40012b0a3eaeb2693e8f7f627c4c9c7c6c5bff105c1e4
+1b2b9e8f09253b76040d268b80719e1b3f5a55aa45acb42b05eeb99f8b643ce3
+f4b6449ed5a733594f70cccd7bdb073e630c93a502476ceba5741beee5938fce
+3e77996a2c56ebae52b2701debc95e363e995aceedfd1cf8edc72768951885b9
+84f82225b3bb8e9522e784197b8af13d70b2cd113f7501cd9333eb9a28cd9d56
+824e9a3a689741d4577777676015723d17033d2815122b32062451e15dd271ba
+6831fbb953f03db40513901ce59accfd6c2d6f05e2b6c8aac7ee97d4c56b8f52
+bcadc9dc83d5c7c45f5c6e60df9f9471d42b1d6f45ef98ebe41997bef7d56981
+8f9ae898afa16089a91654adb0ae2631539262c43bc5206d6cb73867b19edff9
+024f9c3c7d790946f34742a688bfd183a1307649a36f782daeaa2d8e581c911c
+b42485441fce5ffbf911f1d9988fc5c601d09514633b415378648ca65f2d6f40
+f7cc23901787522154cc33941615849c4e5f2600be11ce10b78ae007ec0e5137
+4c66ef207977c2c2ce5fd8e70a74da9968c71790516f1489fb5a2585df9f5e06
+9552f391999992e23975398fa0f539a299ef090b9ca16e940104614a4fa8c6d3
+495975f6adca90522557b3f02facdab68ebffbb8579876f09895d723e482ddf4
+fdae645cd275f3a8de44aad1d4c2987b6cd35fbb18312851d858e2f382fc606e
+41b7b9393ea57a7fb9903ce835bf1f8e67c15ec8af980d14fab1a56ef1a62e14
+5433a36160111440de43d4c8f28013504abfa5be40dfa52d34af251629a70368
+73b22ec87849070cc52fe3b74d259e603996aaf50d77304a8b6631c652e482d4
+c36a5ea242b3f6a979331bb593edf29f2d9dc6b35bb39a5876e5378e71cf09bd
+151e4b759d53762bb109de5d452919de87197c14a816e6970c6476c8a4f1be28
+e6fbcdd677d4379e9d96a978eda97a0f256534a641017c46f0637a6886cf10e1
+ebd75689d3cad47f1ed6096f825036bfe59a50a550f0fcc978efe560113a6231
+60ae7dff1beb6846a97f44ba6196dff0e9aaab0f3f34ea25a98abc50de2c1812
+47cd8a7e2f2bfb159544b845133fcd3b9f46d1c48462a806e9e614d5eb37b65f
+bde52075686731382196cac3ae3161ebf89944f88a19a5cdcca280c5a47cedde
+b826b08ac1581b76be95036d3797df9d68406c79a4b51adf64776ae9bcaa6d51
+1362e7a00fdf2c9a6d40f64dda4b706fab728b6f6fa9302b4455661480719e97
+cfb7a10536081e4e417984862dad762591f1e352eb919871cfb4fedf2d37d006
+a7d7607348daa1c6f67333c87a1b4699d58d1cfb2764e513e6716c45b649c739
+ae2e22ccc185021d70816ed400efd37352b030bc26ec540629204632c7f9af09
+9af1eab3652298661db3b1ccf3e7a28cd7e943952e826c1bb1fb0afb847e1b74
+7f9d607b30f8a7eff092aeb20c9a785cbebac7352f57c70ed2e462a148b91bfb
+72fa938a8960413ee329553fe07a791a5fee14044962f0b4269f80fd7b5e55dc
+55ba956be348681cf88ce442026aa09f828e59584bf2c83d91a39ea1e3b673dc
+2bf79331e978b15b5319d49535c58b915e7a0f7cbf0c84ea4c5d588badea3617
+d518a5849cb4888a353080a6446c0d86a6f09f1e07c0f6db1fd83f056774cc7f
+2283b249b075479604cebb928edbf84bc2f29b7ecece6266769bb9a4f91f4258
+3c00360a382ef21a8dd920396f7f52b7d55f17e08f3348cb30d76bdaa84d2e93
+3c94c99d13e74f199a8a4ecc0de847abed596854d54dc3cf3de605bcdeb62136
+9386e40207b269ab40cc83daf836ed4b747aefddba2549852043b5a93b8c7da6
+d16f64c3cf84d27035973291df8304fab487aa4b4ca279ca5ccdc91b6740a2f0
+8d727fa2aefcbe4ac82dafeef86eb672aa048a64683c37cddda453154ef41fea
+71e4e811982e4ecbc123e41d496a78f5cfb472230cda008f37fbd309a2a61d75
+c661613d01155e2002bae8b740656a0448ba53e11a43ecb11d072c68d2131be1
+c7c43cb9d97189a5cb1c34b70a65bc238af4a8e0f7466729aaf0217ed7ba6583
+a6c2eb5f2781310b9f71ef1d05a876c0b1c926563979cad433b91341797ac8d4
+e9842a2027e8d5c45ac7d42782421d7028420f0a116296b88223795969c30221
+5684e0a2a8a1cffab24939d4c910429811f3515cc01b842228d954c8279b7c45
+c8e09683e858b3fca768b1748f63604885e6e3173c865ca81ea20093b619e519
+42c0292d48c76344a84198f452d33121547aa7528316aeeb13219da6c56d6de1
+46aae9f76d27c19d65b3bb2b33da3fa441a239a35712bc8478b4a1b2d58c5844
+2527fd1b230401a550980bf6c9e75ef02f7e3f51d6e7d60a9c421889066a22ab
+0399a95fb6020b097082e73509b70f0c64694b73bff79c84be687e7a805f13cf
+0eb2428c5d5ca1f39bcd75166a0b047ccc1069527f86804da275d8c6f885ea23
+1eda30e866859bf0f2368f5dfd963bf8ffa5642f9420861ad4edd4fbeb504050
+fd0e50af70aab831f5c62811238f2315a9e94e8d31831ec6e569358f9dce277b
+8098be634fd17b2a2f4306ac9c0e2c687d1d9acbdda602c8687473c07f467120
+6794d6ead1708aee4f5a948ba3817de8e54f71fac584426f531f4a3f9c4a74e5
+65a2b8163cba42b126909def1519a72244f9643b01ff403643f1d606fee1
+0691d19ed84fe52ea9624fe1606c7a7611c1cb836d64f1e7b0aff653300eef14
+d754133a2722778b45b63e3700a128e7bddffc2e7286d91c9fa2fe4f84bd87fb
+b390b65362ad2b23e0a53bcce2c44b2c415bea7b5eac41cc092d15e2cad1d316
+d5df926c4455fe7fcbe124cb47c28d01a91b6d47370fed9e0f297d698cca8215
+ba271a098f840fea95c9144800c3756db044e20d49152a88334556aa35018a64
+dbd11d7a52fdffe8a2ab92bed886b0533c7e662e0ac6e2de0e5f9094e55f65dd
+77e8263b96774698f86a71f96165aa3efb39b7b13c5fcc011f38e34f42317366
+d9ada698082680809e2bb7409c559024f341aeb4afaf1ac8fc2cc8723542d521
+51b2f874a2e692cf24d571ef958527cc1df6ab5c1abd2bb2058bef8ac58bb4c2
+07f5e12e9a87ff6ed8e4ae72e7fb4bf784caac6dffa20748f95fddc8f878d765
+5957f1d1d3fa9403c3058db83abf6919be5d15edde7dec31ef95988956b49d6c
+99d4a15b609e3060835e8631ff601db345cbb8b5cf00cd1f4076f9e49d83b5a3
+031c1634bcd70891f4c6dc1acabdf29591d77a4d761534980723762dae96d641
+e85c4f6d5103f1251866c074b7425c2118fe676a598f6b2736afa1d10257b1cc
+9ec7cceaa4d28ddb3d69b3608029b01ab333b3fe8ecfd578ad35d29d67322c1a
+f323c63072485546d90faeebaccabd47da6108a00bbd73f421cda74ac8881170
+8114bed8e14433e80b5a68b6057ebcafdc6605d02d28b276999a7f2d6550f404
+7bf98acb58a7468a9ce101c7581a26f39e92fd141e9226eef3cdb60ecd429c36
+59018cdbfa86b92f41fc4462b93e2491410f2f84d2b3dd432333f94569953435
+b8b97ca79880f464d9dc14efb3888abd7e59b0e525d8cdae263201fad2b0b9ae
+270f31a408d74fdd0e56f4f0a3a02d479c48d6093e8ea76a09eec1e2d8677ffa
+7bec2529e2fedc87ab035de9d52e26802a04965bdc89a31c2dfba99570b17ddc
+5173711c8896c89df171951724eaa44dd3589b9cd2da87cd9f7af2b59cd5e1af
+cd76df92698db4e5a265e698d07f80ac6cca445be321f4d17b6ccf318f0c2e9e
+d7da003eb87428c0ac61fca14a499cead4abddeedbdba3cba579ee2a786e2289
+353980885fe5ef054d5ae538348f537368927e2d176e71e3c1d4269ef71aa5d0
+2a87dc7a9650b7a1963205cfc495ed215c9e3b594423eea794709221d78ba685
+0cb0365ffcc37fca5988b9bbcd4a3b1e88ce1201024931731c7b897158873ca0
+a32864f26254305adab7854d7ea199d77c77cd5e0e0d21cd6beb762890210600
+581e061573d60ea7e6959c692b18f12a4aab80ed856f45943d2297325558082d
+24b4bb524fbb56170e9ade70628cd87ff4f5a806000dfcd5b9bcabe51ebc2d79
+169f8c87f6884a7b560fab7f8db05b9d39771fab49e859365617b446dc924912
+df20fc08252f2486f108053a082a3b64dc74d969793511ff8d446b11ca69c5af
+62ba55f071d361aee717ef7ee889b1b276abc7c7a4945773fe7b22e15db6d9c4
+679a6c10cbbfc762d24bdf3b39be6eeac0d922f55a3deda70bb1f85eafc52594
+e303b1e41c02fa97a2306c9f09012386b8834e0e47a0177289e1022a1cba21bc
+9b46803490d254dc2080059c16882a65c8e629eb596b60faba0dad0bbb184e93
+68ad94468a36bf21b4a250224e7b3d5b21b97e8a2493afe5658be31a95ccc438
+6d38f48d32b8594a7d9a84f255cb9fa208d57d885bc7418cef2866127a60c776
+f97ecff94c2307eb3c44ec877fcf73e0edfb471c521eb0c757cc9eb5fc10d8a7
+3fceb4755c6afff4c00c1e197dd410d5f1996e9bb66724ebe80b5f05f98041c1
+3a2a98357af1cce46d69a9e547fef217e907c79db9cf3744eb03feba08935fe0
+7797622d10372015a8cda28aedde6e02e37abf96d67092f8ae7deb6d0bee5087
+694ca9a46cdbd8a513a8e3c3c6eb4f03d3849619eb4d84fef013c5b4bf8cca17
+dd74b6d9c1403ea94c9b96cc5168abad8fdea9a92b4c3e511ebe5f047ee68288
+bf3de1225d981c287fa9b5d0f6d2ac9b7bbbd561f2b3c590bf9140f7bbfa9fb6
+289f8496fff2fe5d5dd1c32dfc80408d750304e9f6124239b2702aaa0a8f27ec
+86192e30a5239a449b656d8c0c6594b95b3d8edc0acd268de68310f453de293d
+2571377bc9c45114130923586825e363007fb219527f2029fe2439769d67debd
+c8ad8c861e90e53221c5184562603f7b03b0c29a6665aa6064c8dda09746911f
+301288c57c3a65abcf6737a433deaa3482339ebd636289b8f3964c88a29a856c
+c209ec385d5b2263775dfaba79257c6496f5915596b31948b3d449e9670a34ee
+76fe6eb0b3a2cf8caf784224cce088fc7543c3f9a71394b4bfa8ced0c41664df
+7b5bbb015c15e7a5123f4ff7600ec58dc7ac4ab2e3ec2e57bb179cb698f65144
+5f379e6e25c528c84eb94938bbfe8ef5684cf876b7310879760e6e7af5b06207
+bc4d8321734432c716030af17a438014b5902a55ee220152c90348cf590a032f
+5871c03e1cc8e03d38e2df046bd128d38054b6d66aea9a49aca9aa960b45b053
+079246f09b1f8be89a518e43b6cfd10f1a79c610ade46912115330743692d0dd
+bfc91ceca3debeb081964c6150abbd5b3a4b88b8f217a9a849a3dede60059f4e
+919d802dc6f42c4cc353e0457b6430162460848153c749ef0de6ec83878ce9c3
+969a9a88c520381138ea6a07ce358d147ba0083d2d71c25cb1669f2f39c22f88
+b276e5a25c3c8887d0a7f655409064ec926416066df91b6ad9660f9ed7046aee
+29eb4e62793d2f9c20c90975e77a06a2ec0b71103aa9929cbee36a135b7ef3b0
+61b413c76077c8d570392bc38dc18494265a4ccb9d4320925a4abcc1eea8
+099d573c70a1a1e5d1a96a3131e15a75fa6929270fd0e58fc9ed82bf46ca2ba8
+16edc69cc56be324c4a1b9942c4d3fd08828eb4bf50ccf3b7402d9a92a7508a9
+a77ababeabce63b56651bf916047a445f621f81b213e5d8d7bcfa2b3d4d489a2
+035c87b0749dbcc13ad34a1b3ce313ab29d50324bd304c362095501d1a372ba3
+3ca9a42d4229904b192f339279f9f4d268dfaac15491f5685e59ac8145da9834
+e3e620dc65a705c07ca3488e064bcffc4bfc6024a2e805b3a12c11780ac73158
+49d7c09394bd4ea0c221c861b8a93035c591aa476af4893c6475a474561b6385
+530d40bafa9e43247acd2f07481fe18ceed4c93adff57d3211a340d76e73bb82
+a98f151ca288979d907126c6a6bcdf7dd623dc2b0d0d2512d7931ebc886b0527
+17039570a75cb813b767f75d678008fab0329bdb6af0f2ae4e41457830f8d162
+3c18f95b4ed5492982159489729acf9368f03d809a614613f59ed2c0e7e2ee6a
+389f64f3c4ce59ecdfeac5b44ca32f7803b9200043e29a62aa6361ae5a39c14b
+16c8b3afc8a6b2c9ea2feef1f900304c2feea730fed5cfaa5c76ebabe1c94999
+a54bc260661fd4dce55956fa21d78d42742d2ec98bf1e4ed4cdf8dda7799ff2a
+8aaf448a1e26236d8488ce4ec4ca405368adaf00bb2c95ba04c41432dfda1a57
+52b5222edd9012b45cf0df0644b2e5b7af6c70de2a317df81f62e9625582a50f
+194bf233190f3757f9c838d08ce835765ab686d2ec1dce1b89a216620005afe3
+dc207c637f63a1f68c6d5a2c2369388cd31aa4e523b36a2ab5f41baf1d677157
+6b4d367aa58db1bdcb2be91c762df8e6d8f1e3decf77a703341f4d5879bbb0d3
+5c8de0627ca7548fba62f36118324bdedb4814f7b292d5faa6a668b2585a3d60
+06683222f07bb1f0706139a482e6b4f79ec50cd4abc417f3ba55d92248b5156a
+3552ad8347a2660b90a70a8821e9a558d7caeed313a075a6c97a4fb2c2ca4e89
+f6003274118d0b8d1e0d11ff7e8207fa3ce3be935702f8a3915cad9206027739
+c05323b1566b3bc263484034c1a9df71c8538b03cf18809bac4063103b89a932
+c946455256de821247f764d8453e3ca8412546a9758d208d0bc66c9ef7240dc2
+2b6dc3135262e39bb855e9bd68c4c0728a5b37f88f7b480e1f03c603cb972cd1
+f065ff19a49e62d96060aa5a5c0b69d59ca802bae9ca40d99a5669040c113927
+3fe87ce3320e5f9293fd46a564338a199d1e14840e3ca440c28a02b74f3bde32
+f3c81073d38052da8e93dc36a30aba189bf3857b573fa8cf56f6ee7f4b964661
+b50f46b5b9122c6e13c6998e54e7b0ad52bb9a04f317d1fedb15ff4b43d5c43b
+8e91d7f3661947a42b29d02be31dad53bb4fe9559a1ca5c61b5bdad5552ecbf1
+cf69a910ffb7d2434fcd4d15acf079c90d08dd772c7ff822ba1ecc93399bc8e2
+11b2c0a6fc53b3ab02e040a3f059ca0e8e2cf9c1fcb83639dc8c4507247efeb6
+dfcdad43df7e35ec37115a2f0da9cdf50cd73f6c2195631ddd1d4d796f240076
+e58835dd03d5f3749ea3ef3cba6ea052c17429f4726be308f48c614c3a521443
+8114b90d88e8ff4d28500bb12eef0f2a79365178735ce26d07c9dd13949e5c2a
+26da29571ca62e3109d941376cb2a01ab70c6c09f144f2b1e3965efe2a505684
+52705862625628c872520e26863facd4000d71140ae2c89bb02ea0f73a2399f6
+ca5070d2e18cc12104f2031fece094e8f7a1adbb5120e89bcae7bae30aa0c052
+9ab20e08cc8357c89f9969bf2d6e447cff631c126f3577e87ade93970c0771c0
+ba35651bbf5e83d90ae8b1f6694680b8d150f7aecd3cd38d8f91dd4ba99f6b8d
+3231a55a91fbfa121b97c81ba0b7dfd54d44dc4dc927df14a579f626ff45fc23
+c55c07515319d718e815a11532516051c178942d7efc38fae4b62e88ac4205cf
+5dea1ab069b05148cf54c8e0a982c6ce3738d894770ad27f2baa1a8ac49d55d3
+11d7b27e7b190ee510c1cd4bd3f70bd38d7374a987fee1026815ba84e13a9804
+4f77c9ef13c7b14a754fd0e07c68a90b3a059dd72b814a8c332c88e38324bbd2
+d4042e32532e7fe495cf892af4bfee6c45d4b46c6326be2e10d76446e2a35da1
+f237dbe7e9e01f3713a969bb9dfe862b2ad2529022e46d3e61f8c996a63aa3d6
+16b447b0d88b533418d9f9bff7c22433634b804e051583f49a74cf39d36ff3d4
+18f69f1e56264b8e31f7850bb961e933eaf370c7a2fc2cd4ab714bca85fe11e8
+b69d3b0f641b86d4e871ded13e0c59cb7c3428a0251b99019c45d8173012b6f4
+7a07b737d5878954a4a0cd44b60414acd0efdffe2b0bce248470f2ac7ad0f7c0
+b5153a1f591896d74f11a9786e8ace48c65da0b40da4da7ddbc11698a5cdfdb0
+fa39ef1a6ae32e06c7e21bcfe5ab34b483593a036f894a479a500bce794a950d
+cd2c82a067dd138a2812ac5e29dc0d719830bc70894edd4b1438df1d925e630d
+d8ecd079bfb689d57bf7fd8227de2ef96e2f3b05d6a1d7aa6feb9874f3c3d2ca
+2697559e5d186e7ad9b06698106e73a0d0a9ade785514c6a66a660e36e1fcc24
+d0140c805cd17539b41f7e28c9c8aefa5694adba674282b95dd5aaf050f44198
+ba633d86baf3939fcc2e5e9270d21ac3ae7bf66b68968fc48745d92844d2b4cd
+19efdb0aa29186bcc078558c9e4d2a2f1aed77491e2942f7998afd5a64d6903f
+2fa8f539b3e788f5699f7aa3f08a29dd7e262af25789c5a097614d396ffd78d7
+4eb62dce0a1beb5b231f21bfe50bfd07ad5eb80b441e6de0e47d36fa3bd756de
+09e1d675952603592d66345f12f1a5c751973514e0f6dda8ec681add1ee5ca86
+2e4b48756b1cbc32ed52f9fef389f81d4182c6ee5953ce8778a0b3275f88
+2a675d8664950cd5b17514f186829790feccbcafb8ced061107b099f55c62f00
+0c9ffd7b20818d1840f1d03569670b8dbc2c2d0efe508205e326c60a81f2cf50
+42d99b153ab4fd7099da47494bf4b0e5badb6e56f7c5bbcab1b747f48149ed4d
+c73c9aa54fed686370eb8bd3975dc34867810e55fa377dfa6880f5263868bea8
+4b26c9f61b97baf65e8c0187dd3ca688b4a11defdd04c707f3ff28fb5a4facc6
+683954278b0211b61ec14f5991f086bb630953775d1c3523cab620c1d7c4403d
+49dbb6803fd753a9e426992ed6bc8befeead4fdd192ebbc1f3a1419789198116
+202901b611d9294aa700958c6611d567eece1e42fefedda0078e7789333eb7c9
+76f638ac7d852b7b2250f6cfbb5669c9112fbf7351d95bde1d4bf32f18fc1651
+1464cbb791f2c16a1fdbb9f9eb4963f09bb20b7d268041c67d49540d28445fbf
+1d1a4e428a911ba89e8b12b4d67f849a66a0f70b15b6e24f51f3b7fc5c872a10
+8147af8d8cf35568ffc50587de88bd47622ff45117a06964bae0981a94f541c1
+000c25c814acc264876a1529a6f37c5b5b3d1b4947c058a4fbf53e96dcdd3c1d
+a93098ef446d61fe8769e1a4ccc62f8fa3a5997ba4276413efc65a52899b1171
+97690e8cd7ed3f9424b8b7edcec9cb450a2cd44f6aca8a6279180a4873c30995
+6ed1f96b8147f9bc3680d9d81daa412bd969f9a70b54dc9b054e97386886ecec
+7219c96c60f7565b29f58249523544bb1360d1fb5cbb1c06af6dc5bb601d5e33
+d227ca5e4cedc8ab4e19a43154b67291ef3903c1ab8fe6c60c04848290000d6d
+a7c35479dc67a6deba0245645fc1c6e3704b073c83a71bb0af4c69d43ef8d34c
+ebd5eb52249bdeadfadfc8bce85d2a7e4cf939ddc479252d94554753cc6d7f48
+5e4e870bc7c4bf3cb01aa002b9839348e3a4c495ea195fba53766189335decea
+4b16d6ee1a03e87891837b822bc091a27912f60de02e09f6edd77429ed2eca8d
+e433c390470e429a803095b2e72760eff221bc395bb223ba6ab44c3de99624db
+1b364e6474ba273e630f6e92b775b1065b7905fb03e72387826a14d181ba65a0
+eff7022d08ba44b97eba36863832373e5d5c3d51d8462855e235cbf72f4302e3
+5caedbdc63e52a8313d907f8f9b77f9884f052d1db422d245201fbd6463f31d3
+7081a4709dbc3a4a5914e16f20deb6e28405da733ca5d31727e4ddb392685584
+b5bdc9308f35a246efddb2cf4f83a1c7028db9a3509f974f409fa0b95e779f2e
+909679d70fe48ebe9cbe849a02868bc24dd755ffe818e62f7df9f907c77340e6
+edd70b291772b25d1e6f7285d52ca712c8d5c8917c242c02a331ee280cecaea7
+fe970e5717b5a8d824714345e89db88f82bf737ab469730545f4f64353ebb08a
+e39bc8b715a541515ba68d3264df63396181c46327c16278ebda432267b7341e
+9afd5f6e12d0a46d985999b648a29114beb6794ef818060f4c05089b6c965b5c
+a2f739c797029baa9d1fd7ee9405cb29e40f0b7768244a2ebbb9310aca9ef051
+93524c4e85aaa0dea39346c08c4908e723d17040ead128db37141aca92ac6d51
+3c830acb43b26371195013f74fc07e862198ab521e4d2dbcc1f6c1b64632b2fd
+bec9fe7c7b0bd419c0e0c90be23562352d63b00ce64e574010172423bf5a5400
+120544c4920cc2b761f94727df477d8db770172691501beefe834e9627551d1b
+7ed85a415293ee84ef32c05c133394a8f6d2c97a4145731d81485b19921ee504
+ef3c83ce7f93531283c6275e3b1e2c1f59b4eb9149b34720b3d4ea807d07f16e
+915503cbebd83b173d6aef2574ad64e365c0d66a993abaf34bb243bc19de3909
+da113265320efa2c42e085c3f897f0d49d1161eaccc4de5819ae04c06d141b21
+64031d611a41dc693b0b1e461c5432a91f363429cae52817c005cb1c0d2451e7
+12783bf1258c579969c9bf448f92e9eb110e4a01476be68e839dd0aa23c9e729
+f35a6dc7d1869e4e04940f45d197098dba0c8becfb51d65779019e678cc8bafc
+026639ce00ed9fd50d81fecaf31dc72e407853d1aa87fb74fc58f85457165dc6
+e9c62889c3fb5d8d1371edb85efae402433ed368de1c327dd059d1774e270c1f
+4ae58375113402dedaeb7af44416e90772adbe89eb2297a025219d0b26577b7c
+6a261200be54b387539858f28c3c108c0e6fd94ce8c664049cfd9cfbb246a971
+a093d8e5027d67a89eb217a15b8ece65c6efadb667852739e02647d111a69cae
+ad0a64ada40fb98c1f251cb49eae29a3ae0601db63f00aeb68d2e9acb79888af
+725fdd44f3b23f8fbacf1e5ffbea4427762335c05debcf002cae6436cc5b6fe2
+6688d3a4adf9e542e38b64d473a4a2410ce61adacdce2ca7ddef86bd9cd96761
+02b0b9e22a4744edbf299db408b7b0b38ced7d8c2c8b7eb292d0e4eceb60c79f
+9df0f8e92b88699d0521a0f85893cca9c6d128b2fce38477dd9e6268868588c7
+f45f09194096200a65571e7c455d56202345aec403ced5991eaff6938c0e68d4
+afbfe14b9497864d90bfea74fd3b43a178c86f9a97423815f5fa2c09ba5a3286
+52b62e5192ddcd272649bd4eb7b77185936fc36877858877c03c1100d8ebf3ce
+ca4aade5dcbb3f0cfea2733c64a9abc729be68ee00506e55529ef6da24c856de
+07b4746bdc1ba4a84f7b70846e33ce5f285f32fc4e53a52e9527d01989a45b55
+43596f832a953f8f0cf61f332f2b6db3041565fda3ea07e2c04226045642be31
+a8b0c78ee18b0db5aa7d03b116f7188c5e525f5352e91955bd434ce34b887b63
+2df95672602e1556207b8e2cf3f01970d9db197ed12d51b0342a0216a769bb5f
+0967ca8890a11706f748014cd294e91f19f83e7c0f58421a0c354f1be654
+f48818dd76a3f20e743ff42b04a1190b5887bd0e0d2491ab13fcb507ab79fd04
+21c5c06b9d5930211c90c3d5cc60f3f1a0e8b2bc9afd5067315e4118d72cdd82
+3a76fc1fa1caba526ee65f6439f9fa6f27f7636521ed4f71c63297b03c9f7f76
+b44ee925c8ac127519070a7aed414d6fa40aec9e8a3d579cec7737f9d9cc8533
+d802226d4929ee7c9dc63ea8f9780763e889b13fb2bf917dad83878518dffb3e
+ea998267fb51cf42eead7bb0a609268b6a21389ccfdc5fc3af1e9de106e3cc7a
+f6a944a15528ab3c9a630b8ea584a415a12fd2cde2a2b3ff27cfa13968009542
+5ad8b4dce63a5845cc77126df2d9369fb597cbfaa9a695db4862edd2ce093194
+75804faf2417789ccea510ab3e173171554de156e4428ba4ca6248b0dfc87205
+11e9754f3d3e68b5d7652489fae2dbdc31e336ba7a1d1c0f5d1533474c1d9275
+7d1eaeaa55b4601bfefc1c4a2c31fa7f4f89d337209ec858b9ffc4729bab30eb
+4f11749324c15349a500674aa342e00623e976b4b5d9c27c58aa432f300714be
+d0094a83839f08e6b36a1fa87b9a81a3249fcd0540edbd9496769cd6df319af7
+4e141e414cb9decd58eb2544350bce56376867a62c71764f88644c6e5835216e
+d2dd1b36fccc46801181866c29fdf3dd6c73c55a1e990a07f8b008fcfef55c2f
+e859135dbb27457fb4cae16197347611dfe63da3c7cfd847c628286cb4eb6ca0
+d55ad7c5a20198f18ceedede8d9a2dac227580abbcbf4e94c8b8863191f877df
+ba47b592047831b16841b250cd148557d72dd7e683bf122b3df892ccd2285166
+6b910bec1f0b5a22e5745fe8ef47a6cb0143d1a6daab758bd7fa7dda251456c6
+8f04bf28cd915c67f516ea2341d5a1054e5317b85e3a9fe6b541f50ec43b6fb3
+c4233a2d3adc4ce7e99514b2dbddb9b6128e6c913c88111c0d80957fd3383841
+30b535d0579d727dad1e967d54e3e2f2e41bf98a30b01c327764e690a5557fb4
+e93abf4ffa23649dca59e2ecefb861adfe90aef8aa8daf25d1ab3d3f06a19831
+04fd0583f6b3b0e85e66c882c0aab748dd2e47363fc5afede35069e38da417b8
+a345d4c31d23b01f6712a2aee10e47046adb1de7fff9453f98ff1e80852ce91b
+5b27fe97e1d595e787e96359ee9d23c7e547ee9f976d08bcdc3ad62b13e1af63
+b076ecb3c414a4334f57acf1ab49d651ba461a600c56eab620d9380d5f603d17
+9ba7b402e60bea64c8dff7212d71a06bd70910d097dedf81f7703ce2aab39253
+1104adae188a6685f022a0ead9838923342d8b23ae0864de92fc7ea1f45b8702
+18aa6aa9078d16c83f84bcdfc2a202f15b5e590ee0fab34d734bf44cecb039b8
+6f475db68a6afa0948db499370837b8318de7c223c704b2759bcb427205fd7f4
+c7241abf43b26dd53d90d015838f8040dce919a3ad39bd4e52785fa63388e0ee
+37c82618bcf2be11f46911b331e7b96a859dee2e0336df3ce8efdfcf82b6294a
+4c6824bea3b960c86c7db62ecb4edd7544fd3ff04efec96fa9a521664eec4f30
+a1261a0096ab6580b12d648ed51eaedc70ffabd0d0d68492768c7f55e9952987
+100afc0ec03cf109be3ebffbffd90935690c9d68c21b261542210824a36ca060
+33f543ed44ca2702a5374368c306abe1470d0fbda920f3d8c391a5fddf2318f6
+d505e8fa521f1c1f0a492095e0c27ccaa30e0db63f02f11dc0ce8a94bce51184
+307257ba246edc7d49fc9547ea6a83d9a5ab60c1dd6175ab87e1a511a61643a6
+07cdd14f0bf896e4f211796791c6d077e0df80aebbf9dad1b8299609c0414a81
+03419158b5611852afd2765424bf0d8dee255eb31c297c5262acaa578e03c06f
+6975de2564f315213f7d941d5ce972140fa9a2d687e06f23a0d0ece4f8f90353
+a86b68f77c160bb67320fd37d39688480b738c446c51f462b87f59f1a762f47d
+9f89d1c1d46a76c9e616263cc0dfe0f27b1c0c1ba35fea5af6530fea04e876a0
+58e9efc4e9da426fef3b4842d68a11be072bb0a39e5bcf0fddee7fd76fec56bc
+71f36e8f256567cc438c97f08a2ce8e503cb939c29b301b699297540c4783828
+307492cf79b71d5c830e0e62e28082e677b00cf9d1fb7198c9bd40c6d9ffdc50
+96e10cf92540078fb66c2b1f015c7400c5acc78b118a7f57b019633dde954666
+7a1f31a1841e7fc5cb11e357cc9ac3805e2f27731ff2317cca1dc39934d9394e
+3ed5ccfcc4200f1cb1fb38c13aba8ff3ccdeca34d9e43df94060b48d51c330b4
+aec63813cfc2afd816a7e58ca87bac3f740d73c76adf3bb6553d03e7aa40ab75
+a5951a39739c6d5a54ba58f115a12c0d8323ec3d2e875859dcda7354dadd17e7
+c4e82b25dc96329c47e58a0e5014e973c023617d81617714c64f96b8faa40ae7
+70616ff74646df196e1c9bd16e590b017da60ab915c03956146f0846a7b68835
+6b3c79239c4db9902640d935fdec762592e82b209525f9e353896165de4cc11b
+7b345d335b1a481fe3db8ae445d3165e157d570aa60159064f494aa466b653d7
+3cf8e8251b5c7ba4c53ecf763245a9d02f2b65cbbd876f6c3128a4c6d9003273
+d1823ac7b461e0fb63d769e0e61736b29f482180233708b5d1b0e274da2d7d8d
+0dc3f149f643ec607e699175352be0b75082681eb59e46c0e16b4e20336be36f
+57fa2e39a58ea63476727f6166c9c4de6e2f9d0e6324904cc1193cb1ac665c60
+97637e1ca933e7ff893e919287b0f7d1f6f7f7f7bd6cbd0120f39bc408df87b2
+4a17688fec601d8ecdd5aa0f53db0703e49ab9c87676f9deb307774b71824c1f
+c8cc81cf06ad29fcb657727953353bb16b9c7469e82c8e80635d559c8f3878aa
+c62a7dd1fa5c08085152dfbfc778a0b018e04fe1318f9f6067ced2ed6c12
+58f6d20bb8785ae96f9b9ca433be7cbb5c064759f585312344efe15985bf1029
+b38878f2b28870b4e121c7af5cc55e26fd5d810eb209d6708cd65cb9920f55d3
+5f594afc435eb5653419739e6108a0d97ed1b35c69b87e4289332a867ed4b18d
+ecbba6be8053b3caa117bf08c7b2214f4541344b3a388bdc7aecc0106201e9a1
+8e245f040c683425a35c23b78a82abe03821f162a96cfb13d6ffe686b1cfd04b
+8adb060f2031209a185b98bf66ab89b6547bc8fcf4858b10429316affa7f1574
+75ced605e22cc5fa5ba26fa37a1145ab38520ea4230723af2b00295534756b3f
+f4b8580081426edf8979a40ba8c9ff3ccf743e2cfd06600045a1cf7d1f75e91d
+63de9117c460df01fd67e1bc9d3ab6c0b47f70449834174bdc35deb5dd739d93
+2737b41b39363674768050216378a1f2adb70531b1c2cbb35b44b36acee4540f
+a534d9582ca1d14d30a2a1241301c5c8ae34f36df371ed5f33863ee042a08ca2
+b4e9e6a65fd4fdf36e202be9f54089add48309bcb6ec12009e0b9d83e438c954
+8631fa49d3f8afe68f05259eb32821ec74089dcf13d6bd0eb63eeb42351b0878
+91575842a8989efb62f1429246a17e99c511fdce6c87f9f940d7427c884cfe3c
+1ceb445581c55bd25d51283d153d2d6791bd5532949fbbbab7167b4930d6ca31
+cea352b2d7b877d9939e4b064d574202d079ce9996a1bbacd4183797738bcc82
+1df0bd229539650ee2553e5c3974fc06a928f657cb5c66dad736caa105dbaa77
+c79c8eb03a549ebb7946504e06dcd5e24f81ccf461b56acb91108503640b9dc1
+cb55747ed71de3c5f258dbbfb8983f1d9e3b9e96ceb7d5a5acb1391600970ff7
+b93552fb54647cc790ec13dba8559469eb33df63504ead3894c82a96520b0032
+8ca866d39fc4e0be16233cab8cfc2b2756f263766d48e3b35cea99d7a230f98f
+e4bf1324c0fef0859894525f97acf0a55b3f6521ad16f55896b134956e807e3e
+9831a60d0ed54a6c6e31ed655a03ba22e2c886679ef68793306d69f21b59b52e
+617c67c54dc091fd884650224fcbef5caa54711f4df427572b229f4f64a36887
+d9ab72acf0cbc6bd71e773ba5061e4085740ba2d6e76e7e4654eb4ddbccfb2d2
+fec667
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndResource
+[ 0 /.notdef/dotaccent/fi/fl/fraction/hungarumlaut
+/Lslash/lslash/ogonek/ring/.notdef/breve
+/minus/.notdef/Zcaron/zcaron/caron/dotlessi
+/dotlessj/ff/ffi/ffl/.notdef 30 /grave
+/quotesingle/space/exclam/quotedbl/numbersign/dollar
+/percent/ampersand/quoteright/parenleft/parenright/asterisk
+/plus/comma/hyphen/period/slash/zero
+/one/two/three/four/five/six
+/seven/eight/nine/colon/semicolon/less
+/equal/greater/question/at/A/B
+/C/D/E/F/G/H
+/I/J/K/L/M/N
+/O/P/Q/R/S/T
+/U/V/W/X/Y/Z
+/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft
+/a/b/c/d/e/f
+/g/h/i/j/k/l
+/m/n/o/p/q/r
+/s/t/u/v/w/x
+/y/z/braceleft/bar/braceright/asciitilde
+/.notdef/.notdef/.notdef/quotesinglbase/florin/quotedblbase
+/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron
+/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash
+/emdash/tilde/trademark/scaron/guilsinglright/oe
+/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent
+/sterling/currency/yen/brokenbar/section/dieresis
+/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered
+/macron/degree/plusminus/twosuperior/threesuperior/acute
+/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine
+/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave
+/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE
+/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave
+/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve
+/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash
+/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn
+/germandbls/agrave/aacute/acircumflex/atilde/adieresis
+/aring/ae/ccedilla/egrave/eacute/ecircumflex
+/edieresis/igrave/iacute/icircumflex/idieresis/eth
+/ntilde/ograve/oacute/ocircumflex/otilde/odieresis
+/divide/oslash/ugrave/uacute/ucircumflex/udieresis
+/yacute/thorn/ydieresis
+/N74/WOWAIH+URWPalladioL-Bold -1 TZ
+%%BeginResource: font PASPAO+URWPalladioL-Roma
+%!PS-AdobeFont-1.0: URWPalladioL-Roma 1.05
+%%CreationDate: Wed Dec 22 1999
+% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development
+% (URW)++,Copyright 1999 by (URW)++ Design & Development
+% See the file PUBLIC (Aladdin Free Public License) for license conditions.
+% As a special exception, permission is granted to include this font
+% program in a Postscript or PDF file that consists of a document that
+% contains text to be displayed or printed using this font, regardless
+% of the conditions or license applying to the document itself.
+12 dict begin
+/FontInfo 10 dict dup begin
+/version (1.05) readonly def
+/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def
+/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def
+/FullName (URW Palladio L Roman) readonly def
+/FamilyName (URW Palladio L) readonly def
+/Weight (Roman) readonly def
+/ItalicAngle 0.0 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/FontName /PASPAO+URWPalladioL-Roma def
+/PaintType 0 def
+/WMode 0 def
+/FontBBox {-166 -283 1021 943} readonly def
+/FontType 1 def
+/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
+/Encoding StandardEncoding def
+/UniqueID 5021141 def
+currentdict end
+currentfile eexec
+d9d66f633b846a989b9974b0179fc6cc445bc2c03103c68570a7b354a4a280ae
+6fbf7f9888e039ab60fcaf852eb4ce3afeb979d5ea70fde44a2ae5c8c0166c27
+bf9665eea11c7d2329c1a211dd26bb372be5822f5ea70d99eb578c7befd44cdf
+045a363056e5e1cc51525ea6fc061dcebb337208eff729802376a2801424f670
+0e7e6397b28f15bc10b40012b0a3eaeb2693e8f7f627c4c9c7c6c5bff105c1e4
+1b2b9e8f09253b76040d268b80719e1b3f5a55aa45acb756b8e2bf5b37627e46
+dafd4a4f741a859bb5f7d7c77fc7aa96ee6ac93c06ca829b81fe31e32d59c6de
+b1bf3b6ccc5c3c9296dc86d01487f08ab668f656cdd88eb816aedd1efa47f014
+ff598e78c978df18f8f66057351bc96b48015af2e09e3e318053e952e9ad4037
+bfc7eef9cbfd7bc35746565b7efbf241639793ae357220843147fadb929fbd24
+01c88a382f00bf79554d125c543455330002b0fe6d229830470c78541e78dad5
+3e7c1a619b91215ae025f81561441bfc9ada446035b8eb9c3d69ba746ad0ccaa
+049d1fe4d905df3f48d22900e02a23fb23f6b571ddc8b2cf7008431c1ead7f6b
+d92a2c42caed94f9714f44e3ce31fbaf23a064aa2a7f13d6e5378e28539f0009
+323a0755e58ba7564a408b142c230672a423da6a6e54ed162afbf8fadfa75b0b
+fc648d5da6ec31251b62b9f619ad9460876eefcb8f9d2369ca3055820306533f
+3c1d47d5a2ef97619fc2c780bcd9540a820748369ffdab9d52492f130c0ac3c8
+e0c87377da6c21f1de429c15aa939877876f84605f6785b5adea97321bf29def
+3692af535eefe801975f94645272142128a3fec8b1bceb6e57b83520b5c4dd69
+36db8cdef6e49b8944ca31c59f8790cd3fed58f1182d9ac6dcb2d75b4881b430
+c67db769b4745ea54233cdfd5600bb2a96209a83fd04c13d4aa4ae27ded97d25
+93f6fda5f64711ec7a2899ac98bd8d8879a6a348265832994c3bad80e1d12291
+cb05924302b780443a76a09e1c27e8dcdcd87ffe3be17de0421a47733c2bd723
+9c876942155834190f65598810af8cad9842f8a1e3bbd2ae3348bd8fc9189fe2
+ed5643ec4d87148775121702eeb7639acd80ef4f07542bbbc09f98f81fb91a1c
+89c691bf38ce4239b11c1c0d9a6b864753e204c0bccb093e139f9d6104fe0584
+df022c621f86e5bfe2e047fd560e8a89b3872c87f7811e9ebca9cf182472841a
+88e7c421e5ce69dad123b88d4e6c0fd85c86c74435bfcae28c2b5cad57d91a9b
+4473906d044085b5336b066c6d9ce994d2b333f470ad32d3bc28ba2d699b7ae6
+2b689cd50ce2d458501ebcd2381f3430c3059edca22d9f15ca03cd18cb160e59
+c0e960f79010dc1e9ec40ba6914f9fb7951cb4d5aafaa135c17d5d64cd848a32
+c71a5c856cc9c94f24b6c9af854b83771678c0b0b4c6a4d9c05ade69e5c04697
+8751f11d2b8ddccbdeb88c4e218bdbe5e056b965ea185e8df96b9fe97ee23dd4
+5aadbfe02b427222b9920e8f4e2836c05abeff261124dc587c5defefba7f57f2
+8e24a5373c30b5e3de704856db7836d1d5829443c253b45f7f3efa1dbeb4d8e7
+2532c2593550eb0df54d9a9023452df54e52b2d14ccd6f6eec6b703f4300d555
+7019cd90c60aa2a5a6416617a6d6afdf832b4dbbee2065a7c3099520a0fb7ea0
+4cc88522f0ffafb42abf6e443cc5934c35e1576099082701fce199811dd294cc
+46c3a1889b7d6498a0f0c355f94e92659245514fb48ea19588ba2944bf5068d2
+f6b9321ad914ea4e82b712d7809e872c87d13f9dd30928904494416e3df1d015
+50fdd11f791b3ce3455a4985ed699f01d3cd324dbbfed9dbe2e0970ef2443dbc
+653eaa60868049afd2c3508c385f2ecade863c97fe52087181251ad87a3bd34a
+2cb7f628fef7e2e78b2eda73ce47dc93cbda072bf693cc93ae903b04dc70ceb1
+26e37f9b68dc21542228a4fba8df907229c1ccf681450f0bf41741c5db9bf5f5
+bad37d218b1c3735fb7d517c344afec68f3016c14b5541515438e1f36dbc13e1
+1854a23af95cfca48327c3ae4393c1f3eee76365a67c3b6481cf7f0a74b12628
+c0f838ad7ed830886303207df666d3e2e0c51436e2109eba9af8ccd5c58b548f
+e6133745bdaf43e4730e8575200f70d3ae26f23322b5f5b1ad9f6617f74471ea
+a474c6bfa593d9d8515c6acaa51ee95f038e3e44de07043aa4b9f586c3332f56
+ec6531d2a744c59062139575862edb989744e06ec1d1d83451a800295766162b
+7ba50b9c4156a24084cecdf954e654c66d1761528870007cca3a83192d97b128
+519e4ccc9e0f20d821f125dd9b4396f2684bf4963fc18b0142b9651b2647fe0c
+de1a2258f05cbac20ae0c9f80ec6f3c888f976be53a8e2f5d224fefc2def84ec
+fa903bf2060e87ff1ef88a9cd5aadbf02da65bb417eeee66ff7728f306820389
+6c931c86081b9870a584f81c6c2378c79ffe0303af1b0861c65d9ee861f61d00
+9032fefce1449f0e80bdcbcfcf477a2c30a72ec227b208ab4396872f92559815
+8f2e622588b3f477531712cf5ad2c3154fd5480e88e9beeb2499bf34a46c864a
+4695c580449bcafd90bcaba4ef9bea75b2334b6d01167e103b260c08c5e2b71a
+e4ebb377d4c725afedfecbd2e444d7994ff2820f805120ddc1fa1f621b1c51ca
+8910beec97ab3161cef742d92e6155a7ed352738aad1b59b8a9bb23d42180423
+07e484efc0157825f1bb8d2784f150b9180ecccc77586e39586db7cb534d1d0b
+259066ae6c0078b7695bead59a29d4d73780fa7bc9c84e874b160f4127d1975f
+2ccf7f0a72701a3c871a725d803630c901b119fd2a9e94e2dd99cf4dad685eed
+19831a142a95840fc5849db4c1990e870e808812cd82b634562e96b8ef8c
+66bfbf49c4c5b41e4e69f5d4a862142b7a895f9db67f41582d0c8174604408e0
+f60883f13152d70d8c76e0bb114f84862e6b822a1206998814ca2627286b9560
+76bd1b11d1b68e3e2978c2661e7181897aad031b618cb8bed3f5be7f28a19700
+a5452c092484fa6faab5fbdea2a2c207daaf55a44d91b8c0b4b022fa0cd8b0ad
+48bf97b97292a18070a03d6e1acff8bb118dfa9cd64a24137f2da6c21103da9b
+eaa7e70b4c0c5cb3807efabfdcf9f836d1436fef3d36cc0fd6ece0ef01bcd9ee
+c871afd57fd3d8b2b8bb46ba0b2a96e810decf6c6db8f03151eb9f03e231531b
+8ea85aa74fb443296734d6b7f9a7e71d119318932e563c8827cc340ac4350dd2
+ff1a3ea9f8f7b1132bf87958f958b10401452de8670512ae5aa12b655b91d504
+3df8419dcf881e4a57135ce1ee3d8a6c8d67e74fb71f2025db83b2808cbcf670
+68f475601ade4876d3fd2b0a21e719d5677db0e64c7650df6fd8a7f94139edb2
+51936aa43d02f839dd161168565e07ecf797e106c1cb188fa1fdddd0f955a08e
+8d8263146f07fee07acd9a4a3b90ee6ad37a34c12b4f9586db6610fc1e7cdf58
+9ec83bc8b52d78b387b210f1f08ea9b1e0a06082f5508386711b833e46fcb289
+f3fed3dbeb40aec6836cddc6d66851e7c27026085b91c9d740efbbdc8337ae3a
+855b73cb1f315c3f857eba17fea216b3f9fe632a666964ef77572b7fb2d43655
+82e4b187b4dcd0dee307c32699453037732f54afc0baf6068997cf3b2e26e96b
+6f0556d49923d63173c465d725223c0f1efeb789f812d0565f4bc740aef26efe
+447e2c668bc0d2196294fe173ea579acdcd5ceb4ec0a94c48f803cf8d3d3e917
+2bdb50096c934921208a8e3bb6ae1652ca25b42aeee769a1b59d15d30b7292fd
+83b6e1d7405964ebdb1f1997466eb09b29b743721932eed4cf9c8fc97fad356e
+02cc507e81cadd7262fa3d6c4d69326d31dc3fed9625ddbbeeadb867ddb7ff06
+78f4ef08ff2fd416dc8ef9bb6eac27ac7a411bab23a8b984b10a9e09d504e360
+902f0680ac09575b8ad8ad405ea6850c70147753e076b73687915d05705f3876
+14114867b579f69e34040e2aff508ce7af4b0d544e7bc695988933c5c4875e4b
+83c31dfcbfd24365a1d195c876577c21918d904df26c22f2ce06915aea5d9222
+0852631ccf8bef92621606ce2cfa8c707e2bd307d51d7ed874d3948549355b2c
+66e26ca8608765c46eba73e3fd9780a42ed36a33e97f6d1a429efc799ddb5a62
+5864ca94cd5ba274fd97632c6c0f0067967a1a39c2569d54081804f5fd98dab7
+20996e76c827664c5aeac13e06f1086ea20848a8e5e5d3dfb2424b7cc4514be3
+1fc56f48648689b5a0fa8daee8ccc5b3cc8c653116d0e6aad719a820f2262adf
+2abae1e46eb10e8d9cc3e9f704859d7495d9e1ad240c5c1e3e022ae5617f57b2
+253f632fe978ddaf5e0a70c2137b983b1a54e4a618276284cf0b0724c84017a8
+81ca94a329ede84cec59e4c56d3c57e14995a8adfa51cc6c3a84d3dff5d4c7cc
+d9314923f532e28edc1f4ec3d0e698d82bd4373225c6385265f0b26f3b72a686
+43d844b4f853852e5654a33560bdee0efa73596387c452421ec87ef9be08c47f
+7d1c871be42e5ceda6afb08bed690723bc291f6f4bd470436d8b76e381f808ea
+32f31c59449f4b5e9d0297f0907ab25ac2c4f468cbae6939d00ecf6779f35cd7
+820b221fe0b71a0ca584024c9645755995007ed97ac659acb1b0c3d46b8c6b8c
+53adf57d33e98c6c33a6a423c7dd79831fedd65bc403afd0a9a11d8b481d512a
+e89bca5bd92b4a41edf74bd6546a647368ab407dd69e00021831ddab3d794484
+c4a85b8f0097dee9bd4a567a08e6ee8d270015a2c4dc01cb803f2d05c45154ef
+8c5e57e07cf0a0966ecf94f269208fb8cc62857042f747a1d4b6294f2a0c3175
+54a76ded2743fc862c057f3328a845297214868cf511a1b5c054cf08bb2a1599
+0754137d17bc7a036d8aed54591271acc1809460a8dc42308e7330aa18015ef8
+e9f24c2853ec5daaaa0a3cf688cfe964095ab61eea65500d048e92a7aee96bcc
+291c59a35d4bb25a3830cdcf5b4a754557d86ffb6d567aef67b192c60678e869
+d053cdf727ae5e7d1459bc80b42fec5e2b570691b761fe3254e9d2cfece08d08
+7e6e2768709a41da13f0f31275df573e4edbb8e19df495be97e6fc940b9b5b0e
+ecd02e56afc5b6fdf9dd69e7635073b64fa7a640961e9292103bde93e7df94db
+b7fdc31bfa1ab11267eee9f5c707f1b261e4663f88287a2e5e62b57b5fd70ad4
+6c91feee98a88190b7897005153f22be6722679f38b101a1170de27c5d366346
+3e29782318583b8eee53f2982a3f0e7ed580da42b0a34756e6d38d3fbfd54a1a
+5cce363de2eab031aabb172d7e6b75468e46aa74d108457a7b07751aab03f8ea
+d182f797777f48918bc9d58d2a0da9dc23ef7d741dd9fcbbaf9acc9290c79fe2
+4f1a82b57e5424bff39434e3f7580b36099a5f4f1d22d2de757ec74ffc5e9b1d
+2f70a87d381f424fc2f34bf902f0c767716a5d86a42d4ac9b54c9d41e0dcb52e
+647555d998b341506b4885217f13300d19a2518fe3b3ab668213fe1a05c5591e
+edc1b75251bff8576f1c9cc5c0e5213fd3cc0115898f910f38fd25ce03f740c9
+69fcd8fc6085a176cfc7cf7e387414e4a017f9fae43f47c36e5544a536065bda
+b11cb8c655a72354626722c510d6e242e10824eb3fb4e3d4a824349a563d628b
+c5b81d682ab64f0ab582af6c983d4950ae2043610480ad246981537724494274
+23f94cc4dccfa7d52dea507e5d026aae08682590f7cfefd3404fb795ec4d0857
+aa5d6620c95021df41f664f6dcf35e935a614069343e1a056dd350a3cede
+442b5434a2e68b180cb1d3458f56f419acd8cfcad7acce883401a9768824045b
+88c5088b012e82869a09552c199d0894aea08b8fc25115c2b59b1671ae16e0b3
+5e28093cbfb2d35b1e1d04a56ef39f058f8098bcd2f87cea850cd7fe407f893d
+523eb783e2dca887b020b435c1f8c806b672d2f60b7905d66760a048f140b93f
+9e8d194e795b2651c80781d92e8ad166e9bbf5a50b61f3a8dca03f2d91ac6148
+2896278e63f585b03db9f715877fac490369631461acd157d7939ddad2cb5f8c
+0a6f1295c15c74de5516e8d98416d772984988c4219051a2214b3bfd198d6f5a
+35673d4a83705e9d91a2fb90e4270ef7a952afc2837ac35b7df97ec3d3b49dcc
+3433352e33683dca0cd61d64cd7396d63c7df86581752544d7d4da92feab1517
+1d2239da6049d53d1a83c0538df2f8a5eee878e7cab71a260e89ae072d1e66ea
+6a8e5e8456d81d33e6f388e1c1c78318392deb511f27a0b6c1ee8c0ec10fb99f
+32bdd5f25425f6b11805152716480c7db84356b19c7447961734401f5430a6b2
+402d0fc042a567c7b2297bd559f2e8a6dc5eb9b6812f1f199c88649d3b6c4934
+19c4728cc33dd503e68d9ac75859f81bc3312e178238b9d99aeab380fa35189e
+07011e9324df8e45d0dc7f56984b4c597e90148e4ccb1faf40bb31bf70a2c9ad
+a5241d9e76d09ba6b49afc99d60610a5699fd683e7832862fcaef0977262ad81
+650fb59d4b8be6222bd41fa86dfd91484e6fcd36d3a56369a3d88389e9903fae
+5f92c8a1b089a00191fb71043266bf61cf78034c21ee6906f0992088fb4d8398
+96fb0cd79852892b755378bdd7d6eaf1eb537122bfbcd3d6402faa54ca242f0d
+9cc02f1bed5f60f5c9977d820e70cb6446c8c48b82ffee4c84a9a10f1f076e48
+4045cbb025716c0e57b9bd48478b6a1e8fcb1a90e70336502358bacf8910da32
+fd992adfbda97f43f98d5e4c9c8fe491582588cc4588b3481e1d0e91160d1fba
+ea10ae402ff2c0689d9b74386a24222d4cfd10a6657a6f83dcb394f2d8951ef1
+c42eeda302d6e6205b6916d02975313e16be56fc5ea2ed09265d2aeeb0bd9b11
+d5b14216235e2c944cbc1c5103dd946a34e22a5deeb61a6b2f116a2fd9f535dd
+cef9dfb5e2becf0e81e924ac9063ff9034dd53aa5986f04d17be7ff0a4839e59
+5b9c517aa0a8353269b6c4e19ee407ff50f4d224b1bb55e4436c6564c7022e05
+d180df588df93b6925100d074e11c6d2880423b7548337e211b10c9b5c28a6de
+7b0329006e4af46a848a8d0e630028317c6ffe3a2db30ec928544114db706b48
+d8a91dd007ac7d759ce74d6a9f75b373fc7031b459b197408466080e03add276
+01ecc2dfeb5a9335a6facb174930ef07ff70eadb5d360e52b0879e3ff37e86e0
+50d9e7b62a581199e65b1d8e5f59136d8fed9bef89c39637f4fffd5007859e6f
+ddfc381a5725953b4b89397e924525bddf5fc2af9a36305e36c2a2ddc690256d
+2085b1d5fca9165caead2464d8d80ff6c61f4410be7699ff1a049f88a34b3f02
+6df847160d6a0b00195df9c651aa32cabf27c7d8ed04b4a6311588b431ada2b6
+67b9a1a64e8f433bc771c29c5837fffbad42f40083c2e412ee5e6ca5394d5b05
+fa1a04f498c68d3a49078a7e2cb48a4327cf4f98e05d5313aa0122df71ab6b40
+97497eeb38f0274f938c63da36a3577710e1bf34f0a215736c4c7662527f92eb
+86b8bf729b4b7467486c673efc9f867cfa5cfc66cb3f02ea2e6627c292001d28
+a40628f89d0c92de664f6eb976b3085676eadb90fcf679d810bb18423e8ab4d5
+1a3836f3298ecc4d66732271a2c75cb9368d70abb56b7fd0ca544acb26aeb786
+4e4d9519f85b14acc3a22cc114d6c191ceb89a2ae4721c6ec0f48620b2a6e943
+712e439faac3f534c3ca302f30a802f8d53613f0ca0b415712161c0ea8797c36
+3271f8a0ddadb0c676757f9dd3565ac9c9cfff5a359f0f94b0bbbdc8f916dd9c
+3414085aedec2ed48949ce87bef5068b17d035e4498f6a975c519697625036d9
+ef72eed8c120ae25caf0ebfc32ab5db46cd7200ba7fd0f17418b4dda28877b6b
+86761329f3717a831b6b4927d6eab9c986de46449de191796ba0403d5f92014f
+0c6d53d75a253ec545e319d8936fbd2212db0269be8b2d96770f9b1f9faa5ff4
+d0f2a55ac78a23726c41865da4e5ec2cc741d4717d84e48ff0be0d9c1da98d39
+a2ebcdb6939f5d72fec1bc9bb1492be948713a9178cd771a281d685bb22880a9
+9235c48f5562f956cd518ae2b2927c68e34660a4be38f6816b2cd916f549a9da
+21f3cfcdb92e145d9bb7031a79a6455acad831ff22861e17e2f6896603072adb
+b1f388eb83160566db82f5fb92674dd223d544568af2b59932ebe10d64f5fbe3
+e3039d622d1d229d18860923ddda81f127a8e35a5228be090d89f6838beb402b
+7d49dedf9ebf7d045efbeec7fc12cd8ffaeda9c40ad5ae1ef9dff088330f676f
+c6160b5fcca005587d8fb5e68b9516c4c99f5df780bead3ab69689dd74164d43
+c048b6f9cbd3d6037a860086d88bb299fad3b6e725e5c68ba3d0e5dcf2f6e58a
+f26122c2d5ec588931baf8d0c7c1150debf459d141a864169d0860be1c2efe74
+b9cd770672dfbfc8ff4e57dee148c1350e58eca8c4ad2dd5e5949c130d20cbad
+9ea9f25416e255b5a3b35de65b00a629ef39ea60f41db9f5cb5c7c49d40d8f7c
+49b6a14138e2628de0c4f100d8b16ecc88e003da138093f46524b0f515d1786a
+54640f0247d6561af9470e9422f2d3a2016b90b0c01c6820a50f98904c95ae4c
+69faa9398b6d6850919383c30bb6c46a2d6dfa960a747694b27b16574533e115
+a2d306a0b60cb96528fc0ed098926e1e4f3ab711deeb7205942d56e876d3
+bf340fdd04b566609e79c9848e0168e486db5d57149b3280cba72b3406153236
+b7a28d20f308c43a95299545f27ea902f484d7ef76de5dce8d07a5d43b48d40d
+3de3b9062debfa016cf35b329bbf9117411197aa294d99144ef52364bbef0096
+9c9fae72201f827cf41845be0bf8afae8348f559d6ad28e028e84a58025b1f47
+e53e0b124a48cb687fec13bc7e4b248254896cbe4e014a9beeba38f5a48c21ec
+09333bf65b6d8554c6980f2f85f93a98044f77c9ef13c7414e70d18e2984ff74
+48028cde5d94c034f4f8863948e55fb6a1424799fb170cf7f7c68dfb46e31cf2
+993b95c3dd77a330b5b24cd3a8ce673919ed06056ad485aa57fd7e10f06eb24d
+ecb7040afa07c7581feac213fbea06e94be53ffa08384521cc92ecd90d53471f
+ea922d0027d864988eef25619eab1340719657bd58bc53d145e742bd90605586
+02238917e270ff6b92a343f440e91d043f839fd716ebf582a3d80351cadc60b7
+33e50fa695ea1ab37072edfd43571c36769b6559680f45b2f405589f1513c637
+efa4ef95a80220fe72248fe394ff0e9cc2ad41e8c5d2d214e8bf0c3e924cbf63
+71e84540487c1d89f3910c2d2af308222559dabf07bd914abc6b9f012d4c70bf
+bf0b66ea8f369480927308b2b729247adbd9a6bd66517a4859fabd2c48903eb2
+9eac610ada000a7d6d9caac5234d5f579f25f6f6c8b0d9fb1b359eb83e522342
+7536940f5bd9fb3f8086075cafaa40cda782878dcd1076b0d3514f2eeb8c2fd4
+3f2c55668185aa03631141554c39c1b593ccd10c045215c334aa21432f7b87cf
+c3379e3a613355debab6116d53bf50d681063ea6a439f193e4f1dd4f52f79095
+71cd4f5b063685528c3842b0c5aeefecb4b82888b0702b8643f60a51a6ed3190
+6f0aae5f86d4fb8342a5f062f69b935148e81c557c4e1b77f5441cda5d64f960
+82dd5c44fa3993d3bd1d10c217ea56b73b3bee1bba6501b5d4ac153cd1ff098f
+42ba7fdb90c16c7f2ab7bfa39e4cbd884d4994a7ec9407f5280fe5690cc03763
+d050ed7c5513b0e7960d957e19837fd227b352ef0116cf0ec79c14ff5afd4dea
+e3a5330bc8a57e29ae4c4fbfc64d85b6442f844f2fd7d0b9789d902a8634ac0e
+223841d87218c21f110ecd864bed08172cd2ffce0795af5937ee7475ce269618
+c727b596c3c119e92e2623176c2a4c686c87ae283e6f3b63483ad8a2aeb5805c
+2d43a1c7eb4f03d3849619eb4d84fef013c5b4bf8cca17d75bf952b2759825cc
+4836dd015b037c08031775b8a3004f409fb6f7b0164faf03accd9da7833a213f
+9f08dfc29694e52aaa56e56f82678a4327eb6ca34eb5a6a8b1c5cce403da3b3f
+75110f5fb3a4f452bb1eb3476551dce81b58c71a40d7aed32a610fe049571574
+3c9519ad6a1824b3c26b5f595cade6f1edafb2f2b0b4d2adf82aef35640e731b
+90c4f19a0999b940d7b30e13b1118fd1a2803c9ed4d2b1f245e01c1f36626e38
+19e7dcba9450a2be1f6ea11be2f6896603072adbcd36fff8986eb0a40b5f6822
+b1877c6951f86ebeafe1c5725c894669ff44c8baa2fc54f78ff9d34a41ea24e7
+a2acb665959298984c7d293b34ff96e72458ec8813c0142f72dd544a34124182
+69a5d5920294d27652fb28885860f09618562cdb8261fbd05a8ce52e360efb5e
+0ecf810ffba9bde380b680e4c83727f93da2d651734760a892395c9d3e4b8ec7
+b654d317d67f016b4990cfb9b7335aafb1b259a7b19dc09bc75c5cf204e6802e
+ac46a0352a8472ee26110dfdbbe911de9b74149c5f5242d3cb253c36a84cc837
+d76b2ba0de0d5f9309712901fd044f3aab455eb7d85772d6243a891f19ad2393
+8fc52c0aea6475a5c8bd0998ad8896a1b03dae0e909e1d1ed4364a9cce538499
+30d83cbd6e93f7b7ffc1358e23d31c8657ad589ae660c3c5c5827a77db585df2
+fff4cc6c35511abc86943245de79556111871679f33d6ad71ffbf5c9832bb409
+035d601cac8f4eb2f16f8765614227c71c390c313efab6f107f10f868f5484ea
+21898dc1de852e6bd0984ad73f4e47f96b61ba0f88e99544e109918ab0bdca93
+1d77a978c4da25a1ccecad509c077c58f78173615c900af9fdda92fffcf7b2d6
+744c0f0a489fca954a0c135d6646b9ae2acffb374247724a3901fd546d465b4a
+4944957efbeaff9e13e90690a80df614f24e9d390ef78669c5e6573a80a22d36
+d08f90a965c7707608d027b4fb3b467d688aa11ffb6f594d326d48e679190a0f
+ae0eb69a8b45912e16bf834da5b13327538d51a4bad1812a8116e602c7fa4a91
+54690e3f2ed8bd1af09ac4e8a0bd65c5d2cc5f0e4927b5d413a21080dcfdfed0
+80f13e5f04e0230ea11d6366af685f88d99f32705ffb5c319091904c06c3006f
+857ef419616a0d2e3d646143431c318824fdeede269c08ea3961649c0309cf1e
+532885a495990a9b384b9a9f3542c8532923e209e8f48a84a163cfec2ce14395
+6a8ecac7d4e624353575e13d49dd5af366220d2b6fc2a5fc5b4deecafd111614
+267b7a44683d07e37fe59f2d9928889665258b1f0deee59a79bbf8a64d1c43a6
+e632208bbbbe8fbca23f602f13b2f4140a0a7de0827fa4cf2e4bf7b7687f1681
+d103d7dfc415017c2e5851a1124872141881665d08232c5a14a7ef671899b059
+7c5aa584aa00411d4359b3ac5e1a129d34e4e1db2aded1742638e8d15a5b5960
+f824bd17a8455f537a947b9726cbdf96e91804815203bed8972a2e4b94bdb2fc
+07702e19f4192fc29ad6067c60d1cc7ab83fec19c5abd83bed157b1ac50f9b0a
+3df60af84e3c2f621c38c0caea89b224966e6b589895a6c7494a19f5a5ca6af7
+f917dd620663602af7f1b3230e5a39c9141e775c84f5f08df1178337c108
+60a87afe63e91469dc77bfb5ceb75a3d6d2918ed8ba0d26d2d81fb0531381f88
+00fc7abc5436137cb6ecf062228cb9eabed14de2329ccbde222b4c31ffec8df0
+ff65223efcdc28f428501de2740a781e2fab047819d47cc58d026d6d6cab0a90
+a6891cc6a139cebfdd92309966a5ff87059721a58539efa64ebe9014bee383bc
+b284120d2ed537344e37f91b322cbe72e847bdf0d0a61bb7f92268f4b0486e93
+2c0fcf6c832eba5b2cf6fbf217e907c79db9cf3744eb03feba08935fe0779d10
+b81170d73b4afd4adb5445a882910d626241291fdc1348552670790dd6ee29fe
+acb73088df117bea075ecb22b06726d0af899b2d00bea13339cd87980e868d34
+5c0543c256401430119ac825f0d5049dfa74a19f38bb8d85eb581eba032c3efb
+399326e705dc06ff7aa54ad78c84c0800d3bd58f5d44f0b16c88afa1a33f9a3d
+8c9de68e908fc73316c4cf81249af3dda3a22bfc8e3ff2bb720559bd94414751
+83c822192f9f9d3abf46bf63c8cfc8e9f747ce7492ba1d2324498e5e610a40e7
+17323278ef04e4e8bd3c0d0ea5f7795acb2b9e64cbe329398e0b4b87185e84a0
+dc0dd2c55218ba6e3f822ee0c8e046fa39b89cba2a11a006aa062613d6655cdc
+1c1013abe465f12966efc18ef370ed03556776c935e852185d3a41912feb4ded
+8ebc133a7d0d6405f1e03f6dde38addc00268818b1ca06d65396cbe1331b5050
+5f773eecd0a1823142fb4bee4321589fb95f034428d652481bd9cad556fdd12a
+b549ae12560af2619ed622144eb55301f23ab090ad52ba1f361aeb8da3a48191
+0a48a8b7df5e291421c2541984b98d3c179841e3831ec735c87bfa0ecf701f13
+cf95afeee0ce2dece4d1e7dbf13c67f722bbb3ff9755d3f78a9c2d4114a9f455
+e1958a5819180151b23ea80964e0c523c393a66d13d6c5411fa154630881f8da
+d054b1929cfa5f5acca7b3a562e7562dfeec3fa3dc6672bd90cd1c0eedb3457e
+b981ca85f9765ad3bb7234766520142f16f17126fbbe519b4f8ded215af4993e
+02d198737add47e54e338735fe12ea3682833f7726856b39c56dfc6f7de1e906
+e466137be9d7e59d443c692249430bfc9d970698a4702ec9f9886ae0bbe9a3b7
+14fe7c36cf7f97cd8e915d11a05ce18afd61323a310a92bcc88468cf05e784e1
+c49bea443b4c32274e5102564ee5865cf25db5a6f56c373ea119e89cf92c7cfe
+8ab52c53341dc1d10d18f3d2433b0541c3fe83f3200173a57b3d2065e6f35ffa
+7ca251ec8169abec83116100d77604270d2c9849bd9c7f9b18685e7a2ccc0138
+403f02f9c90fde07b9f21bb5e53993133164571822967313f6499c0f4e3bca11
+0bf1f1b9eda0d0492a39f2a819a7311c8ad4b1c2a77b4f452f4e7a72c491c846
+8f80522afb2cc3d009a8b51775d7778ba082a471a4997a138c76b969c03938c2
+42e459ce7f8a1dade750e43178d7aa03ae4a0313720ace32871fe1e505a0fa19
+c9ed656f63ae46b6d5078a6395348fa3af0587d4e1f7ab4d8e541341bf7a7a78
+5f00305eaa9ca7ff767e09072e4b9ff642262d01acfe1a26e65fd9b56ad8f1fa
+ad5f54016b3279395647a55933d4fe48aac8e930688a25647c65cb96d86e0f8f
+4703fafe0d904ede9e0acb8ae513fdee8b7afeed197cd0a7c1ed5124847302c2
+845cc54c6daa5117ecf5312e9c3e8c7f5becb922c87d3317b0a8e817b0043121
+7a68f6497c7c8d59aff22d1a8ab4b83496f18ec50d05910ffd535542dec3a99c
+16f1db21836a7423bf21dd9f92c466f0feb825390201e5b31ef93b13fa2c8758
+e38f0574a31077b844e28b3762d2a5b1d18ecff1ffa7ffd715a538327f90c291
+cd5df9ccde6d0bf2d4f96c2128e4e90ec114e8c203e4e718e4f82b6c2ecf8d7e
+aed62367a9d7b32e616dfcd4813b114bbb6f386458803a3b0cca19c5630d6395
+38927f61d836c0bb1fa3280125c40d60a177873de8e8b1eb72956e11f1fbb379
+28106237b620da015a1094e59c236eedb62e426bb405b4722d209f3697b5b193
+314b314b744016909d590f37b91ae979612411044710832489fbe9a61ac10f7a
+8d02fe6fb107185cc1d3e474d0a784b8c8012068dcc6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndResource
+[ 0 /.notdef/dotaccent/fi/fl/fraction/hungarumlaut
+/Lslash/lslash/ogonek/ring/.notdef/breve
+/minus/.notdef/Zcaron/zcaron/caron/dotlessi
+/dotlessj/ff/ffi/ffl/.notdef 30 /grave
+/quotesingle/space/exclam/quotedbl/numbersign/dollar
+/percent/ampersand/quoteright/parenleft/parenright/asterisk
+/plus/comma/hyphen/period/slash/zero
+/one/two/three/four/five/six
+/seven/eight/nine/colon/semicolon/less
+/equal/greater/question/at/A/B
+/C/D/E/F/G/H
+/I/J/K/L/M/N
+/O/P/Q/R/S/T
+/U/V/W/X/Y/Z
+/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft
+/a/b/c/d/e/f
+/g/h/i/j/k/l
+/m/n/o/p/q/r
+/s/t/u/v/w/x
+/y/z/braceleft/bar/braceright/asciitilde
+/.notdef/.notdef/.notdef/quotesinglbase/florin/quotedblbase
+/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron
+/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash
+/emdash/tilde/trademark/scaron/guilsinglright/oe
+/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent
+/sterling/currency/yen/brokenbar/section/dieresis
+/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered
+/macron/degree/plusminus/twosuperior/threesuperior/acute
+/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine
+/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave
+/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE
+/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave
+/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve
+/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash
+/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn
+/germandbls/agrave/aacute/acircumflex/atilde/adieresis
+/aring/ae/ccedilla/egrave/eacute/ecircumflex
+/edieresis/igrave/iacute/icircumflex/idieresis/eth
+/ntilde/ograve/oacute/ocircumflex/otilde/odieresis
+/divide/oslash/ugrave/uacute/ucircumflex/udieresis
+/yacute/thorn/ydieresis
+/N71/PASPAO+URWPalladioL-Roma -1 TZ
+%%EndPageSetup
+0 0 609.71398 789.04098 RC
+1 0 0 1 71.73098 729.26499 cm
+
+0 g
+0 G
+1 0 0 1 466.25199 0 cm
+
+0 g
+0 G
+1 0 0 1 -466.25199 -28.25799 cm
+
+BT
+/N71 23.90998 Tf
+0 0 Td
+(OpenJade)Tj [-250 ]TJ (Pr)Tj [18 ]TJ (oject)Tj 
+/N74 23.90998 Tf
+0 -29.99499 Td
+(Release)Tj [-250 ]TJ (Notes)Tj 
+ET
+1 0 0 1 0 -43.22099 cm
+
+q
+[]0 d
+0 J
+0.99598 w
+0 0.49798 m
+466.25199 0.49798 l
+S 
+Q
+1 0 0 1 0 -33.88299 cm
+
+BT
+/N74 35.86599 Tf
+0 0 Td
+(OpenJade)Tj [-250 ]TJ (1.3.2)Tj 
+ET
+1 0 0 1 0 -575.08599 cm
+
+0 g
+0 G
+1 0 0 1 409.13198 0 cm
+
+q
+1 0 0 1 0 0 cm
+
+q
+1 0 0 1 0 0 cm
+
+q
+57.11999 0 0 13.43998 0 0 cm
+
+_op? setoverprint
+BI
+/Width 119
+/Height 28
+/Filter [/ASCII85Decode /LZWDecode ]
+/BitsPerComponent 8
+/Decode [0 1 0 1 0 1]
+/ColorSpace DefaultRGB 
+ID
+J3Vsg3$]7K#D>EP:q1$o*=mro@So+\<\5,H7Uo<*jE<[.O@Wn[3@'nb-^757;Rp>H
+>q_R=AlC^cenm@9:1mM9K8+be?n_QeP<rl6"/@P!0ZF7lP=_EE-o@@`L*'6bd:u>^
+NBX7IVU(pbg>rO\@YEBLZl;D2X%'5E,$(^D-Gp8$el+#d)5;mS^!pri)`7]?>IDn\
+(MdjX%8"=lDtoifmfrfm3,;Y8-?B'3b1)V/R]_!3T[)gYqC"7Bq5I'<@+?8]N[^(B
+?ZQ!6(=r@UKQ"=^1IZ&\$KL>q>YOg+*<i\<omA5@*X0(<o/0e0ZkIG_m.bb:%)i%B
+c@YFu0jSsXAIIu!]mUDMCL?#nd6/%iO5$JV4Gi)jmD+\pe>4:*U_NsEkPJrp^[P^d
+pqFnOqXD9KF9_Y#%C;/?6#C'<lnWA1]V.Y$K$;960ao8$0r`ncq^aGU6K:HF.^[iq
+%k?*>Zn%:I#Iq#ofUj]M8uifFd7cO5S1?Emn@*(Q8C]E8@c7mA0;P?=amiO<)9M4@
+%'`FkZtgs\o4sqI_X4BW)`A5^CG7Ru,gtL1YY7qO4cf2BX?Q)o0SrJd%/PS$NEdOo
+9<[ENn[l/D4G;*6KGul!$<-O.+HqaFq:%4>#4BKOUY`=A1+ZieaRn0hrm7rkUJ.m'
+nfi&'X8QR\0[l2S)m=AMb,IspHSU0%<N:Tq8i+)?:,kt,R:`Ylao;]*F=!r<dIsYK
+(.Aja_Ym"?4F4k.Y8)qJ;U\PZEj)XG''`Y=9UqnIZk\Vj:%01Z>srf,$Sb`rFC)`@
+&Td>;>S&,]<ae]sT4tV_A=%aOQW;.,cR[Pj"AtF?merf"V'1')[QXoXjb`*'^uU;7
+n@%12c)X`T2\]8^.aO9CT"'_s6(10p47==sGOAgf@Lg*K-eh\`ZL6[rX/gBJeYI,P
+fp+E8R+?ST6X%,<ebNi5CfR02@2fZ#iQY'?\X$f1\sj]$cu+8u2;4'oe)L7iPmQg+
+X"Cf^M`(+/h6!hY1!f`Ua+HtKWtSjqNg-PucY=g*FLs>0_iE`"LJ\]%gU-tJ/!8Du
+hSQ:9SP!:YDc_3_OOf&>YVZ8UI;PGt-YfoLP,ZLmRmQu)oSiApMF3ig1N(Tf)i<\1
+H5=&cE"^3NE+%&5*T^<bmM"UX0*a^mFpP.4fD76]^ThpOmccN<]:[f!S9sjLYOS))
+;on_GH8p2,q>ZsR,5R`Q")UZT8[*<27NT0kBn_\d/Z*-"?HWq+a4_%a'KW[laae^j
+Kn6"N)Kf3SV1NH%+2(aOP7&?W4:Z@:^PD$\La4DY&FfucL$J$G3l-K2KRjmbcOf#>
+$rK`=kWZlf%L?4*K.6dD5,RD*U;7C4EJ09?36`;i4BXHpOPUQoNu=RQbDIPd3'67\
+80^6B=`JaO8(db^j91$q;@Z#a=UcP87#@%(/k/Cb*@'WuOciU;8kDoG5X5~>
+EI
+
+Q
+Q
+Q
+1 0 0 1 57.11999 0 cm
+
+0 g
+0 G
+PDFVars/TermAll get exec end end
+userdict /pgsave get restore
+showpage
+%%PageTrailer
+%%EndPage
+%%Page: 2 2
+%%BeginPageSetup
+userdict /pgsave save put
+PDFVars begin PDF begin PDFVars/InitAll get exec
+1.14301 1.47949 translate
+%%EndPageSetup
+0 0 609.71398 789.04098 RC
+1 0 0 1 71.73098 729.26499 cm
+
+0 g
+0 G
+1 0 0 1 466.25199 0 cm
+
+0 g
+0 G
+1 0 0 1 -466.25199 -20.92098 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(Cop)Tj [10 ]TJ (yright)Tj [-250 ]TJ (\251)Tj [-250 ]TJ (2002)Tj [-250 ]TJ (by)Tj [-250 ]TJ (OpenJade)Tj [-249 ]TJ (Project)Tj 
+0 -12.95199 Td
+(Release)Tj [-250 ]TJ (1.3.2)Tj [-250 ]TJ (Edition)Tj 
+0 -12.95098 Td
+(Published)Tj [-250 ]TJ (December)Tj [-250 ]TJ (2002)Tj 
+ET
+1 0 0 1 0 -659.52699 cm
+
+0 g
+0 G
+1 0 0 1 466.25199 0 cm
+
+0 g
+0 G
+PDFVars/TermAll get exec end end
+userdict /pgsave get restore
+showpage
+%%PageTrailer
+%%EndPage
+%%Page: 3 3
+%%BeginPageSetup
+userdict /pgsave save put
+PDFVars begin PDF begin PDFVars/InitAll get exec
+1.14301 1.47949 translate
+%%EndPageSetup
+0 0 609.71398 789.04098 RC
+save
+1 0 0 1 71.73098 729.26499 cm
+
+0 g
+0 G
+1 0 0 1 466.25199 0 cm
+
+0 g
+0 G
+1 0 0 1 -466.25199 -21.59899 cm
+
+BT
+/N87 14.58599 Tf
+0 0 Td
+(T)Tj [80 ]TJ (ab)Tj [10 ]TJ (le)Tj [-278 ]TJ (of)Tj [-278 ]TJ (Contents)Tj 
+/N90 9.96299 Tf
+47.82099 -20.24499 Td
+(OpenJ)Tj [15 ]TJ (ade)Tj [-250 ]TJ (1.3.2)Tj [-250 ]TJ (Release)Tj [-250 ]TJ (Not)Tj [1 ]TJ (es)Tj 
+ET
+1 0 0 1 174.34599 -20.24499 cm
+
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N90 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+1 0 0 1 0.49798 0 cm
+
+BT
+/N90 9.96299 Tf
+0 0 Td
+(1)Tj 
+/N81 9.96299 Tf
+-389.53898 -15.34298 Td
+(Applications)Tj [-250 ]TJ (of)Tj [-250 ]TJ (OpenJade)Tj 
+ET
+1 0 0 1 -284.43299 -15.34298 cm
+
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+1 0 0 1 0.49798 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(1)Tj 
+-389.53898 -12.95098 Td
+(Obtaining)Tj [-250 ]TJ (OpenJade)Tj 
+ET
+1 0 0 1 -306.84899 -12.95098 cm
+
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+1 0 0 1 0.49798 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(1)Tj 
+-389.53898 -12.95199 Td
+(Supported)Tj [-250 ]TJ (Platforms)Tj 
+ET
+1 0 0 1 -306.84899 -12.95199 cm
+
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+1 0 0 1 0.49798 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(1)Tj 
+-389.53898 -12.95098 Td
+(Building)Tj [-250 ]TJ (OpenJade)Tj [-250 ]TJ (from)Tj [-250 ]TJ (Sou)Tj [1 ]TJ (rce)Tj 
+ET
+1 0 0 1 -259.52699 -12.95098 cm
+
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+1 0 0 1 0.49798 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(2)Tj 
+-389.53898 -12.95199 Td
+(Binary)Tj [-250 ]TJ (Distrib)Tj [20 ]TJ (utions)Tj 
+ET
+1 0 0 1 -306.84899 -12.95199 cm
+
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+1 0 0 1 0.49798 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(3)Tj 
+-389.53898 -12.95098 Td
+(Installation)Tj 
+ET
+1 0 0 1 -344.20899 -12.95098 cm
+
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+1 0 0 1 0.49798 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(3)Tj 
+-389.53898 -12.95098 Td
+(Support)Tj 
+ET
+1 0 0 1 -356.66299 -12.95098 cm
+
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+1 0 0 1 0.49798 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(4)Tj 
+-389.53898 -12.95199 Td
+(V)Tj [111 ]TJ (ersion)Tj [-250 ]TJ (1.3.2)Tj 
+ET
+1 0 0 1 -334.24699 -12.95199 cm
+
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+1 0 0 1 0.49798 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(4)Tj 
+-389.53898 -12.95098 Td
+(V)Tj [111 ]TJ (ersion)Tj [-250 ]TJ (1.3.1)Tj 
+ET
+1 0 0 1 -334.24699 -12.95098 cm
+
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+1 0 0 1 0.49798 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(5)Tj 
+-389.53898 -12.95199 Td
+(V)Tj [111 ]TJ (ersion)Tj [-250 ]TJ (1.3)Tj 
+ET
+1 0 0 1 -341.71899 -12.95199 cm
+
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+1 0 0 1 0.49798 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(10)Tj 
+-384.55799 -12.95098 Td
+(V)Tj [111 ]TJ (ersion)Tj [-250 ]TJ (1.2.2)Tj 
+ET
+1 0 0 1 -329.26599 -12.95098 cm
+
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+1 0 0 1 0.49798 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(11)Tj 
+-384.55799 -12.95199 Td
+(Jade)Tj [-250 ]TJ (V)Tj [111 ]TJ (ersion)Tj [-250 ]TJ (1.2.1)Tj 
+ET
+1 0 0 1 -309.33999 -12.95199 cm
+
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+1 0 0 1 0.49798 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(11)Tj 
+ET
+1 0 0 1 -456.28898 -480.79499 cm
+
+0 g
+0 G
+1 0 0 1 457.94299 0 cm
+
+BT
+/N117 9.96299 Tf
+0 0 Td
+(iii)Tj 
+ET
+1 0 0 1 8.30799 0 cm
+
+0 g
+0 G
+restore
+PDFVars/TermAll get exec end end
+userdict /pgsave get restore
+showpage
+%%PageTrailer
+%%EndPage
+%%Page: 4 4
+%%BeginPageSetup
+userdict /pgsave save put
+PDFVars begin PDF begin PDFVars/InitAll get exec
+1.14301 1.47949 translate
+%%EndPageSetup
+0 0 609.71398 789.04098 RC
+1 0 0 1 71.73098 729.26499 cm
+
+0 g
+0 G
+1 0 0 1 466.25199 0 cm
+
+0 g
+0 G
+1 0 0 1 -466.25199 -680.44799 cm
+
+0 g
+0 G
+BT
+/N117 9.96299 Tf
+0 0 Td
+(iv)Tj 
+ET
+1 0 0 1 466.25199 0 cm
+
+0 g
+0 G
+PDFVars/TermAll get exec end end
+userdict /pgsave get restore
+showpage
+%%PageTrailer
+%%EndPage
+%%Page: 5 5
+%%BeginPageSetup
+userdict /pgsave save put
+PDFVars begin PDF begin PDFVars/InitAll get exec
+1.14301 1.47949 translate
+%%EndPageSetup
+0 0 609.71398 789.04098 RC
+save
+1 0 0 1 71.73098 729.26499 cm
+
+0 g
+0 G
+1 0 0 1 466.25199 0 cm
+
+0 g
+0 G
+1 0 0 1 -466.25199 -21.59899 cm
+
+BT
+/N87 14.58599 Tf
+0 0 Td
+(List)Tj [-278 ]TJ (of)Tj [-278 ]TJ (T)Tj [80 ]TJ (ab)Tj [10 ]TJ (les)Tj 
+/N81 9.96299 Tf
+47.82099 -20.24499 Td
+(1.)Tj [-250 ]TJ (Platforms)Tj [-250 ]TJ (on)Tj [-250 ]TJ (which)Tj [-250 ]TJ (OpenJ)Tj [1 ]TJ (ade)Tj [-250 ]TJ (1.3.2)Tj [-250 ]TJ (is)Tj [-250 ]TJ (kno)Tj [25 ]TJ (wn)Tj [-250 ]TJ (to)Tj [-250 ]TJ (b)Tj [20 ]TJ (uild.)Tj 
+ET
+1 0 0 1 276.46299 -20.24499 cm
+
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+1 0 0 1 0.49798 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(1)Tj 
+-413.44898 -12.95199 Td
+(2.)Tj [-250 ]TJ (OpenJade)Tj [-250 ]TJ (speci\002c)Tj [-250 ]TJ (con\002gu)Tj [1 ]TJ (re)Tj [-250 ]TJ (options)Tj 
+ET
+1 0 0 1 -257.03599 -12.95199 cm
+
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+1 0 0 1 0.49798 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(3)Tj 
+-413.44898 -12.95098 Td
+(3.)Tj [-250 ]TJ (Changes)Tj [-250 ]TJ (for)Tj [-250 ]TJ (release)Tj [-250 ]TJ (1.3.2)Tj 
+ET
+1 0 0 1 -301.86799 -12.95098 cm
+
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+1 0 0 1 0.49798 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(4)Tj 
+-413.44898 -12.95199 Td
+(4.)Tj [-250 ]TJ (Changes)Tj [-250 ]TJ (for)Tj [-250 ]TJ (release)Tj [-250 ]TJ (1.3.1)Tj 
+ET
+1 0 0 1 -301.86799 -12.95199 cm
+
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.48999 0 cm
+
+0 g
+0 G
+0 g
+0 G
+BT
+/N81 9.96299 Tf
+0 0 Td
+(.)Tj 
+ET
+1 0 0 1 2.49099 0 cm
+
+0 g
+0 G
+1 0 0 1 0.49798 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(5)Tj 
+ET
+1 0 0 1 -461.26998 -599.74899 cm
+
+0 g
+0 G
+1 0 0 1 461.82798 0 cm
+
+BT
+/N117 9.96299 Tf
+0 0 Td
+(v)Tj 
+ET
+1 0 0 1 4.42298 0 cm
+
+0 g
+0 G
+restore
+PDFVars/TermAll get exec end end
+userdict /pgsave get restore
+showpage
+%%PageTrailer
+%%EndPage
+%%Page: 6 6
+%%BeginPageSetup
+userdict /pgsave save put
+PDFVars begin PDF begin PDFVars/InitAll get exec
+1.14301 1.47949 translate
+%%EndPageSetup
+0 0 609.71398 789.04098 RC
+1 0 0 1 71.73098 729.26499 cm
+
+0 g
+0 G
+1 0 0 1 466.25199 0 cm
+
+0 g
+0 G
+1 0 0 1 -466.25199 -680.44799 cm
+
+0 g
+0 G
+BT
+/N117 9.96299 Tf
+0 0 Td
+(vi)Tj 
+ET
+1 0 0 1 466.25199 0 cm
+
+0 g
+0 G
+PDFVars/TermAll get exec end end
+userdict /pgsave get restore
+showpage
+%%PageTrailer
+%%EndPage
+%%Page: 7 7
+%%BeginPageSetup
+userdict /pgsave save put
+PDFVars begin PDF begin PDFVars/InitAll get exec
+1.14301 1.47949 translate
+%%EndPageSetup
+0 0 609.71398 789.04098 RC
+1 0 0 1 71.73098 729.26499 cm
+
+0 g
+0 G
+1 0 0 1 466.25199 0 cm
+
+0 g
+0 G
+1 0 0 1 -466.25199 -21.59899 cm
+
+BT
+/N87 14.58599 Tf
+0 0 Td
+(OpenJade)Tj [-278 ]TJ (1.3.2)Tj [-278 ]TJ (Release)Tj [-278 ]TJ (Notes)Tj 
+/N81 9.96299 Tf
+47.82099 -25.21798 Td
+(OpenJade)Tj [-250 ]TJ (is)Tj [-250 ]TJ (a)Tj [-250 ]TJ (suite)Tj [-250 ]TJ (of)Tj [-250 ]TJ (tool)Tj [1 ]TJ (s)Tj [-250 ]TJ (for)Tj [-250 ]TJ (v)Tj [25 ]TJ (alidating,)Tj [-250 ]TJ (processing)Tj [-250 ]TJ (and)Tj [-250 ]TJ (applying)Tj [-250 ]TJ (DSSSL)Tj [-250 ]TJ (\(Docume)Tj [1 ]TJ (nt)Tj [-250 ]TJ (Style)Tj [-250 ]TJ (Semantics)Tj 
+0 -12.95098 Td
+(and)Tj [-250 ]TJ (Speci\002cation)Tj [-250 ]TJ (Language)Tj [1 ]TJ (\))Tj [-250 ]TJ (style)Tj [-250 ]TJ (sheets)Tj [-250 ]TJ (to)Tj [-250 ]TJ (SGML)Tj [-250 ]TJ (and)Tj [-250 ]TJ (XML)Tj [-250 ]TJ (documents.)Tj 
+0 -17.93299 Td
+(OpenJade)Tj [-250 ]TJ (is)Tj [-250 ]TJ (a)Tj [-250 ]TJ (project)Tj [-250 ]TJ (under)Tj [1 ]TJ (tak)Tj [10 ]TJ (en)Tj [-250 ]TJ (by)Tj [-250 ]TJ (the)Tj [-250 ]TJ (DSSSL)Tj [-250 ]TJ (community)Tj [-250 ]TJ (to)Tj [-250 ]TJ (maintain)Tj [-250 ]TJ (and)Tj [-250 ]TJ (e)Tj [15 ]TJ (xtend)Tj [-250 ]TJ (Ja)Tj [1 ]TJ (mes)Tj [-250 ]TJ (Clark')Tj [55 ]TJ (s)Tj [-250 ]TJ (Jade,)Tj 
+0 -12.95098 Td
+(as)Tj [-250 ]TJ (well)Tj [-250 ]TJ (as)Tj [-250 ]TJ (the)Tj [-250 ]TJ (related)Tj [-250 ]TJ (SP)Tj [-250 ]TJ (s)Tj [1 ]TJ (uite)Tj [-250 ]TJ (of)Tj [-250 ]TJ (SGML/XML)Tj [-250 ]TJ (processing)Tj [-250 ]TJ (tools.)Tj [-250 ]TJ (OpenJade)Tj [-250 ]TJ (and)Tj [-250 ]TJ (Open)Tj [1 ]TJ (SP)Tj [-250 ]TJ (are)Tj [-250 ]TJ (distrib)Tj [20 ]TJ (uted)Tj 
+0 -12.95199 Td
+(under)Tj [-250 ]TJ (the)Tj [-250 ]TJ (same)Tj [-250 ]TJ (license)Tj [-250 ]TJ (as)Tj [-249 ]TJ (Jade.)Tj 
+/N87 12.05499 Tf
+-47.82099 -34.67498 Td
+(Applications)Tj [-278 ]TJ (of)Tj [-278 ]TJ (OpenJade)Tj 
+/N81 9.96299 Tf
+47.82099 -18.97898 Td
+(Man)Tj [15 ]TJ (y)Tj [-250 ]TJ (dif)Tj [25 ]TJ (ferent)Tj [-250 ]TJ (projects,)Tj [-250 ]TJ (or)Tj [18 ]TJ (g)Tj [5 ]TJ (a)Tj [1 ]TJ (nizations)Tj [-250 ]TJ (and)Tj [-250 ]TJ (companies)Tj [-250 ]TJ (mak)Tj [10 ]TJ (e)Tj [-250 ]TJ (use)Tj [-250 ]TJ (of)Tj [-250 ]TJ (OpenJade)Tj [-250 ]TJ (to)Tj [-250 ]TJ (publis)Tj [1 ]TJ (h)Tj [-250 ]TJ (documentation.)Tj 
+0 -12.95098 Td
+(The)Tj [-250 ]TJ (SGML/XML)Tj [-250 ]TJ (back)Tj [10 ]TJ (end)Tj [-250 ]TJ (en)Tj [1 ]TJ (ables)Tj [-250 ]TJ (the)Tj [-250 ]TJ (generation)Tj [-250 ]TJ (of)Tj [-250 ]TJ ("w)Tj [10 ]TJ (orld)Tj [-250 ]TJ (wide)Tj [-250 ]TJ (web)Tj [-250 ]TJ (ready")Tj [-250 ]TJ (documents)Tj [-249 ]TJ (while)Tj [-250 ]TJ (the)Tj [-250 ]TJ (T)Tj [70 ]TJ (eX)Tj 
+0 -12.95098 Td
+(back)Tj [10 ]TJ (end)Tj [-250 ]TJ (allo)Tj [25 ]TJ (ws)Tj [-250 ]TJ (high)Tj [-250 ]TJ (quality)Tj [-249 ]TJ ("ready)Tj [-250 ]TJ (for)Tj [-250 ]TJ (press")Tj [-250 ]TJ (output)Tj [-250 ]TJ (to)Tj [-250 ]TJ (be)Tj [-250 ]TJ (obtained.)Tj [-250 ]TJ (The)Tj [-250 ]TJ (FreeBSD)Tj [-250 ]TJ (Han)Tj [1 ]TJ (dbook)Tj [-250 ]TJ (\(second)Tj 
+0 -12.95199 Td
+(edition\))Tj [-250 ]TJ (ISBN:)Tj [-250 ]TJ (1571763031)Tj [-250 ]TJ (i)Tj [1 ]TJ (s)Tj [-250 ]TJ (one)Tj [-250 ]TJ (such)Tj [-250 ]TJ (e)Tj [15 ]TJ (xample)Tj [-250 ]TJ (of)Tj [-250 ]TJ (a)Tj [-250 ]TJ (book)Tj [-250 ]TJ (created)Tj [-250 ]TJ (using)Tj [-250 ]TJ (OpenJade.)Tj 
+/N87 12.05499 Tf
+-47.82099 -40.57798 Td
+(Obtaining)Tj [-278 ]TJ (OpenJade)Tj 
+/N81 9.96299 Tf
+47.82099 -18.97898 Td
+(OpenJade)Tj [-250 ]TJ (is)Tj [-250 ]TJ (a)Tj [-250 ]TJ (project)Tj [-250 ]TJ (hoste)Tj [1 ]TJ (d)Tj [-250 ]TJ (at)Tj [-250 ]TJ (sourcefor)Tj [18 ]TJ (ge.net)Tj [-250 ]TJ (and)Tj [-250 ]TJ (is)Tj [-250 ]TJ (a)Tj [20 ]TJ (v)Tj [25 ]TJ (ailable)Tj [-250 ]TJ (from)Tj [-250 ]TJ (the)Tj [-250 ]TJ (OpenJade)Tj [-250 ]TJ (w)Tj [1 ]TJ (eb)Tj [-250 ]TJ (site)Tj [-250 ]TJ (at)Tj 
+0 -12.95098 Td
+(http://openjade.sourcefor)Tj [18 ]TJ (ge)Tj [1 ]TJ (.net)Tj [-250 ]TJ (or)Tj [-250 ]TJ (directly)Tj [-250 ]TJ (from)Tj [-250 ]TJ (the)Tj [-250 ]TJ (OpenJade)Tj [-250 ]TJ (project)Tj [-250 ]TJ (page)Tj [-250 ]TJ (at)Tj 
+0 -12.95098 Td
+(http://sourcefor)Tj [18 ]TJ (ge.net/proj)Tj [1 ]TJ (ects/openjade)Tj 
+0 -17.93299 Td
+(OpenJade)Tj [-250 ]TJ (is)Tj [-250 ]TJ (pro)Tj [15 ]TJ (vided)Tj [-250 ]TJ (in)Tj [-250 ]TJ (sour)Tj [1 ]TJ (ce)Tj [-250 ]TJ (code)Tj [-250 ]TJ (form.)Tj [-250 ]TJ (Ho)Tj [25 ]TJ (we)Tj [25 ]TJ (v)Tj [15 ]TJ (er)Tj [-250 ]TJ (as)Tj [-250 ]TJ (a)Tj [-250 ]TJ (courtesy)Tj [-250 ]TJ (to)Tj [-250 ]TJ (W)Tj [40 ]TJ (in32)Tj [-250 ]TJ (users)Tj [-250 ]TJ (where)Tj [-249 ]TJ (de)Tj [25 ]TJ (v)Tj [15 ]TJ (elopment)Tj 
+0 -12.95199 Td
+(tools)Tj [-250 ]TJ (are)Tj [-250 ]TJ (not)Tj [-250 ]TJ (al)Tj [10 ]TJ (w)Tj [10 ]TJ (ays)Tj [-250 ]TJ (a)Tj [20 ]TJ (v)Tj [25 ]TJ (aila)Tj [1 ]TJ (ble,)Tj [-250 ]TJ (a)Tj [-250 ]TJ (binary)Tj [-250 ]TJ (release)Tj [-250 ]TJ (for)Tj [-250 ]TJ (the)Tj [-250 ]TJ (W)Tj [40 ]TJ (in32)Tj [-250 ]TJ (platform)Tj [-250 ]TJ (is)Tj [-250 ]TJ (usually)Tj [-250 ]TJ (a)Tj [20 ]TJ (v)Tj [26 ]TJ (ailable.)Tj 
+/N87 12.05499 Tf
+-47.82099 -40.57699 Td
+(Suppor)Tj [-20 ]TJ (ted)Tj [-278 ]TJ (Platf)Tj [20 ]TJ (orms)Tj 
+/N81 9.96299 Tf
+47.82099 -18.97898 Td
+(OpenJade)Tj [-250 ]TJ (is)Tj [-250 ]TJ (intended)Tj [-250 ]TJ (to)Tj [-250 ]TJ (be)Tj [-249 ]TJ (as)Tj [-250 ]TJ (portable)Tj [-250 ]TJ (as)Tj [-250 ]TJ (possible.)Tj [-250 ]TJ (It)Tj [-250 ]TJ (should)Tj [-250 ]TJ (be)Tj [-250 ]TJ (possible)Tj [-250 ]TJ (to)Tj [-250 ]TJ (compile)Tj [-249 ]TJ (and)Tj [-250 ]TJ (b)Tj [20 ]TJ (uild)Tj [-250 ]TJ (on)Tj [-250 ]TJ (most)Tj 
+0 -12.95199 Td
+(contemporary)Tj [-250 ]TJ (UNIX)Tj [-250 ]TJ (type)Tj [-250 ]TJ (pla)Tj [1 ]TJ (tforms.)Tj [-250 ]TJ (In)Tj [-250 ]TJ (addition)Tj [-250 ]TJ (OpenJade)Tj [-250 ]TJ (will)Tj [-250 ]TJ (also)Tj [-250 ]TJ (b)Tj [20 ]TJ (uild)Tj [-250 ]TJ (on)Tj [-250 ]TJ (Microso)Tj [1 ]TJ (ft')Tj [55 ]TJ (s)Tj [-250 ]TJ (W)Tj [40 ]TJ (in32)Tj [-250 ]TJ (based)Tj 
+0 -12.95098 Td
+(operating)Tj [-250 ]TJ (systems.)Tj 
+0 -17.93299 Td
+(OpenJade)Tj [-250 ]TJ (is)Tj [-250 ]TJ (kno)Tj [25 ]TJ (wn)Tj [-250 ]TJ (to)Tj [-250 ]TJ (compi)Tj [1 ]TJ (le)Tj [-250 ]TJ (with)Tj [-250 ]TJ (both)Tj [-250 ]TJ (the)Tj [-250 ]TJ (GNU)Tj [-250 ]TJ (gcc)Tj [-250 ]TJ (c++)Tj [-250 ]TJ (compiler)Tj [-250 ]TJ (and)Tj [-250 ]TJ (Microsoft)Tj [-250 ]TJ (V)Tj [61 ]TJ (isual)Tj [-250 ]TJ (C++.)Tj [-250 ]TJ (Other)Tj 
+0 -12.95098 Td
+(compilers)Tj [-250 ]TJ (ha)Tj [20 ]TJ (v)Tj [15 ]TJ (e)Tj [-250 ]TJ (not)Tj [-250 ]TJ (been)Tj [-250 ]TJ (e)Tj [15 ]TJ (xte)Tj [1 ]TJ (nsi)Tj [25 ]TJ (v)Tj [15 ]TJ (ely)Tj [-250 ]TJ (tested.)Tj 
+0 -17.93299 Td
+(OpenJade)Tj [-250 ]TJ (has)Tj [-250 ]TJ (been)Tj [-250 ]TJ (success)Tj [1 ]TJ (fully)Tj [-250 ]TJ (b)Tj [20 ]TJ (uilt)Tj [-250 ]TJ (with)Tj [-250 ]TJ (the)Tj [-250 ]TJ (follo)Tj [25 ]TJ (wing)Tj [-250 ]TJ (GNU)Tj [-250 ]TJ (compilers:)Tj [-250 ]TJ (Red)Tj [-250 ]TJ (Hat)Tj [-249 ]TJ (g++)Tj [-250 ]TJ (2.96,)Tj [-250 ]TJ (GCC)Tj [-250 ]TJ (g++)Tj 
+0 -12.95098 Td
+(2.95.3,)Tj [-250 ]TJ (GCC)Tj [-250 ]TJ (g++)Tj [-250 ]TJ (3.2)Tj 
+0 -17.93299 Td
+(OpenJade)Tj [-250 ]TJ (has)Tj [-250 ]TJ (been)Tj [-250 ]TJ (b)Tj [20 ]TJ (uilt)Tj [-250 ]TJ (on)Tj [-250 ]TJ (a)Tj [-249 ]TJ (number)Tj [-250 ]TJ (of)Tj [-250 ]TJ (architectures)Tj [-250 ]TJ (including)Tj [-250 ]TJ (Intel)Tj [-250 ]TJ (i386)Tj [-250 ]TJ (and)Tj [-250 ]TJ (ia64,)Tj [-250 ]TJ (Al)Tj [1 ]TJ (pha)Tj [-250 ]TJ (AXP)Tj [111 ]TJ (,)Tj [-250 ]TJ (Sparc,)Tj 
+0 -12.95199 Td
+(PPC)Tj [-250 ]TJ (and)Tj [-250 ]TJ (S/390,)Tj [-250 ]TJ (S/390x.)Tj 
+0 -17.93199 Td
+(The)Tj [-250 ]TJ (follo)Tj [25 ]TJ (wing)Tj [-250 ]TJ (table)Tj [-250 ]TJ (detail)Tj [1 ]TJ (s)Tj [-250 ]TJ (kno)Tj [25 ]TJ (wn)Tj [-250 ]TJ (successful)Tj [-250 ]TJ (b)Tj [20 ]TJ (uilds)Tj 
+/N90 9.96299 Tf
+0 -27.89599 Td
+(T)Tj [92 ]TJ (able)Tj [-250 ]TJ (1.)Tj [-250 ]TJ (Platf)Tj [25 ]TJ (orms)Tj [-250 ]TJ (on)Tj [-250 ]TJ (whic)Tj [1 ]TJ (h)Tj [-250 ]TJ (OpenJ)Tj [15 ]TJ (ade)Tj [-250 ]TJ (1.3.2)Tj [-250 ]TJ (is)Tj [-250 ]TJ (kno)Tj [10 ]TJ (wn)Tj [-250 ]TJ (to)Tj [-250 ]TJ (b)Tj [20 ]TJ (uild.)Tj 
+ET
+1 0 0 1 47.82099 -527.17999 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17498 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Ar)Tj [20 ]TJ (c)Tj [10 ]TJ (h.)Tj [-2724 ]TJ (OS)Tj [-9054 ]TJ (Compiler)Tj [-6166 ]TJ (Notes)Tj 
+ET
+1 0 0 1 0 -3.38699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(alpha)Tj [-3084 ]TJ (Debian)Tj [-250 ]TJ (3.0)Tj [-6111 ]TJ (GNU)Tj [-250 ]TJ (gcc)Tj [-250 ]TJ (3.2)Tj 
+ET
+1 0 0 1 -47.82099 -103.93299 cm
+
+0 g
+0 G
+1 0 0 1 461.26998 0 cm
+
+BT
+/N117 9.96299 Tf
+0 0 Td
+(1)Tj 
+ET
+1 0 0 1 4.98199 0 cm
+
+0 g
+0 G
+PDFVars/TermAll get exec end end
+userdict /pgsave get restore
+showpage
+%%PageTrailer
+%%EndPage
+%%Page: 8 8
+%%BeginPageSetup
+userdict /pgsave save put
+PDFVars begin PDF begin PDFVars/InitAll get exec
+1.14301 1.47949 translate
+%%EndPageSetup
+0 0 609.71398 789.04098 RC
+1 0 0 1 71.73098 729.26499 cm
+
+0 g
+0 G
+1 0 0 1 0 3.58699 cm
+
+BT
+/N117 9.96299 Tf
+0 0 Td
+(OpenJ)Tj [35 ]TJ (ade)Tj [-250 ]TJ (1.3.2)Tj [-250 ]TJ (Release)Tj [-250 ]TJ (Notes)Tj 
+ET
+1 0 0 1 466.25199 -3.58699 cm
+
+0 g
+0 G
+1 0 0 1 -418.43099 -11.35699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Ar)Tj [20 ]TJ (c)Tj [10 ]TJ (h.)Tj [-2724 ]TJ (OS)Tj [-9054 ]TJ (Compiler)Tj [-6166 ]TJ (Notes)Tj 
+/N81 9.96299 Tf
+0 -15.16398 Td
+(arm)Tj [-3695 ]TJ (Debian)Tj [-250 ]TJ (3.0)Tj [-6111 ]TJ (GNU)Tj [-250 ]TJ (gcc)Tj [-250 ]TJ (3.2)Tj 
+0 -15.16299 Td
+(hppa)Tj [-3306 ]TJ (Debian)Tj [-250 ]TJ (3.0)Tj [-6111 ]TJ (GNU)Tj [-250 ]TJ (gcc)Tj [-250 ]TJ (3.2)Tj 
+0 -15.16299 Td
+(i386)Tj [-3472 ]TJ (Debian)Tj [-250 ]TJ (3.0)Tj [-6111 ]TJ (GNU)Tj [-250 ]TJ (gcc)Tj [-250 ]TJ (3.2)Tj 
+52.30398 -28.11399 Td
+(Red)Tj [-250 ]TJ (Hat)Tj [-250 ]TJ (Linux)Tj [-250 ]TJ (7.3)Tj [-3056 ]TJ (Red)Tj [-250 ]TJ (H)Tj [1 ]TJ (at)Tj [-250 ]TJ (gcc)Tj [-250 ]TJ (2.96)Tj 
+0 -15.16299 Td
+(Red)Tj [-250 ]TJ (Hat)Tj [-250 ]TJ (Linux)Tj [-250 ]TJ (7.3)Tj [-3056 ]TJ (GNU)Tj [-250 ]TJ (g)Tj [1 ]TJ (cc)Tj [-250 ]TJ (3.2)Tj 
+0 -15.16398 Td
+(SuSE)Tj [-250 ]TJ (Linux)Tj [-250 ]TJ (8.1)Tj [-4138 ]TJ (GNU)Tj [-250 ]TJ (g)Tj [1 ]TJ (cc)Tj [-250 ]TJ (3.2)Tj 
+-52.30398 -15.16299 Td
+(ia64)Tj [-3528 ]TJ (Debian)Tj [-250 ]TJ (3.0)Tj [-6111 ]TJ (GNU)Tj [-250 ]TJ (gcc)Tj [-250 ]TJ (3.2)Tj 
+0 -15.16299 Td
+(m68k)Tj [-2972 ]TJ (Debian)Tj [-250 ]TJ (3.0)Tj [-6111 ]TJ (GNU)Tj [-250 ]TJ (gcc)Tj [-250 ]TJ (3.2)Tj 
+0 -15.16299 Td
+(mips,)Tj 
+0 -12.95098 Td
+(mipsel)Tj 
+52.30398 12.95098 Td
+(Debian)Tj [-250 ]TJ (3.0)Tj [-6112 ]TJ (GNU)Tj [-250 ]TJ (g)Tj [1 ]TJ (cc)Tj [-250 ]TJ (3.2)Tj 
+-52.30398 -28.11399 Td
+(po)Tj [25 ]TJ (werpc)Tj [-1832 ]TJ (Debian)Tj [-250 ]TJ (3.0)Tj [-6111 ]TJ (GNU)Tj [-250 ]TJ (gcc)Tj [-250 ]TJ (3.2)Tj 
+0 -15.16398 Td
+(s390)Tj [-3361 ]TJ (Debian)Tj [-250 ]TJ (3.0)Tj [-6111 ]TJ (GNU)Tj [-250 ]TJ (gcc)Tj [-250 ]TJ (3.2)Tj 
+0 -15.16299 Td
+(sparc)Tj [-3140 ]TJ (Debian)Tj [-250 ]TJ (3.0)Tj [-6111 ]TJ (GNU)Tj [-250 ]TJ (gcc)Tj [-250 ]TJ (3.2)Tj 
+ET
+1 0 0 1 0 -211.24798 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -19.92498 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(Please)Tj [-250 ]TJ (report)Tj [-250 ]TJ (an)Tj [15 ]TJ (y)Tj [-250 ]TJ (successf)Tj [1 ]TJ (ul)Tj [-250 ]TJ (b)Tj [20 ]TJ (uilds)Tj [-250 ]TJ (not)Tj [-250 ]TJ (mentioned)Tj [-250 ]TJ (abo)Tj [15 ]TJ (v)Tj [15 ]TJ (e)Tj [-250 ]TJ (to)Tj 
+0 -12.95199 Td
+(<)Tj 
+/N177 8.96598 Tf
+5.61898 0 Td
+(openjade-devel@lists.sou)Tj [-1 ]TJ (rceforge.net)Tj 
+/N81 9.96299 Tf
+193.67298 0 Td
+(>,)Tj [-250 ]TJ (including)Tj [-250 ]TJ (an)Tj [15 ]TJ (y)Tj [-250 ]TJ (dif)Tj [25 ]TJ (fs/patches)Tj [-249 ]TJ (you)Tj [-250 ]TJ (ha)Tj [20 ]TJ (v)Tj [15 ]TJ (e)Tj [-250 ]TJ (used.)Tj 
+/N87 12.05499 Tf
+-247.11299 -40.57699 Td
+(Building)Tj [-278 ]TJ (OpenJade)Tj [-278 ]TJ (fr)Tj [20 ]TJ (om)Tj [-278 ]TJ (Sour)Tj [20 ]TJ (ce)Tj 
+/N81 9.96299 Tf
+47.82099 -18.97898 Td
+(OpenJade)Tj [-250 ]TJ (requires)Tj [-250 ]TJ (40Mb)Tj [-250 ]TJ (to)Tj [-249 ]TJ (50Mb)Tj [-250 ]TJ (of)Tj [-250 ]TJ (disk)Tj [-250 ]TJ (space)Tj [-250 ]TJ (to)Tj [-250 ]TJ (b)Tj [20 ]TJ (uild.)Tj [-250 ]TJ (An)Tj [-250 ]TJ (installation)Tj [-250 ]TJ (will)Tj [-250 ]TJ (require)Tj [-249 ]TJ (around)Tj [-250 ]TJ (15Mb)Tj [-250 ]TJ (to)Tj 
+0 -12.95199 Td
+(20Mb)Tj [-250 ]TJ (depending)Tj [-250 ]TJ (on)Tj [-250 ]TJ (architect)Tj [1 ]TJ (ure.)Tj 
+0 -17.93199 Td
+(OpenJade)Tj [-250 ]TJ (mak)Tj [10 ]TJ (es)Tj [-250 ]TJ (use)Tj [-250 ]TJ (of)Tj [-250 ]TJ (the)Tj [-249 ]TJ (GNU)Tj [-250 ]TJ (softw)Tj [10 ]TJ (are)Tj [-250 ]TJ (con\002guration)Tj [-250 ]TJ (tools)Tj [-250 ]TJ (\(autoconf,)Tj [-250 ]TJ (libtool,)Tj [-250 ]TJ (autom)Tj [1 ]TJ (ak)Tj [10 ]TJ (e)Tj [-250 ]TJ (etc\).)Tj [-250 ]TJ (The)Tj 
+0 -12.95199 Td
+(GNU)Tj [-250 ]TJ (C++)Tj [-250 ]TJ (compiler)Tj [-250 ]TJ (and)Tj [-250 ]TJ (ma)Tj [1 ]TJ (k)Tj [10 ]TJ (e)Tj [-250 ]TJ (utility)Tj [-250 ]TJ (should)Tj [-250 ]TJ (also)Tj [-250 ]TJ (be)Tj [-250 ]TJ (used.)Tj [-250 ]TJ (The)Tj [-250 ]TJ (steps)Tj [-250 ]TJ (required)Tj [-250 ]TJ (to)Tj [-250 ]TJ (b)Tj [20 ]TJ (uild)Tj [-249 ]TJ (the)Tj [-250 ]TJ (OpenJade)Tj [-250 ]TJ (tools)Tj 
+0 -12.95098 Td
+(\()Tj 
+/N90 9.96299 Tf
+3.31698 0 Td
+(onsgmls)Tj 
+/N81 9.96299 Tf
+34.32099 0 Td
+(,)Tj 
+/N90 9.96299 Tf
+4.98098 0 Td
+(openjade)Tj 
+/N81 9.96299 Tf
+38.74499 0 Td
+(,)Tj 
+/N90 9.96299 Tf
+4.98098 0 Td
+(osgmlnorm)Tj 
+/N81 9.96299 Tf
+48.14898 0 Td
+(,)Tj 
+/N90 9.96299 Tf
+4.98098 0 Td
+(ospam)Tj 
+/N81 9.96299 Tf
+27.67599 0 Td
+(,)Tj 
+/N90 9.96299 Tf
+4.98199 0 Td
+(ospent)Tj 
+/N81 9.96299 Tf
+27.67599 0 Td
+(,)Tj 
+/N90 9.96299 Tf
+4.98098 0 Td
+(osx)Tj 
+/N81 9.96299 Tf
+13.83799 0 Td
+(\))Tj [-250 ]TJ (and)Tj [-250 ]TJ (libraries)Tj [-250 ]TJ (are)Tj [-250 ]TJ (as)Tj [-250 ]TJ (follo)Tj [25 ]TJ (w)Tj [1 ]TJ (s:)Tj 
+/N177 8.96598 Tf
+-218.62799 -21.61898 Td
+(gzip)Tj [-600 ]TJ (-d)Tj [-600 ]TJ (openjade-1.3.2.)Tj [-1 ]TJ (tar.gz)Tj [-600 ]TJ (|)Tj [-600 ]TJ (tar)Tj [-600 ]TJ (xvf)Tj [-600 ]TJ (-)Tj 
+0 -11.65699 Td
+(cd)Tj [-600 ]TJ (openjade-1.3.2)Tj 
+0 -11.65599 Td
+(./configure)Tj [-600 ]TJ ([)Tj 
+/N191 8.06999 Tf
+69.93699 0 Td
+(options...)Tj 
+/N177 8.96598 Tf
+48.41899 0 Td
+(])Tj 
+-118.35598 -11.65599 Td
+(make)Tj 
+/N81 9.96299 Tf
+0 -22.91398 Td
+(Y)Tj [110 ]TJ (ou)Tj [-250 ]TJ (may)Tj [-250 ]TJ (need)Tj [-250 ]TJ (to)Tj [-250 ]TJ (switch)Tj [-250 ]TJ (to)Tj [-250 ]TJ (th)Tj [1 ]TJ (e)Tj [-250 ]TJ (super)Tj [-250 ]TJ (user)Tj 
+/N90 9.96299 Tf
+166.30499 0 Td
+(r)Tj [18 ]TJ (oot)Tj 
+/N81 9.96299 Tf
+20.01399 0 Td
+(to)Tj [-250 ]TJ (complete)Tj [-250 ]TJ (the)Tj [-250 ]TJ (installation)Tj 
+/N177 8.96598 Tf
+-186.31898 -21.61898 Td
+(make)Tj [-600 ]TJ (install)Tj 
+/N81 9.96299 Tf
+0 -22.91398 Td
+(If)Tj [-250 ]TJ (you)Tj [-250 ]TJ (wish)Tj [-250 ]TJ (to)Tj [-250 ]TJ (install)Tj [-250 ]TJ (man)Tj [-250 ]TJ (p)Tj [1 ]TJ (ages)Tj [-250 ]TJ (for)Tj [-250 ]TJ (the)Tj [-250 ]TJ (v)Tj [25 ]TJ (arious)Tj [-250 ]TJ (commands)Tj [-250 ]TJ (you)Tj [-250 ]TJ (should)Tj [-250 ]TJ (then)Tj [-250 ]TJ (do)Tj 
+/N177 8.96598 Tf
+0 -21.61898 Td
+(make)Tj [-600 ]TJ (install-man)Tj 
+/N81 9.96299 Tf
+0 -22.91398 Td
+(The)Tj 
+/N90 9.96299 Tf
+17.98199 0 Td
+(con\002gur)Tj [18 ]TJ (e)Tj 
+/N81 9.96299 Tf
+42.16198 0 Td
+(script)Tj [-250 ]TJ (supports)Tj [-250 ]TJ (man)Tj [15 ]TJ (y)Tj [-250 ]TJ (options)Tj [1 ]TJ (.)Tj [-250 ]TJ (These)Tj [-250 ]TJ (can)Tj [-250 ]TJ (be)Tj [-250 ]TJ (displayed)Tj [-250 ]TJ (using)Tj [-250 ]TJ (the)Tj [-250 ]TJ (command)Tj 
+/N177 8.96598 Tf
+-60.14399 -21.61898 Td
+(./configure)Tj [-600 ]TJ (--help)Tj 
+ET
+1 0 0 1 -47.82099 -425.74398 cm
+
+0 g
+0 G
+BT
+/N117 9.96299 Tf
+0 0 Td
+(2)Tj 
+ET
+1 0 0 1 466.25199 0 cm
+
+0 g
+0 G
+PDFVars/TermAll get exec end end
+userdict /pgsave get restore
+showpage
+%%PageTrailer
+%%EndPage
+%%Page: 9 9
+%%BeginPageSetup
+userdict /pgsave save put
+PDFVars begin PDF begin PDFVars/InitAll get exec
+1.14301 1.47949 translate
+%%EndPageSetup
+0 0 609.71398 789.04098 RC
+1 0 0 1 71.73098 729.26499 cm
+
+0 g
+0 G
+1 0 0 1 345.13699 3.58699 cm
+
+BT
+/N117 9.96299 Tf
+0 0 Td
+(OpenJ)Tj [35 ]TJ (ade)Tj [-250 ]TJ (1.3.2)Tj [-250 ]TJ (Release)Tj [-250 ]TJ (Note)Tj [1 ]TJ (s)Tj 
+ET
+1 0 0 1 121.11499 -3.58699 cm
+
+0 g
+0 G
+1 0 0 1 -418.43099 -20.92098 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(In)Tj [-250 ]TJ (addition)Tj [-250 ]TJ (to)Tj [-250 ]TJ (the)Tj [-250 ]TJ (standard)Tj [-250 ]TJ (o)Tj [1 ]TJ (ptions,)Tj [-250 ]TJ (the)Tj [-250 ]TJ (follo)Tj [25 ]TJ (wing)Tj [-250 ]TJ (table)Tj [-250 ]TJ (describes)Tj [-250 ]TJ (options)Tj [-250 ]TJ (speci\002c)Tj [-250 ]TJ (to)Tj [-249 ]TJ (openjade.)Tj 
+/N90 9.96299 Tf
+0 -27.89599 Td
+(T)Tj [92 ]TJ (able)Tj [-250 ]TJ (2.)Tj [-250 ]TJ (OpenJ)Tj [15 ]TJ (ade)Tj [-250 ]TJ (speci\002c)Tj [-249 ]TJ (con\002gur)Tj [18 ]TJ (e)Tj [-250 ]TJ (options)Tj 
+ET
+1 0 0 1 0 -40.27899 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17498 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Option)Tj [-7278 ]TJ (Defau)Tj [1 ]TJ (lt)Tj [-7111 ]TJ (Explanation)Tj 
+ET
+1 0 0 1 0 -3.38699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N177 8.96598 Tf
+0 0 Td
+(--enable-)Tj 
+0 -12.95199 Td
+(spincludedir=path)Tj 
+/N81 9.96299 Tf
+104.60699 12.95199 Td
+(/usr/include/OpenSP)Tj [-2222 ]TJ (De\002ne)Tj [-250 ]TJ (the)Tj [-250 ]TJ (p)Tj [1 ]TJ (ath)Tj [-250 ]TJ (where)Tj [-250 ]TJ (the)Tj [-250 ]TJ (OpenSP)Tj [-250 ]TJ (include)Tj [-250 ]TJ (\002les)Tj 
+104.60798 -12.95199 Td
+(may)Tj [-250 ]TJ (be)Tj [-250 ]TJ (found.)Tj 
+/N177 8.96598 Tf
+-209.21499 -28.11399 Td
+(--enable-)Tj 
+0 -12.95199 Td
+(splibdir=path)Tj 
+/N81 9.96299 Tf
+104.60699 12.95199 Td
+(/usr/lib)Tj [-7666 ]TJ (De\002ne)Tj [-250 ]TJ (the)Tj [-249 ]TJ (path)Tj [-250 ]TJ (where)Tj [-250 ]TJ (the)Tj [-250 ]TJ (OpenSP)Tj [-250 ]TJ (library)Tj [-250 ]TJ (\(libosp\))Tj 
+104.60798 -12.95199 Td
+(may)Tj [-250 ]TJ (be)Tj [-250 ]TJ (found.)Tj 
+/N177 8.96598 Tf
+-209.21499 -28.11399 Td
+(--disable-mif)Tj 
+/N81 9.96299 Tf
+104.60699 0 Td
+(MIF)Tj [-250 ]TJ (support)Tj [-250 ]TJ (is)Tj [-250 ]TJ (enabled)Tj [-1195 ]TJ (disable)Tj [-250 ]TJ (sup)Tj [1 ]TJ (port)Tj [-250 ]TJ (for)Tj [-250 ]TJ (FrameMak)Tj [10 ]TJ (er)Tj [-250 ]TJ (MIF)Tj [-250 ]TJ (output)Tj [-250 ]TJ (\(the)Tj 
+/N177 8.96598 Tf
+104.60798 -12.95199 Td
+(-t)Tj [-600 ]TJ (mif)Tj 
+/N81 9.96299 Tf
+34.76998 0 Td
+(option\))Tj [-250 ]TJ (to)Tj 
+/N90 9.96299 Tf
+41.51399 0 Td
+(openjade)Tj 
+/N81 9.96299 Tf
+38.74398 0 Td
+(.)Tj 
+/N177 8.96598 Tf
+-324.24299 -15.16299 Td
+(--disable-html)Tj 
+/N81 9.96299 Tf
+104.60699 0 Td
+(html)Tj [-250 ]TJ (support)Tj [-250 ]TJ (enabled)Tj [-2056 ]TJ (disable)Tj [-250 ]TJ (sup)Tj [1 ]TJ (port)Tj [-250 ]TJ (for)Tj [-250 ]TJ (HTML+CSS)Tj [-250 ]TJ (output)Tj [-250 ]TJ (\(the)Tj 
+/N177 8.96598 Tf
+281.80198 0 Td
+(-t)Tj 
+-177.19398 -12.95098 Td
+(html)Tj 
+/N81 9.96299 Tf
+24.00999 0 Td
+(to)Tj 
+/N90 9.96299 Tf
+10.24198 0 Td
+(openjade)Tj 
+/N81 9.96299 Tf
+38.74398 0 Td
+(\).)Tj 
+/N177 8.96598 Tf
+-282.21099 -15.16299 Td
+(--enable-default-)Tj 
+0 -12.95199 Td
+(catalog=)Tj 
+/N191 8.96598 Tf
+43.03799 0 Td
+(pathlist)Tj 
+/N81 9.96299 Tf
+61.56898 12.95199 Td
+(Not)Tj [-250 ]TJ (enabled)Tj [-5640 ]TJ (Pro)Tj [15 ]TJ (vide)Tj [-250 ]TJ (one)Tj [-249 ]TJ (or)Tj [-250 ]TJ (more)Tj [-250 ]TJ (def)Tj [10 ]TJ (ault)Tj [-250 ]TJ (catalog)Tj [-250 ]TJ (\002les)Tj [-250 ]TJ (or)Tj [-250 ]TJ (sysids,)Tj 
+104.60798 -12.95199 Td
+(e.g.)Tj [-250 ]TJ (/usr/local/lib/sgml/cat)Tj [1 ]TJ (alog)Tj 
+/N177 8.96598 Tf
+-209.21499 -28.11399 Td
+(--enable-default-)Tj 
+0 -12.95199 Td
+(search-)Tj 
+0 -12.95098 Td
+(path=)Tj 
+/N191 8.96598 Tf
+26.89898 0 Td
+(pathlist)Tj 
+/N81 9.96299 Tf
+77.70799 25.90299 Td
+(Not)Tj [-250 ]TJ (enabled)Tj [-5640 ]TJ (Pro)Tj [15 ]TJ (vide)Tj [-250 ]TJ (a)Tj [-250 ]TJ (de)Tj [1 ]TJ (f)Tj [10 ]TJ (ault)Tj [-250 ]TJ (v)Tj [25 ]TJ (alue)Tj [-250 ]TJ (for)Tj 
+/N177 8.96598 Tf
+212.84098 0 Td
+(SGML_SEARCH_PATH)Tj 
+ET
+1 0 0 1 0 -221.66899 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -19.92498 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(Please)Tj [-250 ]TJ (refer)Tj [-250 ]TJ (to)Tj [-250 ]TJ (the)Tj [-250 ]TJ (system)Tj [-249 ]TJ (documentation)Tj [-250 ]TJ (for)Tj [-250 ]TJ (details)Tj [-250 ]TJ (on)Tj [-250 ]TJ (b)Tj [20 ]TJ (uilding)Tj [-250 ]TJ (on)Tj [-250 ]TJ (the)Tj [-250 ]TJ (W)Tj [40 ]TJ (in32)Tj [-250 ]TJ (platfo)Tj [1 ]TJ (rm.)Tj 
+/N87 12.05499 Tf
+-47.82099 -40.57798 Td
+(Binar)Tj [-10 ]TJ (y)Tj [-278 ]TJ (Distrib)Tj [20 ]TJ (utions)Tj 
+/N81 9.96299 Tf
+47.82099 -18.97898 Td
+(Although)Tj [-244 ]TJ (the)Tj [-245 ]TJ (OpenJ)Tj [1 ]TJ (ade)Tj [-245 ]TJ (project)Tj [-244 ]TJ (does)Tj [-244 ]TJ (not)Tj [-245 ]TJ (mak)Tj [10 ]TJ (e)Tj [-244 ]TJ (binary)Tj [-244 ]TJ (distrib)Tj [20 ]TJ (utions)Tj [-245 ]TJ (a)Tj [20 ]TJ (v)Tj [25 ]TJ (ailabl)Tj [1 ]TJ (e,)Tj [-245 ]TJ (OpenJade)Tj [-244 ]TJ (has)Tj [-244 ]TJ (been)Tj [-245 ]TJ (a)Tj [-244 ]TJ (part)Tj [-245 ]TJ (of)Tj 
+0 -12.95098 Td
+(man)Tj [15 ]TJ (y)Tj [-250 ]TJ (softw)Tj [10 ]TJ (are)Tj [-250 ]TJ (distrib)Tj [20 ]TJ (ution)Tj [1 ]TJ (s,)Tj [-250 ]TJ (including)Tj [-250 ]TJ (the)Tj [-250 ]TJ (major)Tj [-250 ]TJ (Linux)Tj [-250 ]TJ (distrib)Tj [20 ]TJ (utions)Tj [-250 ]TJ (as)Tj [-250 ]TJ (well)Tj [-250 ]TJ (as)Tj [-250 ]TJ (Fre)Tj [1 ]TJ (eBSD.)Tj [-250 ]TJ (Expect)Tj 
+0 -12.95199 Td
+(pre-compiled)Tj [-250 ]TJ (and)Tj [-250 ]TJ (packaged)Tj [-249 ]TJ (v)Tj [15 ]TJ (ersions)Tj [-250 ]TJ (of)Tj [-250 ]TJ (the)Tj [-250 ]TJ (latest)Tj [-250 ]TJ (v)Tj [15 ]TJ (ersion)Tj [-250 ]TJ (of)Tj [-250 ]TJ (OpenJade)Tj [-250 ]TJ (to)Tj [-250 ]TJ (be)Tj [-250 ]TJ (a)Tj [20 ]TJ (v)Tj [25 ]TJ (ailable)Tj [-249 ]TJ (from)Tj [-250 ]TJ (your)Tj 
+0 -12.95098 Td
+(distrib)Tj [20 ]TJ (utor)Tj [-250 ]TJ (in)Tj [-250 ]TJ (due)Tj [-250 ]TJ (course.)Tj 
+/N87 12.05499 Tf
+-47.82099 -40.57798 Td
+(Installation)Tj 
+/N81 9.96299 Tf
+47.82099 -18.97898 Td
+(In)Tj [-250 ]TJ (addition)Tj [-250 ]TJ (to)Tj [-250 ]TJ (the)Tj [-250 ]TJ (OpenJade)Tj [-249 ]TJ (e)Tj [15 ]TJ (x)Tj [15 ]TJ (ecutables)Tj [-250 ]TJ (and)Tj [-250 ]TJ (libraries)Tj [-250 ]TJ (you)Tj [-250 ]TJ (will)Tj [-250 ]TJ (also)Tj [-250 ]TJ (need)Tj [-250 ]TJ (v)Tj [25 ]TJ (arious)Tj [-250 ]TJ (DTD)Tj [1 ]TJ (s)Tj [-250 ]TJ (and)Tj [-250 ]TJ (stylesheets.)Tj 
+0 -12.95098 Td
+(Some)Tj [-250 ]TJ (DTDs)Tj [-250 ]TJ (and)Tj [-250 ]TJ (associated)Tj [-249 ]TJ (\002les)Tj [-250 ]TJ (\(entity)Tj [-250 ]TJ (de\002nitions\))Tj [-250 ]TJ (are)Tj [-250 ]TJ (a)Tj [20 ]TJ (v)Tj [25 ]TJ (ailable)Tj [-250 ]TJ (in)Tj [-250 ]TJ (the)Tj 
+/N177 8.96598 Tf
+285.38598 0 Td
+(pubtext)Tj 
+/N81 9.96299 Tf
+40.14898 0 Td
+(directory)Tj [-250 ]TJ (of)Tj [-250 ]TJ (the)Tj 
+-325.53498 -12.95199 Td
+(distrib)Tj [20 ]TJ (ution.)Tj [-250 ]TJ (Ho)Tj [25 ]TJ (we)Tj [25 ]TJ (v)Tj [15 ]TJ (er)Tj [40 ]TJ (,)Tj [-250 ]TJ (more)Tj [-250 ]TJ (a)Tj [1 ]TJ (uthoritati)Tj [25 ]TJ (v)Tj [15 ]TJ (e)Tj [-250 ]TJ (sources)Tj [-250 ]TJ (should)Tj [-250 ]TJ (be)Tj [-250 ]TJ (referenced)Tj [-250 ]TJ (to)Tj [-250 ]TJ (ensure)Tj [-250 ]TJ (that)Tj [-250 ]TJ (u)Tj [1 ]TJ (p-to-date)Tj [-250 ]TJ (v)Tj [15 ]TJ (ersions)Tj 
+0 -12.95098 Td
+(are)Tj [-250 ]TJ (used.)Tj [-250 ]TJ (If)Tj [-250 ]TJ (you)Tj [-250 ]TJ (wish)Tj [-250 ]TJ (to)Tj [-250 ]TJ (proce)Tj [1 ]TJ (ss)Tj [-250 ]TJ (XML)Tj [-250 ]TJ (\002les,)Tj [-250 ]TJ (then)Tj [-250 ]TJ (suitable)Tj [-250 ]TJ (SGML)Tj [-250 ]TJ (declarations)Tj [-250 ]TJ (for)Tj [-250 ]TJ (v)Tj [25 ]TJ (al)Tj [1 ]TJ (id)Tj [-250 ]TJ (XML)Tj [-250 ]TJ (documents)Tj 
+0 -12.95098 Td
+(should)Tj [-250 ]TJ (be)Tj [-250 ]TJ (used.)Tj [-250 ]TJ (Ag)Tj [5 ]TJ (ain,)Tj [-250 ]TJ (a)Tj [-250 ]TJ (sam)Tj [1 ]TJ (ple)Tj [-250 ]TJ (set)Tj [-250 ]TJ (of)Tj [-250 ]TJ (declarations)Tj [-250 ]TJ (\()Tj 
+/N177 8.96598 Tf
+209.40199 0 Td
+(xml.dcl)Tj 
+/N81 9.96299 Tf
+37.65899 0 Td
+(\))Tj [-250 ]TJ (is)Tj [-250 ]TJ (pro)Tj [15 ]TJ (vided)Tj [-250 ]TJ (in)Tj [-250 ]TJ (the)Tj 
+/N177 8.96598 Tf
+77.60798 0 Td
+(pubtext)Tj 
+/N81 9.96299 Tf
+37.65899 0 Td
+(,)Tj [-250 ]TJ (b)Tj [20 ]TJ (ut)Tj [-250 ]TJ (more)Tj 
+-362.32798 -12.95199 Td
+(complete)Tj [-250 ]TJ (or)Tj [-250 ]TJ (recent)Tj [-250 ]TJ (v)Tj [15 ]TJ (ersions)Tj [-249 ]TJ (may)Tj [-250 ]TJ (be)Tj [-250 ]TJ (a)Tj [20 ]TJ (v)Tj [25 ]TJ (ailable)Tj [-250 ]TJ (from)Tj [-250 ]TJ (other)Tj [-250 ]TJ (sources.)Tj 
+0 -17.93299 Td
+(OpenJade)Tj [-249 ]TJ (supports)Tj [-249 ]TJ (the)Tj [-250 ]TJ (st)Tj [1 ]TJ (andard)Tj [-250 ]TJ (SGML)Tj [-249 ]TJ (catalog)Tj [-249 ]TJ (f)Tj [10 ]TJ (acility;)Tj [-249 ]TJ (it)Tj [-249 ]TJ (is)Tj [-250 ]TJ (recommended)Tj [-249 ]TJ (that)Tj [-249 ]TJ (you)Tj [-249 ]TJ (set)Tj [-250 ]TJ (up)Tj [-249 ]TJ (and)Tj [-249 ]TJ (use)Tj [-249 ]TJ (such)Tj [-250 ]TJ (a)Tj 
+0 -12.95098 Td
+(catalog)Tj [-250 ]TJ (system.)Tj [-250 ]TJ (Generally)Tj [-249 ]TJ (speaking)Tj [-250 ]TJ (you)Tj [-250 ]TJ (will)Tj [-250 ]TJ (create)Tj [-250 ]TJ (your)Tj [-250 ]TJ (o)Tj [25 ]TJ (wn)Tj [-250 ]TJ (DSSSL)Tj [-250 ]TJ (stylesheets)Tj [-250 ]TJ (fo)Tj [1 ]TJ (r)Tj [-250 ]TJ (use)Tj [-250 ]TJ (with)Tj [-250 ]TJ (OpenJade,)Tj 
+ET
+1 0 0 1 -47.82099 -349.91799 cm
+
+0 g
+0 G
+1 0 0 1 461.26998 0 cm
+
+BT
+/N117 9.96299 Tf
+0 0 Td
+(3)Tj 
+ET
+1 0 0 1 4.98199 0 cm
+
+0 g
+0 G
+PDFVars/TermAll get exec end end
+userdict /pgsave get restore
+showpage
+%%PageTrailer
+%%EndPage
+%%Page: 10 10
+%%BeginPageSetup
+userdict /pgsave save put
+PDFVars begin PDF begin PDFVars/InitAll get exec
+1.14301 1.47949 translate
+%%EndPageSetup
+0 0 609.71398 789.04098 RC
+1 0 0 1 71.73098 729.26499 cm
+
+0 g
+0 G
+1 0 0 1 0 3.58699 cm
+
+BT
+/N117 9.96299 Tf
+0 0 Td
+(OpenJ)Tj [35 ]TJ (ade)Tj [-250 ]TJ (1.3.2)Tj [-250 ]TJ (Release)Tj [-250 ]TJ (Notes)Tj 
+ET
+1 0 0 1 466.25199 -3.58699 cm
+
+0 g
+0 G
+1 0 0 1 -418.43099 -20.92098 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(ho)Tj [25 ]TJ (we)Tj [25 ]TJ (v)Tj [15 ]TJ (er)Tj [40 ]TJ (,)Tj [-250 ]TJ (users)Tj [-250 ]TJ (of)Tj [-250 ]TJ (the)Tj [-250 ]TJ (O)Tj [35 ]TJ (ASIS)Tj [-250 ]TJ (D)Tj [1 ]TJ (ocBook)Tj [-250 ]TJ (DTD)Tj [-250 ]TJ (should)Tj [-250 ]TJ (be)Tj [-250 ]TJ (a)Tj [15 ]TJ (w)Tj [10 ]TJ (are)Tj [-250 ]TJ (that)Tj [-250 ]TJ (e)Tj [15 ]TJ (xtensi)Tj [25 ]TJ (v)Tj [15 ]TJ (e,)Tj [-250 ]TJ (and)Tj [-250 ]TJ (modular)Tj [40 ]TJ (,)Tj [-250 ]TJ (st)Tj [1 ]TJ (ylesheets)Tj 
+0 -12.95199 Td
+(are)Tj [-250 ]TJ (a)Tj [20 ]TJ (v)Tj [25 ]TJ (ailable)Tj [-250 ]TJ (from)Tj [-250 ]TJ (the)Tj [-250 ]TJ (DocB)Tj [1 ]TJ (ook)Tj [-250 ]TJ (project)Tj [-250 ]TJ (at)Tj [-250 ]TJ (http://docbook.sourcefor)Tj [18 ]TJ (ge.net.)Tj 
+0 -17.93199 Td
+(If)Tj [-250 ]TJ (you)Tj [-250 ]TJ (wish)Tj [-250 ]TJ (to)Tj [-250 ]TJ (mak)Tj [10 ]TJ (e)Tj [-250 ]TJ (use)Tj [-250 ]TJ (of)Tj [-250 ]TJ (th)Tj [1 ]TJ (e)Tj [-250 ]TJ (T)Tj [70 ]TJ (eX)Tj [-250 ]TJ (back)Tj [10 ]TJ (end)Tj [-250 ]TJ (you)Tj [-250 ]TJ (will)Tj [-250 ]TJ (require)Tj [-250 ]TJ (an)Tj [-250 ]TJ (up)Tj [-250 ]TJ (to)Tj [-250 ]TJ (date)Tj [-250 ]TJ (distrib)Tj [20 ]TJ (ution)Tj [-250 ]TJ (o)Tj [1 ]TJ (f)Tj [-250 ]TJ (laT)Tj [70 ]TJ (eX)Tj [-250 ]TJ (such)Tj [-250 ]TJ (as)Tj 
+0 -12.95199 Td
+(teT)Tj [70 ]TJ (eX,)Tj [-250 ]TJ (T)Tj [70 ]TJ (eXli)Tj [25 ]TJ (v)Tj [15 ]TJ (e)Tj [-250 ]TJ (or)Tj [-250 ]TJ (fpT)Tj [70 ]TJ (eX.)Tj [-250 ]TJ (In)Tj [-250 ]TJ (a)Tj [1 ]TJ (ddition)Tj [-250 ]TJ (you)Tj [-250 ]TJ (will)Tj [-250 ]TJ (also)Tj [-250 ]TJ (require)Tj [-250 ]TJ (the)Tj [-250 ]TJ (jadete)Tj [15 ]TJ (x)Tj [-250 ]TJ (package,)Tj [-250 ]TJ (a)Tj [20 ]TJ (v)Tj [25 ]TJ (ailabl)Tj [1 ]TJ (e)Tj [-250 ]TJ (from)Tj 
+0 -12.95098 Td
+(http://jadete)Tj [15 ]TJ (x.sourcefor)Tj [18 ]TJ (ge.n)Tj [1 ]TJ (et.)Tj 
+/N87 12.05499 Tf
+-47.82099 -40.57798 Td
+(Suppor)Tj [-20 ]TJ (t)Tj 
+/N81 9.96299 Tf
+47.82099 -18.97898 Td
+(If,)Tj [-250 ]TJ (after)Tj [-250 ]TJ (reading)Tj [-250 ]TJ (the)Tj [-250 ]TJ (docume)Tj [1 ]TJ (ntation,)Tj [-250 ]TJ (you)Tj [-250 ]TJ (still)Tj [-250 ]TJ (ha)Tj [20 ]TJ (v)Tj [15 ]TJ (e)Tj [-250 ]TJ (a)Tj [-250 ]TJ (problem,)Tj [-250 ]TJ (then)Tj [-250 ]TJ (you)Tj [-250 ]TJ (may)Tj [-250 ]TJ (require)Tj [-250 ]TJ (som)Tj [1 ]TJ (e)Tj [-250 ]TJ (additional)Tj [-250 ]TJ (help.)Tj 
+0 -12.95098 Td
+(The)Tj [-250 ]TJ (OpenJade)Tj [-250 ]TJ (project)Tj [-250 ]TJ (is)Tj [-250 ]TJ (a)Tj [-250 ]TJ (v)Tj [21 ]TJ (olunteer)Tj [-250 ]TJ (ef)Tj [25 ]TJ (fort)Tj [-250 ]TJ (and)Tj [-250 ]TJ (as)Tj [-250 ]TJ (such)Tj [-250 ]TJ (does)Tj [-250 ]TJ (not)Tj [-250 ]TJ (pro)Tj [15 ]TJ (vide)Tj [-250 ]TJ (an)Tj [15 ]TJ (y)Tj [-250 ]TJ (formal)Tj [-250 ]TJ (supp)Tj [1 ]TJ (ort.)Tj [-250 ]TJ (Instead,)Tj [-250 ]TJ (you)Tj 
+0 -12.95199 Td
+(should)Tj [-250 ]TJ (look)Tj [-250 ]TJ (to)Tj [-250 ]TJ (the)Tj [-250 ]TJ (communi)Tj [1 ]TJ (ty)Tj [-250 ]TJ (for)Tj [-250 ]TJ (support.)Tj [-250 ]TJ (Once)Tj [-250 ]TJ (part)Tj [-250 ]TJ (of)Tj [-250 ]TJ (the)Tj [-250 ]TJ (community)Tj [65 ]TJ (,)Tj [-250 ]TJ (you,)Tj [-250 ]TJ (in)Tj [-250 ]TJ (turn,)Tj [-250 ]TJ (will)Tj [-249 ]TJ (be)Tj [-250 ]TJ (able)Tj [-250 ]TJ (to)Tj [-250 ]TJ (play)Tj 
+0 -12.95098 Td
+(your)Tj [-250 ]TJ (part)Tj [-250 ]TJ (in)Tj [-250 ]TJ (helping)Tj [-250 ]TJ (those)Tj [-250 ]TJ (th)Tj [1 ]TJ (at)Tj [-250 ]TJ (come)Tj [-250 ]TJ (after)Tj [-250 ]TJ (you.)Tj [-250 ]TJ (Here)Tj [-250 ]TJ (are)Tj [-250 ]TJ (some)Tj [-250 ]TJ (pointers)Tj [-250 ]TJ (to)Tj [-250 ]TJ (obtaining)Tj [-250 ]TJ (he)Tj [1 ]TJ (lp:)Tj 
+ET
+1 0 0 1 0 -183.09399 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 7.17298 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(If)Tj [-250 ]TJ (you)Tj [-250 ]TJ (obtained)Tj [-250 ]TJ (your)Tj [-250 ]TJ (OpenJade)Tj [-250 ]TJ (to)Tj [1 ]TJ (ols)Tj [-250 ]TJ (in)Tj [-250 ]TJ (binary)Tj [-250 ]TJ (form)Tj [-250 ]TJ (from)Tj [-250 ]TJ (your)Tj [-250 ]TJ (operating)Tj [-250 ]TJ (system)Tj [-250 ]TJ (distrib)Tj [20 ]TJ (utor)Tj [-249 ]TJ (and)Tj [-250 ]TJ (you)Tj 
+0 -12.95098 Td
+(ha)Tj [20 ]TJ (v)Tj [15 ]TJ (e)Tj [-250 ]TJ (a)Tj [-250 ]TJ (b)Tj [20 ]TJ (uild)Tj [-250 ]TJ (related)Tj [-250 ]TJ (problem)Tj [-250 ]TJ (-)Tj [-250 ]TJ (su)Tj [1 ]TJ (ch)Tj [-250 ]TJ (as)Tj [-250 ]TJ (openjade)Tj [-250 ]TJ (crashing,)Tj [-250 ]TJ (then)Tj [-250 ]TJ (your)Tj [-250 ]TJ (\002rst)Tj [-250 ]TJ (port)Tj [-250 ]TJ (of)Tj [-250 ]TJ (call)Tj [-250 ]TJ (should)Tj [-249 ]TJ (be)Tj [-250 ]TJ (your)Tj 
+0 -12.95199 Td
+(distrib)Tj [20 ]TJ (utor)Tj [55 ]TJ (.)Tj 
+ET
+1 0 0 1 -9.96199 -43.83499 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 7.17298 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(If)Tj [-250 ]TJ (you)Tj [-250 ]TJ (ha)Tj [20 ]TJ (v)Tj [15 ]TJ (e)Tj [-250 ]TJ (a)Tj [-250 ]TJ (problem)Tj [-250 ]TJ (with)Tj [-250 ]TJ (the)Tj [-250 ]TJ (us)Tj [1 ]TJ (age)Tj [-250 ]TJ (of)Tj [-250 ]TJ (openjade)Tj [-250 ]TJ (and)Tj [-250 ]TJ (tools,)Tj [-250 ]TJ (or)Tj [-250 ]TJ (general)Tj [-250 ]TJ (queries)Tj [-250 ]TJ (about)Tj [-250 ]TJ (DSSSL)Tj [-249 ]TJ (then)Tj [-250 ]TJ (you)Tj 
+0 -12.95199 Td
+(should)Tj [-250 ]TJ (try)Tj [-250 ]TJ (the)Tj [-250 ]TJ (DSSSL)Tj [-250 ]TJ (mailing)Tj [-249 ]TJ (list,)Tj [-250 ]TJ (see)Tj [-250 ]TJ (http://www)Tj [65 ]TJ (.mulberrytech.com/dsssl/dssslis)Tj [1 ]TJ (t/)Tj [-250 ]TJ (for)Tj [-250 ]TJ (details.)Tj 
+ET
+1 0 0 1 -9.96199 -30.88398 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 7.17298 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(If)Tj [-250 ]TJ (you)Tj [-250 ]TJ (are)Tj [-250 ]TJ (using)Tj [-250 ]TJ (the)Tj [-250 ]TJ (DocBook)Tj [-250 ]TJ (DT)Tj [1 ]TJ (D)Tj [-250 ]TJ (and)Tj [-250 ]TJ (especially)Tj [-250 ]TJ (if)Tj [-250 ]TJ (you)Tj [-250 ]TJ (are)Tj [-250 ]TJ (also)Tj [-250 ]TJ (using)Tj [-250 ]TJ (the)Tj [-250 ]TJ (Modular)Tj [-250 ]TJ (DocBo)Tj [1 ]TJ (ok)Tj [-250 ]TJ (DSSSL)Tj 
+0 -12.95199 Td
+(stylesheets,)Tj [-250 ]TJ (then)Tj [-250 ]TJ (the)Tj [-250 ]TJ (docbook-a)Tj [1 ]TJ (pps)Tj [-250 ]TJ (mailing)Tj [-250 ]TJ (list)Tj [-250 ]TJ (is)Tj [-250 ]TJ (the)Tj [-250 ]TJ (place)Tj [-250 ]TJ (to)Tj [-250 ]TJ (go.)Tj [-250 ]TJ (See)Tj 
+0 -12.95098 Td
+(http://www)Tj [65 ]TJ (.oasis-open.or)Tj [18 ]TJ (g/docb)Tj [1 ]TJ (ook/mailinglist/)Tj [-250 ]TJ (for)Tj [-250 ]TJ (details.)Tj 
+ET
+1 0 0 1 -9.96199 -43.83599 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 7.17298 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(If)Tj [-250 ]TJ (you)Tj [-250 ]TJ (ha)Tj [20 ]TJ (v)Tj [15 ]TJ (e)Tj [-250 ]TJ (a)Tj [-250 ]TJ (patch)Tj [-250 ]TJ (or)Tj [-250 ]TJ (b)Tj [20 ]TJ (ug)Tj [-250 ]TJ (\002x)Tj [-250 ]TJ (for)Tj [-250 ]TJ (Op)Tj [1 ]TJ (enJade,)Tj [-250 ]TJ (or)Tj [-250 ]TJ (are)Tj [-250 ]TJ (trying)Tj [-250 ]TJ (to)Tj [-250 ]TJ (use)Tj [-250 ]TJ (the)Tj [-250 ]TJ (OpenSP)Tj [-250 ]TJ (API)Tj [-250 ]TJ (then)Tj [-250 ]TJ (the)Tj 
+0 -12.95199 Td
+(openjade-de)Tj [25 ]TJ (v)Tj [15 ]TJ (el)Tj [-250 ]TJ (mailing)Tj [-250 ]TJ (list)Tj [-250 ]TJ (i)Tj [1 ]TJ (s)Tj [-250 ]TJ (the)Tj [-250 ]TJ (appropriate)Tj [-250 ]TJ (forum.)Tj 
+-9.96199 -17.93199 Td
+(Please)Tj [-250 ]TJ (choose)Tj [-250 ]TJ (only)Tj [-250 ]TJ (one)Tj [-250 ]TJ (mai)Tj [1 ]TJ (ling)Tj [-250 ]TJ (list)Tj [-250 ]TJ (to)Tj [-250 ]TJ (post)Tj [-250 ]TJ (to,)Tj [-250 ]TJ (as)Tj [-250 ]TJ (cross-posting)Tj [-250 ]TJ (is)Tj [-250 ]TJ (generally)Tj [-250 ]TJ (fro)Tj [25 ]TJ (wn)Tj [1 ]TJ (ed)Tj [-250 ]TJ (upon.)Tj [-250 ]TJ (The)Tj [-250 ]TJ (v)Tj [25 ]TJ (arious)Tj 
+0 -12.95199 Td
+(mailing)Tj [-242 ]TJ (lists)Tj [-242 ]TJ (are)Tj [-242 ]TJ (arc)Tj [1 ]TJ (hi)Tj [25 ]TJ (v)Tj [15 ]TJ (ed)Tj [-242 ]TJ (and)Tj [-242 ]TJ (searchable.)Tj [-242 ]TJ (It)Tj [-242 ]TJ (is)Tj [-242 ]TJ (al)Tj [10 ]TJ (w)Tj [10 ]TJ (ays)Tj [-242 ]TJ (w)Tj [10 ]TJ (orth)Tj [-242 ]TJ (searc)Tj [1 ]TJ (hing)Tj [-242 ]TJ (for)Tj [-242 ]TJ (your)Tj [-242 ]TJ (problem)Tj [-242 ]TJ (\002rst,)Tj [-242 ]TJ (as)Tj [-242 ]TJ (it)Tj [-242 ]TJ (is)Tj [-242 ]TJ (often)Tj 
+0 -12.95098 Td
+(the)Tj [-250 ]TJ (case)Tj [-250 ]TJ (that)Tj [-250 ]TJ (someone)Tj [-250 ]TJ (has)Tj [-249 ]TJ (had)Tj [-250 ]TJ (the)Tj [-250 ]TJ (same)Tj [-250 ]TJ (problem)Tj [-250 ]TJ (before.)Tj 
+/N87 12.05499 Tf
+-47.82099 -40.57798 Td
+(V)Tj [50 ]TJ (er)Tj [15 ]TJ (sion)Tj [-278 ]TJ (1.3.2)Tj 
+/N90 9.96299 Tf
+47.82099 -18.97898 Td
+(Released)Tj [-250 ]TJ (December)Tj [-250 ]TJ (2002.)Tj 
+/N81 9.96299 Tf
+110.66398 0 Td
+(This)Tj [-250 ]TJ (release)Tj [-250 ]TJ (allo)Tj [25 ]TJ (ws)Tj [-250 ]TJ (openja)Tj [1 ]TJ (de)Tj [-250 ]TJ (to)Tj [-250 ]TJ (be)Tj [-250 ]TJ (b)Tj [20 ]TJ (uilt)Tj [-250 ]TJ (ag)Tj [5 ]TJ (ainst)Tj [-250 ]TJ (the)Tj [-250 ]TJ (most)Tj [-250 ]TJ (recent)Tj [-250 ]TJ (OpenSP)Tj 
+-110.66398 -12.95098 Td
+(release)Tj [-250 ]TJ (-)Tj [-250 ]TJ (v)Tj [15 ]TJ (ersion)Tj [-250 ]TJ (1.5.)Tj [-250 ]TJ (It)Tj [-250 ]TJ (also)Tj [-249 ]TJ (contains)Tj [-250 ]TJ (some)Tj [-250 ]TJ (\002x)Tj [15 ]TJ (es)Tj [-250 ]TJ (for)Tj [-250 ]TJ (the)Tj [-250 ]TJ (MIF)Tj [-250 ]TJ (back)Tj [10 ]TJ (end)Tj [-250 ]TJ (which)Tj [-250 ]TJ (were)Tj [-250 ]TJ (omi)Tj [1 ]TJ (tted)Tj [-250 ]TJ (from)Tj [-250 ]TJ (the)Tj [-250 ]TJ (1.3.1)Tj 
+0 -12.95199 Td
+(release.)Tj [-250 ]TJ (OpenSP)Tj [-250 ]TJ (is)Tj [-250 ]TJ (no)Tj [25 ]TJ (w)Tj [-250 ]TJ (dis)Tj [1 ]TJ (trib)Tj [20 ]TJ (uted)Tj [-250 ]TJ (in)Tj [-250 ]TJ (a)Tj [-250 ]TJ (separate)Tj [-250 ]TJ (package)Tj [-250 ]TJ (and)Tj [-250 ]TJ (made)Tj [-250 ]TJ (a)Tj [20 ]TJ (v)Tj [25 ]TJ (ailable)Tj [-250 ]TJ (on)Tj [-250 ]TJ (its)Tj [-249 ]TJ (o)Tj [25 ]TJ (wn)Tj [-250 ]TJ (release)Tj [-250 ]TJ (c)Tj [15 ]TJ (ycle)Tj 
+/N90 9.96299 Tf
+0 -27.89498 Td
+(T)Tj [92 ]TJ (able)Tj [-250 ]TJ (3.)Tj [-250 ]TJ (Changes)Tj [-250 ]TJ (f)Tj [25 ]TJ (or)Tj [-250 ]TJ (r)Tj [18 ]TJ (eleas)Tj [1 ]TJ (e)Tj [-250 ]TJ (1.3.2)Tj 
+ET
+1 0 0 1 -9.96199 -182.52598 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Item)Tj [-278 ]TJ (1)Tj [-7610 ]TJ (MIF)Tj [-278 ]TJ (B)Tj [1 ]TJ (ac)Tj [20 ]TJ (kend)Tj [-278 ]TJ (Fix)Tj [10 ]TJ (es)Tj 
+ET
+1 0 0 1 0 -3.38699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17498 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(References)Tj [-6058 ]TJ (G.)Tj [-250 ]TJ (Ses)Tj [1 ]TJ (hadri)Tj [-250 ]TJ (et)Tj [-250 ]TJ (al.)Tj 
+0 -15.16299 Td
+(Cate)Tj [15 ]TJ (gory)Tj [-6849 ]TJ (Softw)Tj [11 ]TJ (are)Tj [-250 ]TJ (Bug)Tj 
+0 -15.16299 Td
+(Problem)Tj [-7111 ]TJ (Issues)Tj [-249 ]TJ (with)Tj [-250 ]TJ (page)Tj [-250 ]TJ (size)Tj [-250 ]TJ (and)Tj [-250 ]TJ (page)Tj [-250 ]TJ (header/footers)Tj 
+ET
+1 0 0 1 -47.82099 -147.61599 cm
+
+0 g
+0 G
+BT
+/N117 9.96299 Tf
+0 0 Td
+(4)Tj 
+ET
+1 0 0 1 466.25199 0 cm
+
+0 g
+0 G
+PDFVars/TermAll get exec end end
+userdict /pgsave get restore
+showpage
+%%PageTrailer
+%%EndPage
+%%Page: 11 11
+%%BeginPageSetup
+userdict /pgsave save put
+PDFVars begin PDF begin PDFVars/InitAll get exec
+1.14301 1.47949 translate
+%%EndPageSetup
+0 0 609.71398 789.04098 RC
+1 0 0 1 71.73098 729.26499 cm
+
+0 g
+0 G
+1 0 0 1 345.13699 3.58699 cm
+
+BT
+/N117 9.96299 Tf
+0 0 Td
+(OpenJ)Tj [35 ]TJ (ade)Tj [-250 ]TJ (1.3.2)Tj [-250 ]TJ (Release)Tj [-250 ]TJ (Note)Tj [1 ]TJ (s)Tj 
+ET
+1 0 0 1 121.11499 -3.58699 cm
+
+0 g
+0 G
+1 0 0 1 -418.43099 -11.35699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Item)Tj [-278 ]TJ (1)Tj [-7610 ]TJ (MIF)Tj [-278 ]TJ (B)Tj [1 ]TJ (ac)Tj [20 ]TJ (kend)Tj [-278 ]TJ (Fix)Tj [10 ]TJ (es)Tj 
+/N81 9.96299 Tf
+0 -15.16398 Td
+(Resolution)Tj [-6166 ]TJ (Fix)Tj [-250 ]TJ (to)Tj [-249 ]TJ (mak)Tj [10 ]TJ (e)Tj [-250 ]TJ (sure)Tj [-250 ]TJ (that)Tj [-250 ]TJ (right)Tj [-250 ]TJ (header)Tj [-250 ]TJ (is)Tj [-250 ]TJ (sho)Tj [25 ]TJ (wn)Tj [-250 ]TJ (in)Tj [-250 ]TJ (documents)Tj [-250 ]TJ (and)Tj [-250 ]TJ (tha)Tj [1 ]TJ (t)Tj [-250 ]TJ (document)Tj 
+104.60699 -12.95098 Td
+(page)Tj [-250 ]TJ (size)Tj [-250 ]TJ (is)Tj [-250 ]TJ (initialised)Tj [-250 ]TJ (corre)Tj [1 ]TJ (ctly)Tj [65 ]TJ (.)Tj 
+ET
+1 0 0 1 0 -31.50199 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -0.39898 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Item)Tj [-278 ]TJ (2)Tj [-7610 ]TJ (Suppo)Tj [1 ]TJ (r)Tj [-20 ]TJ (t)Tj [-278 ]TJ (f)Tj [20 ]TJ (or)Tj [-278 ]TJ (b)Tj [20 ]TJ (uilding)Tj [-278 ]TJ (OpenSP)Tj [-278 ]TJ (1.5)Tj 
+ET
+1 0 0 1 0 -3.38699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17498 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(References)Tj [-6058 ]TJ (Ian)Tj [-250 ]TJ (Ca)Tj [1 ]TJ (stle,)Tj [-250 ]TJ (Karl)Tj [-250 ]TJ (Eichw)Tj [10 ]TJ (alder)Tj 
+0 -15.16299 Td
+(Cate)Tj [15 ]TJ (gory)Tj [-6849 ]TJ (Softw)Tj [10 ]TJ (a)Tj [1 ]TJ (re)Tj [-250 ]TJ (Bug)Tj 
+0 -15.16299 Td
+(Problem)Tj [-7111 ]TJ (OpenSP)Tj [-249 ]TJ (is)Tj [-250 ]TJ (no)Tj [25 ]TJ (w)Tj [-250 ]TJ (at)Tj [-250 ]TJ (v)Tj [15 ]TJ (ersion)Tj [-250 ]TJ (1.5)Tj [-250 ]TJ (which)Tj [-250 ]TJ (has)Tj [-250 ]TJ (man)Tj [15 ]TJ (y)Tj [-250 ]TJ (impro)Tj [15 ]TJ (v)Tj [15 ]TJ (ements)Tj [-250 ]TJ (o)Tj [15 ]TJ (v)Tj [15 ]TJ (er)Tj [-250 ]TJ (1.3.)Tj [1 ]TJ (4)Tj 
+0 -15.16299 Td
+(Resolution)Tj [-6166 ]TJ (It)Tj [-250 ]TJ (is)Tj [-250 ]TJ (d)Tj [1 ]TJ (esirable)Tj [-250 ]TJ (to)Tj [-250 ]TJ (use)Tj [-250 ]TJ (OpenSP)Tj [-250 ]TJ (1.5)Tj [-250 ]TJ (which)Tj [-250 ]TJ (has)Tj [-250 ]TJ (man)Tj [15 ]TJ (y)Tj [-250 ]TJ (impro)Tj [15 ]TJ (v)Tj [15 ]TJ (ements)Tj [-250 ]TJ (o)Tj [15 ]TJ (v)Tj [16 ]TJ (er)Tj [-250 ]TJ (v)Tj [15 ]TJ (ersion)Tj 
+104.60699 -12.95098 Td
+(1.3.4)Tj [-250 ]TJ (which)Tj [-250 ]TJ (shipped)Tj [-250 ]TJ (with)Tj [-250 ]TJ (openjad)Tj [1 ]TJ (e)Tj [-250 ]TJ (1.3.1.)Tj [-250 ]TJ (Ho)Tj [25 ]TJ (we)Tj [25 ]TJ (v)Tj [15 ]TJ (er)Tj [40 ]TJ (,)Tj [-250 ]TJ (it)Tj [-250 ]TJ (is)Tj [-250 ]TJ (a)Tj [15 ]TJ (wkw)Tj [10 ]TJ (ard)Tj [-250 ]TJ (ha)Tj [20 ]TJ (ving)Tj [-250 ]TJ (to)Tj 
+0 -12.95199 Td
+(ha)Tj [20 ]TJ (v)Tj [15 ]TJ (e)Tj [-250 ]TJ (tw)Tj [10 ]TJ (o)Tj [-250 ]TJ (v)Tj [15 ]TJ (ersions)Tj [-250 ]TJ (of)Tj [-250 ]TJ (OpenSP)Tj [-250 ]TJ (at)Tj [-250 ]TJ (th)Tj [1 ]TJ (e)Tj [-250 ]TJ (same)Tj [-250 ]TJ (time.)Tj [-250 ]TJ (OpenJade)Tj [-250 ]TJ (1.4)Tj [-250 ]TJ (is)Tj [-250 ]TJ (not)Tj [-250 ]TJ (ready)Tj [-250 ]TJ (for)Tj 
+0 -12.95098 Td
+(release)Tj [-250 ]TJ (yet,)Tj [-250 ]TJ (so)Tj [-250 ]TJ (v)Tj [15 ]TJ (ersion)Tj [-250 ]TJ (1.3.2)Tj [-250 ]TJ (will)Tj [-249 ]TJ (link)Tj [-250 ]TJ (ag)Tj [5 ]TJ (ainst)Tj [-250 ]TJ (OpenSP)Tj [-250 ]TJ (1.5)Tj [-250 ]TJ (and)Tj [-250 ]TJ (later)Tj [-250 ]TJ (-)Tj [-250 ]TJ (and)Tj [-250 ]TJ (no)Tj 
+0 -12.95199 Td
+(longer)Tj [-250 ]TJ (includes)Tj [-250 ]TJ (the)Tj [-250 ]TJ (old)Tj [-250 ]TJ (v)Tj [15 ]TJ (ersion)Tj [-250 ]TJ (1)Tj [1 ]TJ (.3.4)Tj [-250 ]TJ (of)Tj [-250 ]TJ (OpenSP)Tj [111 ]TJ (.)Tj 
+ET
+1 0 0 1 0 -100.68199 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -0.39898 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Item)Tj [-278 ]TJ (3)Tj [-7610 ]TJ (Corre)Tj [1 ]TJ (ct)Tj [-278 ]TJ (de\002nition)Tj [-278 ]TJ (of)Tj [-278 ]TJ ("attrib)Tj [20 ]TJ (ute")Tj [-278 ]TJ (in)Tj [-278 ]TJ (b)Tj [20 ]TJ (uiltin.dsl)Tj 
+ET
+1 0 0 1 0 -3.38699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(References)Tj [-6058 ]TJ (T)Tj [80 ]TJ (oby)Tj [-250 ]TJ (Sp)Tj [1 ]TJ (eight,)Tj [-250 ]TJ (Debian)Tj [-250 ]TJ (Bug)Tj [-250 ]TJ (#145242)Tj 
+0 -15.16398 Td
+(Cate)Tj [15 ]TJ (gory)Tj [-6849 ]TJ (Softw)Tj [10 ]TJ (a)Tj [1 ]TJ (re)Tj [-250 ]TJ (Bug)Tj 
+0 -15.16299 Td
+(Problem)Tj [-7111 ]TJ (The)Tj [-250 ]TJ (de\002)Tj [1 ]TJ (nition)Tj [-250 ]TJ (of)Tj [-250 ]TJ ("attrib)Tj [20 ]TJ (ute")Tj [-250 ]TJ (\(ISO/IEC)Tj [-250 ]TJ (10179:1996,)Tj [-250 ]TJ (section)Tj [-250 ]TJ (10.2.5\))Tj [-249 ]TJ (for)Tj [-250 ]TJ (SGML)Tj 
+104.60699 -12.95098 Td
+(property)Tj [-250 ]TJ (operations)Tj [-250 ]TJ (w)Tj [10 ]TJ (as)Tj [-250 ]TJ (not)Tj [-250 ]TJ (corr)Tj [1 ]TJ (ect.)Tj 
+-104.60699 -15.16299 Td
+(Resolution)Tj [-6166 ]TJ (The)Tj [-250 ]TJ (de\002)Tj [1 ]TJ (nition)Tj [-250 ]TJ (has)Tj [-250 ]TJ (been)Tj [-250 ]TJ (corrected)Tj [-250 ]TJ (in)Tj [-250 ]TJ (accordance)Tj [-250 ]TJ (with)Tj [-250 ]TJ (the)Tj [-250 ]TJ (standar)Tj [1 ]TJ (d.)Tj 
+ET
+1 0 0 1 0 -61.82899 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -0.39799 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Item)Tj [-278 ]TJ (4)Tj [-7610 ]TJ (XML)Tj [-278 ]TJ (b)Tj [1 ]TJ (ac)Tj [20 ]TJ (kend)Tj [-278 ]TJ (doesn't)Tj [-278 ]TJ (quote)Tj [-278 ]TJ ("&")Tj [-278 ]TJ (in)Tj [-278 ]TJ (attrib)Tj [20 ]TJ (ute)Tj [-278 ]TJ (v)Tj [20 ]TJ (alues)Tj 
+ET
+1 0 0 1 0 -3.38798 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(References)Tj [-6058 ]TJ (T)Tj [80 ]TJ (oby)Tj [-250 ]TJ (Sp)Tj [1 ]TJ (eight,)Tj [-250 ]TJ (Debian)Tj [-250 ]TJ (Bug)Tj [-250 ]TJ (#147073)Tj 
+0 -15.16299 Td
+(Cate)Tj [15 ]TJ (gory)Tj [-6849 ]TJ (Softw)Tj [10 ]TJ (a)Tj [1 ]TJ (re)Tj [-250 ]TJ (Bug)Tj 
+0 -15.16299 Td
+(Problem)Tj [-7111 ]TJ (When)Tj [-250 ]TJ (u)Tj [1 ]TJ (sing)Tj [-250 ]TJ (OpenJade)Tj [-250 ]TJ (with)Tj [-250 ]TJ (the)Tj [-250 ]TJ (XML)Tj [-250 ]TJ (or)Tj [-250 ]TJ (SGML)Tj [-250 ]TJ (back)Tj [10 ]TJ (end)Tj [-250 ]TJ (to)Tj [-250 ]TJ (output)Tj [-250 ]TJ (a)Tj [1 ]TJ (ttrib)Tj [20 ]TJ (ute)Tj 
+104.60699 -12.95199 Td
+(v)Tj [25 ]TJ (alues)Tj [-250 ]TJ (containing)Tj [-250 ]TJ (the)Tj [-250 ]TJ ('&')Tj [-250 ]TJ (chara)Tj [1 ]TJ (cter)Tj [40 ]TJ (,)Tj [-250 ]TJ (the)Tj [-250 ]TJ (output)Tj [-250 ]TJ (is)Tj [-250 ]TJ (not)Tj [-250 ]TJ (well-formed.)Tj 
+-104.60699 -15.16299 Td
+(Resolution)Tj [-6166 ]TJ (Fix)Tj [15 ]TJ (ed)Tj [-250 ]TJ (t)Tj [1 ]TJ (he)Tj [-250 ]TJ (T)Tj [35 ]TJ (ransform)Tj [-250 ]TJ (FO)Tj [40 ]TJ (T)Tj [-250 ]TJ (Builder)Tj [-250 ]TJ (so)Tj [-250 ]TJ (that)Tj [-250 ]TJ (for)Tj [-250 ]TJ (XML)Tj [-250 ]TJ (output)Tj [-250 ]TJ (the)Tj [-250 ]TJ ('&')Tj [-249 ]TJ (character)Tj [-250 ]TJ (is)Tj 
+104.60699 -12.95098 Td
+(properly)Tj [-250 ]TJ (quoted.)Tj 
+ET
+1 0 0 1 0 -74.77899 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 -47.82099 -42.57099 cm
+
+BT
+/N87 12.05499 Tf
+0 0 Td
+(V)Tj [50 ]TJ (er)Tj [15 ]TJ (sion)Tj [-278 ]TJ (1.3.1)Tj 
+/N90 9.96299 Tf
+47.82099 -18.97898 Td
+(Released)Tj [-250 ]TJ (J)Tj [15 ]TJ (anuary)Tj [-250 ]TJ (2002.)Tj 
+/N81 9.96299 Tf
+102.79399 0 Td
+(This)Tj [-250 ]TJ (release)Tj [-250 ]TJ (is)Tj [-250 ]TJ (primarily)Tj [-249 ]TJ (a)Tj [-250 ]TJ (maintenance)Tj [-250 ]TJ (release.)Tj [-250 ]TJ (It)Tj [-250 ]TJ (deli)Tj [25 ]TJ (v)Tj [15 ]TJ (ers)Tj [-250 ]TJ (tw)Tj [10 ]TJ (o)Tj [-250 ]TJ (k)Tj [10 ]TJ (e)Tj [15 ]TJ (y)Tj [-250 ]TJ (adv)Tj [25 ]TJ (antages)Tj 
+-102.79399 -12.95098 Td
+(o)Tj [15 ]TJ (v)Tj [15 ]TJ (er)Tj [-250 ]TJ (the)Tj [-250 ]TJ (OpenJade)Tj [-250 ]TJ (1.3)Tj [-250 ]TJ (release)Tj [1 ]TJ (:)Tj [-250 ]TJ (Support)Tj [-250 ]TJ (for)Tj [-250 ]TJ (contemporary)Tj [-250 ]TJ (platforms)Tj [-250 ]TJ (\(operating)Tj [-250 ]TJ (system)Tj [1 ]TJ (s)Tj [-250 ]TJ (and)Tj [-250 ]TJ (compilers\))Tj 
+0 -12.95098 Td
+(and)Tj [-250 ]TJ (incorporates)Tj [-250 ]TJ (the)Tj [-250 ]TJ (v)Tj [25 ]TJ (arious)Tj [-249 ]TJ (patches)Tj [-250 ]TJ (and)Tj [-250 ]TJ (impro)Tj [15 ]TJ (v)Tj [15 ]TJ (ements,)Tj [-250 ]TJ (especially)Tj [-250 ]TJ (to)Tj [-250 ]TJ (the)Tj [-250 ]TJ (T)Tj [70 ]TJ (eX)Tj [-250 ]TJ (back)Tj [10 ]TJ (en)Tj [1 ]TJ (d,)Tj [-250 ]TJ (which)Tj [-250 ]TJ (ha)Tj [20 ]TJ (v)Tj [15 ]TJ (e)Tj [-250 ]TJ (been)Tj 
+0 -12.95199 Td
+(e)Tj [15 ]TJ (xtensi)Tj [25 ]TJ (v)Tj [15 ]TJ (ely)Tj [-250 ]TJ (used)Tj [-250 ]TJ (o)Tj [15 ]TJ (v)Tj [15 ]TJ (er)Tj [-250 ]TJ (the)Tj [-250 ]TJ (last)Tj [-249 ]TJ (fe)Tj [25 ]TJ (w)Tj [-250 ]TJ (years.)Tj [-250 ]TJ (Probably)Tj [-250 ]TJ (the)Tj [-250 ]TJ (biggest)Tj [-250 ]TJ (bene\002t)Tj [-250 ]TJ (to)Tj [-250 ]TJ (T)Tj [70 ]TJ (eX)Tj [-250 ]TJ (back)Tj [10 ]TJ (end)Tj [-250 ]TJ (us)Tj [1 ]TJ (ers)Tj [-250 ]TJ (are)Tj [-250 ]TJ (the)Tj 
+0 -12.95098 Td
+(enhanced)Tj [-250 ]TJ (table)Tj [-250 ]TJ (support)Tj [-250 ]TJ (and)Tj [-250 ]TJ (i)Tj [1 ]TJ (mpro)Tj [15 ]TJ (v)Tj [15 ]TJ (ed)Tj [-250 ]TJ (tw)Tj [10 ]TJ (o)Tj [-250 ]TJ (sided)Tj [-250 ]TJ (output)Tj [-250 ]TJ (support)Tj [-250 ]TJ (\(in)Tj [-250 ]TJ (conjunction)Tj [-250 ]TJ (with)Tj [-250 ]TJ (imp)Tj [1 ]TJ (ro)Tj [15 ]TJ (v)Tj [15 ]TJ (ements)Tj [-250 ]TJ (to)Tj [-250 ]TJ (the)Tj 
+0 -12.95199 Td
+(companion)Tj [-250 ]TJ (jadete)Tj [15 ]TJ (x)Tj [-250 ]TJ (package\))Tj [1 ]TJ (.)Tj 
+0 -17.93299 Td
+(The)Tj [-250 ]TJ (follo)Tj [25 ]TJ (wing)Tj [-250 ]TJ (table)Tj [-250 ]TJ (details)Tj [-249 ]TJ (the)Tj [-250 ]TJ (major)Tj [-250 ]TJ (impro)Tj [15 ]TJ (v)Tj [15 ]TJ (ements)Tj [-250 ]TJ (in)Tj [-250 ]TJ (Openjade)Tj [-250 ]TJ (1.3.1)Tj 
+/N90 9.96299 Tf
+0 -27.89498 Td
+(T)Tj [92 ]TJ (able)Tj [-250 ]TJ (4.)Tj [-250 ]TJ (Changes)Tj [-250 ]TJ (f)Tj [25 ]TJ (or)Tj [-250 ]TJ (r)Tj [18 ]TJ (eleas)Tj [1 ]TJ (e)Tj [-250 ]TJ (1.3.1)Tj 
+ET
+1 0 0 1 47.82099 -141.94699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17498 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Item)Tj [-278 ]TJ (1)Tj [-7610 ]TJ (Suppo)Tj [1 ]TJ (r)Tj [-20 ]TJ (t)Tj [-278 ]TJ (f)Tj [20 ]TJ (or)Tj [-278 ]TJ (MacOS)Tj [-278 ]TJ (X/)Tj [-278 ]TJ (Darwin)Tj 
+ET
+1 0 0 1 0 -3.38699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 -47.82099 -103.64199 cm
+
+0 g
+0 G
+1 0 0 1 461.26998 0 cm
+
+BT
+/N117 9.96299 Tf
+0 0 Td
+(5)Tj 
+ET
+1 0 0 1 4.98199 0 cm
+
+0 g
+0 G
+PDFVars/TermAll get exec end end
+userdict /pgsave get restore
+showpage
+%%PageTrailer
+%%EndPage
+%%Page: 12 12
+%%BeginPageSetup
+userdict /pgsave save put
+PDFVars begin PDF begin PDFVars/InitAll get exec
+1.14301 1.47949 translate
+%%EndPageSetup
+0 0 609.71398 789.04098 RC
+1 0 0 1 71.73098 729.26499 cm
+
+0 g
+0 G
+1 0 0 1 0 3.58699 cm
+
+BT
+/N117 9.96299 Tf
+0 0 Td
+(OpenJ)Tj [35 ]TJ (ade)Tj [-250 ]TJ (1.3.2)Tj [-250 ]TJ (Release)Tj [-250 ]TJ (Notes)Tj 
+ET
+1 0 0 1 466.25199 -3.58699 cm
+
+0 g
+0 G
+1 0 0 1 -418.43099 -11.35699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Item)Tj [-278 ]TJ (1)Tj [-7610 ]TJ (Suppo)Tj [1 ]TJ (r)Tj [-20 ]TJ (t)Tj [-278 ]TJ (f)Tj [20 ]TJ (or)Tj [-278 ]TJ (MacOS)Tj [-278 ]TJ (X/)Tj [-278 ]TJ (Darwin)Tj 
+ET
+1 0 0 1 0 -2.98899 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17498 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(References)Tj [-6058 ]TJ (Fink)Tj [-250 ]TJ (P)Tj [1 ]TJ (roject;)Tj [-250 ]TJ (K)Tj [35 ]TJ (ogul\351,)Tj [-250 ]TJ (Ryo)Tj 
+0 -15.16299 Td
+(Cate)Tj [15 ]TJ (gory)Tj [-6849 ]TJ (Softw)Tj [10 ]TJ (a)Tj [1 ]TJ (re)Tj [-250 ]TJ (Bug)Tj 
+0 -15.16299 Td
+(Problem)Tj [-7111 ]TJ (OpenJa)Tj [1 ]TJ (de)Tj [-250 ]TJ (1.3)Tj [-250 ]TJ (does)Tj [-250 ]TJ (not)Tj [-250 ]TJ (b)Tj [20 ]TJ (uild)Tj [-250 ]TJ (and)Tj [-250 ]TJ (run)Tj [-250 ]TJ (on)Tj [-250 ]TJ (the)Tj [-250 ]TJ (Mac)Tj [-250 ]TJ (OS)Tj [-250 ]TJ (X/Darwin)Tj [-250 ]TJ (plat)Tj [1 ]TJ (form)Tj 
+0 -15.16299 Td
+(Resolution)Tj [-6166 ]TJ (OpenJa)Tj [1 ]TJ (de)Tj [-250 ]TJ (1.3.1)Tj [-250 ]TJ (has)Tj [-250 ]TJ (been)Tj [-250 ]TJ (enhanced)Tj [-250 ]TJ (to)Tj [-250 ]TJ (support)Tj [-250 ]TJ (Mac)Tj [-250 ]TJ (OS)Tj [-250 ]TJ (X/Darwin)Tj [-250 ]TJ (1.4)Tj [1 ]TJ (.)Tj [-250 ]TJ (The)Tj 
+104.60699 -12.95098 Td
+(autoconf)Tj [-250 ]TJ (con\002guration)Tj [-250 ]TJ (system)Tj [-250 ]TJ (h)Tj [1 ]TJ (as)Tj [-250 ]TJ (been)Tj [-250 ]TJ (upgraded)Tj [-250 ]TJ (and)Tj [-250 ]TJ (also)Tj [-250 ]TJ (includes)Tj [-250 ]TJ (speci\002c)Tj 
+0 -12.95199 Td
+(platform)Tj [-250 ]TJ (support.)Tj [-250 ]TJ (Some)Tj [-250 ]TJ (minor)Tj [-250 ]TJ (c)Tj [1 ]TJ (ode)Tj [-250 ]TJ (alterations)Tj [-250 ]TJ (to)Tj [-250 ]TJ (impro)Tj [15 ]TJ (v)Tj [15 ]TJ (e)Tj [-250 ]TJ (code)Tj [-250 ]TJ (portability)Tj 
+0 -12.95098 Td
+(\(C++)Tj [-250 ]TJ (style)Tj [-250 ]TJ (changes\).)Tj [-250 ]TJ (Note)Tj [-250 ]TJ (tha)Tj [1 ]TJ (t)Tj [-250 ]TJ (the)Tj [-250 ]TJ (POSIX)Tj [-250 ]TJ (locale)Tj [-250 ]TJ (feature)Tj [-250 ]TJ (is)Tj [-250 ]TJ (not)Tj [-250 ]TJ (a)Tj [20 ]TJ (v)Tj [25 ]TJ (ailable)Tj [-250 ]TJ (on)Tj 
+0 -12.95199 Td
+(this)Tj [-250 ]TJ (platform.)Tj 
+ET
+1 0 0 1 0 -100.68199 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -0.39799 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17498 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Item)Tj [-278 ]TJ (2)Tj [-7610 ]TJ (UNIX)Tj [-277 ]TJ (on-line)Tj [-278 ]TJ (man)Tj [10 ]TJ (ual)Tj [-278 ]TJ (pa)Tj [10 ]TJ (g)Tj [-10 ]TJ (es)Tj 
+ET
+1 0 0 1 0 -3.38699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(References)Tj [-6058 ]TJ (None)Tj 
+0 -15.16299 Td
+(Cate)Tj [15 ]TJ (gory)Tj [-6849 ]TJ (Docum)Tj [1 ]TJ (entation)Tj [-250 ]TJ (Bug)Tj 
+0 -15.16398 Td
+(Problem)Tj [-7111 ]TJ (No)Tj [-250 ]TJ (on-l)Tj [1 ]TJ (ine)Tj [-250 ]TJ (manual)Tj [-250 ]TJ (\(man\))Tj [-250 ]TJ (pages)Tj [-250 ]TJ (a)Tj [20 ]TJ (v)Tj [25 ]TJ (ailable)Tj [-250 ]TJ (on)Tj [-250 ]TJ (UNIX)Tj [-250 ]TJ (platforms)Tj 
+0 -15.16299 Td
+(Resolution)Tj [-6166 ]TJ (OpenJa)Tj [1 ]TJ (de)Tj [-250 ]TJ (1.3.1)Tj [-250 ]TJ (no)Tj [25 ]TJ (w)Tj [-250 ]TJ (has)Tj [-250 ]TJ (a)Tj [-250 ]TJ (man)Tj [-250 ]TJ (page)Tj [-250 ]TJ (for)Tj [-250 ]TJ (e)Tj [25 ]TJ (v)Tj [15 ]TJ (ery)Tj [-250 ]TJ (command.)Tj [-250 ]TJ (Additional)Tj [1 ]TJ (ly)Tj [65 ]TJ (,)Tj [-250 ]TJ (if)Tj 
+104.60699 -12.95098 Td
+(OpenJade)Tj [-250 ]TJ (is)Tj [-250 ]TJ (used)Tj [-250 ]TJ (as)Tj [-250 ]TJ (a)Tj [-250 ]TJ (replacem)Tj [1 ]TJ (ent)Tj [-250 ]TJ (for)Tj [-250 ]TJ (Jade,)Tj [-250 ]TJ (then)Tj [-250 ]TJ (compatibility)Tj [-250 ]TJ (man)Tj [-250 ]TJ (pages)Tj [-250 ]TJ (are)Tj 
+0 -12.95199 Td
+(included)Tj [-250 ]TJ (\(i.e.)Tj [-250 ]TJ (man)Tj [-250 ]TJ (jade)Tj [-250 ]TJ (is)Tj [-250 ]TJ (synon)Tj [15 ]TJ (y)Tj [1 ]TJ (mous)Tj [-250 ]TJ (with)Tj [-250 ]TJ (man)Tj [-250 ]TJ (openjade\).)Tj 
+ET
+1 0 0 1 0 -74.77999 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -0.39799 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17498 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Item)Tj [-278 ]TJ (3)Tj [-7610 ]TJ (Upgra)Tj [1 ]TJ (de)Tj [-278 ]TJ (GNU)Tj [-278 ]TJ (sour)Tj [20 ]TJ (ce)Tj [-278 ]TJ (con\002guration)Tj [-278 ]TJ (tools)Tj 
+ET
+1 0 0 1 0 -3.38699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(References)Tj [-6058 ]TJ (V)Tj [111 ]TJ (ariou)Tj [1 ]TJ (s)Tj [-250 ]TJ (sourcefor)Tj [18 ]TJ (ge)Tj [-250 ]TJ (problem)Tj [-250 ]TJ (reports,)Tj [-250 ]TJ (SuSE)Tj [-250 ]TJ (Linux)Tj [-250 ]TJ (7.3,)Tj [-250 ]TJ (Red)Tj [-250 ]TJ (Hat)Tj [-250 ]TJ (7.2,)Tj [-249 ]TJ (Red)Tj [-250 ]TJ (Hat)Tj 
+104.60699 -12.95199 Td
+(Bugzilla)Tj [-250 ]TJ (#46212)Tj 
+-104.60699 -15.16299 Td
+(Cate)Tj [15 ]TJ (gory)Tj [-6849 ]TJ (Softw)Tj [10 ]TJ (a)Tj [1 ]TJ (re)Tj [-250 ]TJ (Bug)Tj 
+0 -15.16299 Td
+(Problem)Tj [-7111 ]TJ (The)Tj [-250 ]TJ (so)Tj [1 ]TJ (urce)Tj [-250 ]TJ (con\002guration)Tj [-250 ]TJ (system)Tj [-250 ]TJ (is)Tj [-250 ]TJ (based)Tj [-250 ]TJ (on)Tj [-250 ]TJ (old)Tj [-250 ]TJ (v)Tj [15 ]TJ (ersions)Tj [-250 ]TJ (of)Tj [-250 ]TJ (libto)Tj [1 ]TJ (ol)Tj [-250 ]TJ (and)Tj 
+104.60699 -12.95098 Td
+(autoconf.)Tj [-250 ]TJ (In)Tj [-250 ]TJ (addition,)Tj [-250 ]TJ (there)Tj [-250 ]TJ (are)Tj [-250 ]TJ (p)Tj [1 ]TJ (roblems)Tj [-250 ]TJ (with)Tj [-250 ]TJ (the)Tj [-250 ]TJ (generated)Tj [-250 ]TJ (Mak)Tj [10 ]TJ (e\002le)Tj [-250 ]TJ (\002les)Tj 
+0 -12.95199 Td
+(such)Tj [-250 ]TJ (that)Tj [-250 ]TJ (installation)Tj [-250 ]TJ (directo)Tj [1 ]TJ (ries)Tj [-250 ]TJ (are)Tj [-250 ]TJ (not)Tj [-250 ]TJ (created.)Tj 
+-104.60699 -15.16299 Td
+(Resolution)Tj [-6166 ]TJ (Upgrad)Tj [1 ]TJ (ed)Tj [-243 ]TJ (to)Tj [-243 ]TJ (autoconf)Tj [-243 ]TJ (2.52)Tj [-243 ]TJ (and)Tj [-243 ]TJ (libtool)Tj [-243 ]TJ (1.4.)Tj [-243 ]TJ (Upgraded)Tj [-243 ]TJ (the)Tj [-243 ]TJ (v)Tj [25 ]TJ (arious)Tj [-243 ]TJ (support)Tj [-243 ]TJ (\002les.)Tj 
+104.60699 -12.95098 Td
+(Included)Tj [-250 ]TJ (elements)Tj [-250 ]TJ (of)Tj [-250 ]TJ (automak)Tj [10 ]TJ (e)Tj [-249 ]TJ (support.)Tj [-250 ]TJ (Made)Tj [-250 ]TJ (the)Tj [-250 ]TJ (Mak)Tj [10 ]TJ (e\002les)Tj [-250 ]TJ (more)Tj [-250 ]TJ (rob)Tj [20 ]TJ (ust.)Tj 
+0 -12.95199 Td
+(These)Tj [-250 ]TJ (changes)Tj [-250 ]TJ (should)Tj [-250 ]TJ (f)Tj [10 ]TJ (acilitat)Tj [1 ]TJ (e)Tj [-250 ]TJ (porting)Tj [-250 ]TJ (to)Tj [-250 ]TJ (ne)Tj [25 ]TJ (w/updated)Tj [-250 ]TJ (en)Tj [40 ]TJ (vironments)Tj [-250 ]TJ (\(i.e.)Tj 
+0 -12.95098 Td
+(those)Tj [-250 ]TJ (supported)Tj [-250 ]TJ (by)Tj [-250 ]TJ (ne)Tj [25 ]TJ (wer)Tj [-250 ]TJ (v)Tj [15 ]TJ (ersion)Tj [1 ]TJ (s)Tj [-250 ]TJ (of)Tj [-250 ]TJ (autoconf\).)Tj [-250 ]TJ (W)Tj [80 ]TJ (ork)Tj [-250 ]TJ (has)Tj [-250 ]TJ (been)Tj [-250 ]TJ (done)Tj [-250 ]TJ (to)Tj 
+0 -12.95199 Td
+(enhance)Tj [-250 ]TJ (some)Tj [-250 ]TJ (of)Tj [-250 ]TJ (the)Tj [-250 ]TJ (custom)Tj [-250 ]TJ (aut)Tj [1 ]TJ (oconf)Tj [-250 ]TJ (tests)Tj [-250 ]TJ (to)Tj [-250 ]TJ (impro)Tj [15 ]TJ (v)Tj [15 ]TJ (e)Tj [-250 ]TJ (reliability)Tj [65 ]TJ (.)Tj 
+ET
+1 0 0 1 0 -139.53698 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -0.39799 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17498 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Item)Tj [-278 ]TJ (4)Tj [-7610 ]TJ (Suppo)Tj [1 ]TJ (r)Tj [-20 ]TJ (t)Tj [-278 ]TJ (f)Tj [20 ]TJ (or)Tj [-278 ]TJ (XML)Tj [-278 ]TJ (Byte)Tj [-278 ]TJ (Or)Tj [20 ]TJ (der)Tj [-278 ]TJ (Marks)Tj [-278 ]TJ (\(BOM\))Tj 
+ET
+1 0 0 1 0 -3.38699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(References)Tj [-6058 ]TJ (Source)Tj [-249 ]TJ (F)Tj [15 ]TJ (or)Tj [18 ]TJ (ge)Tj [-250 ]TJ (b)Tj [20 ]TJ (ug)Tj [-250 ]TJ (#442560)Tj [-250 ]TJ (\(T)Tj [70 ]TJ (erje)Tj [-250 ]TJ (Bless/Liam)Tj [-250 ]TJ (Quinn\))Tj 
+0 -15.16299 Td
+(Cate)Tj [15 ]TJ (gory)Tj [-6849 ]TJ (Softw)Tj [10 ]TJ (a)Tj [1 ]TJ (re)Tj [-250 ]TJ (Bug)Tj 
+0 -15.16398 Td
+(Problem)Tj [-7111 ]TJ (Since)Tj [-249 ]TJ (OpenJade)Tj [-250 ]TJ (1.3)Tj [-250 ]TJ (w)Tj [10 ]TJ (as)Tj [-250 ]TJ (released,)Tj [-250 ]TJ (a)Tj [-250 ]TJ (second)Tj [-250 ]TJ (edition)Tj [-250 ]TJ (of)Tj [-250 ]TJ (the)Tj [-250 ]TJ (XML)Tj [-250 ]TJ (1)Tj [1 ]TJ (.0)Tj 
+104.60699 -12.95098 Td
+(speci\002cation)Tj [-250 ]TJ (has)Tj [-250 ]TJ (been)Tj [-250 ]TJ (release)Tj [1 ]TJ (d)Tj [-250 ]TJ (\(REC-xml-20001006\).)Tj [-250 ]TJ (This)Tj [-250 ]TJ (speci\002cation)Tj 
+0 -12.95098 Td
+(introduced)Tj [-250 ]TJ (the)Tj [-250 ]TJ (concept)Tj [-250 ]TJ (of)Tj [-250 ]TJ (Byte)Tj [-250 ]TJ (O)Tj [1 ]TJ (rder)Tj [-250 ]TJ (Marks)Tj [-250 ]TJ (to)Tj [-250 ]TJ (increase)Tj [-250 ]TJ (the)Tj [-250 ]TJ (sophistication)Tj [-250 ]TJ (of)Tj 
+0 -12.95199 Td
+(the)Tj [-250 ]TJ (detection)Tj [-250 ]TJ (of)Tj [-250 ]TJ (the)Tj [-250 ]TJ (character)Tj [-250 ]TJ (e)Tj [1 ]TJ (ncoding)Tj [-250 ]TJ (system.)Tj [-250 ]TJ (OpenJade)Tj [-250 ]TJ (1.3)Tj [-250 ]TJ (w)Tj [10 ]TJ (ould)Tj [-250 ]TJ (not)Tj 
+0 -12.95098 Td
+(recognize)Tj [-250 ]TJ (these,)Tj [-250 ]TJ (and)Tj [-250 ]TJ (rejected)Tj [-250 ]TJ (a)Tj [1 ]TJ (n)Tj [15 ]TJ (y)Tj [-250 ]TJ (XML)Tj [-250 ]TJ (\002le)Tj [-250 ]TJ (which)Tj [-250 ]TJ (included)Tj [-250 ]TJ (these)Tj [-250 ]TJ (as)Tj [-250 ]TJ (in)Tj [40 ]TJ (v)Tj [25 ]TJ (alid.)Tj 
+-104.60699 -15.16299 Td
+(Resolution)Tj [-6166 ]TJ (XML)Tj [-250 ]TJ (1)Tj [1 ]TJ (.0)Tj [-250 ]TJ (Byte)Tj [-250 ]TJ (Order)Tj [-250 ]TJ (Marks)Tj [-250 ]TJ (are)Tj [-250 ]TJ (no)Tj [25 ]TJ (w)Tj [-250 ]TJ (accepted)Tj [-250 ]TJ (as)Tj [-250 ]TJ (v)Tj [25 ]TJ (alid)Tj [-250 ]TJ (XML.)Tj 
+ET
+1 0 0 1 0 -100.68299 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -0.39799 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Item)Tj [-278 ]TJ (5)Tj [-7610 ]TJ (Fix)Tj [-278 ]TJ (m)Tj [1 ]TJ (issing)Tj [-278 ]TJ (white)Tj [-278 ]TJ (space)Tj [-278 ]TJ (pr)Tj [20 ]TJ (ob)Tj [10 ]TJ (lem)Tj [-278 ]TJ (in)Tj [-278 ]TJ (pr)Tj [20 ]TJ (ocessing)Tj [-278 ]TJ (in)Tj [1 ]TJ (struction)Tj [-278 ]TJ (\003o)Tj [15 ]TJ (w)Tj 
+104.60699 -12.95199 Td
+(object)Tj 
+ET
+1 0 0 1 0 -16.33898 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(References)Tj [-6058 ]TJ (Source)Tj [-249 ]TJ (F)Tj [15 ]TJ (or)Tj [18 ]TJ (ge)Tj [-250 ]TJ (Ref)Tj [-250 ]TJ (#505113,)Tj [-250 ]TJ (#505124)Tj [-250 ]TJ (\(Markus)Tj [-250 ]TJ (Hoenicka\))Tj 
+ET
+1 0 0 1 -47.82099 -100.58399 cm
+
+0 g
+0 G
+BT
+/N117 9.96299 Tf
+0 0 Td
+(6)Tj 
+ET
+1 0 0 1 466.25199 0 cm
+
+0 g
+0 G
+PDFVars/TermAll get exec end end
+userdict /pgsave get restore
+showpage
+%%PageTrailer
+%%EndPage
+%%Page: 13 13
+%%BeginPageSetup
+userdict /pgsave save put
+PDFVars begin PDF begin PDFVars/InitAll get exec
+1.14301 1.47949 translate
+%%EndPageSetup
+0 0 609.71398 789.04098 RC
+1 0 0 1 71.73098 729.26499 cm
+
+0 g
+0 G
+1 0 0 1 345.13699 3.58699 cm
+
+BT
+/N117 9.96299 Tf
+0 0 Td
+(OpenJ)Tj [35 ]TJ (ade)Tj [-250 ]TJ (1.3.2)Tj [-250 ]TJ (Release)Tj [-250 ]TJ (Note)Tj [1 ]TJ (s)Tj 
+ET
+1 0 0 1 121.11499 -3.58699 cm
+
+0 g
+0 G
+1 0 0 1 -418.43099 -11.35699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Item)Tj [-278 ]TJ (5)Tj [-7610 ]TJ (Fix)Tj [-278 ]TJ (m)Tj [1 ]TJ (issing)Tj [-278 ]TJ (white)Tj [-278 ]TJ (space)Tj [-278 ]TJ (pr)Tj [20 ]TJ (ob)Tj [10 ]TJ (lem)Tj [-278 ]TJ (in)Tj [-278 ]TJ (pr)Tj [20 ]TJ (ocessing)Tj [-278 ]TJ (in)Tj [1 ]TJ (struction)Tj [-278 ]TJ (\003o)Tj [15 ]TJ (w)Tj 
+104.60699 -12.95199 Td
+(object)Tj 
+/N81 9.96299 Tf
+-104.60699 -15.16299 Td
+(Cate)Tj [15 ]TJ (gory)Tj [-6849 ]TJ (Softw)Tj [10 ]TJ (a)Tj [1 ]TJ (re)Tj [-250 ]TJ (Bug)Tj 
+0 -15.16299 Td
+(Problem)Tj [-7111 ]TJ (No)Tj [-250 ]TJ (whi)Tj [1 ]TJ (te)Tj [-250 ]TJ (space)Tj [-250 ]TJ (w)Tj [10 ]TJ (as)Tj [-250 ]TJ (emitted)Tj [-250 ]TJ (between)Tj [-250 ]TJ (the)Tj [-250 ]TJ (public-id)Tj [-250 ]TJ (and)Tj [-250 ]TJ (the)Tj [-250 ]TJ (syst)Tj [1 ]TJ (em-id)Tj [-250 ]TJ (causing)Tj 
+104.60699 -12.95199 Td
+(a)Tj [-250 ]TJ (malformed)Tj [-250 ]TJ (XML)Tj [-250 ]TJ (\002le)Tj [-250 ]TJ (to)Tj [-250 ]TJ (be)Tj [-250 ]TJ (gen)Tj [1 ]TJ (erated.)Tj 
+-104.60699 -15.16299 Td
+(Resolution)Tj [-6166 ]TJ (Fix)Tj [15 ]TJ (ed)Tj [-250 ]TJ (O)Tj [1 ]TJ (penJade)Tj [-250 ]TJ (to)Tj [-250 ]TJ (output)Tj [-250 ]TJ (a)Tj [-250 ]TJ (space)Tj [-250 ]TJ (between)Tj [-250 ]TJ (the)Tj [-250 ]TJ (public-id)Tj [-250 ]TJ (and)Tj [-250 ]TJ (the)Tj [-250 ]TJ (s)Tj [1 ]TJ (ystem-id.)Tj 
+ET
+1 0 0 1 0 -74.77999 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -0.39799 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17498 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Item)Tj [-278 ]TJ (6)Tj [-7610 ]TJ (Jadet)Tj [1 ]TJ (e)Tj [15 ]TJ (x)Tj [-278 ]TJ (is)Tj [-278 ]TJ (no)Tj [15 ]TJ (w)Tj [-278 ]TJ (distrib)Tj [20 ]TJ (uted)Tj [-278 ]TJ (independentl)Tj [15 ]TJ (y)Tj 
+ET
+1 0 0 1 0 -3.38699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(References)Tj [-6058 ]TJ (None)Tj 
+0 -15.16299 Td
+(Cate)Tj [15 ]TJ (gory)Tj [-6849 ]TJ (Softw)Tj [10 ]TJ (a)Tj [1 ]TJ (re)Tj [-250 ]TJ (Bug)Tj 
+0 -15.16398 Td
+(Problem)Tj [-7111 ]TJ (OpenJa)Tj [1 ]TJ (de)Tj [-250 ]TJ (1.3)Tj [-250 ]TJ (shipped)Tj [-250 ]TJ (with)Tj [-250 ]TJ (Jadete)Tj [15 ]TJ (x)Tj [-250 ]TJ (2.7.)Tj [-250 ]TJ (Jadete)Tj [15 ]TJ (x)Tj [-250 ]TJ (is)Tj [-250 ]TJ (de)Tj [25 ]TJ (v)Tj [15 ]TJ (eloped)Tj [-250 ]TJ (and)Tj [-250 ]TJ (rel)Tj [1 ]TJ (eased)Tj 
+104.60699 -12.95098 Td
+(separately)Tj [-250 ]TJ (from)Tj [-250 ]TJ (OpenJade.)Tj 
+-104.60699 -15.16299 Td
+(Resolution)Tj [-6166 ]TJ (Remo)Tj [15 ]TJ (v)Tj [15 ]TJ (e)Tj [1 ]TJ (d)Tj [-250 ]TJ (jadete)Tj [15 ]TJ (x)Tj [-250 ]TJ (\002les.)Tj [-250 ]TJ (Jadete)Tj [15 ]TJ (x)Tj [-250 ]TJ (can)Tj [-250 ]TJ (be)Tj [-250 ]TJ (obtained)Tj [-250 ]TJ (from)Tj 
+104.60699 -12.95199 Td
+(http://jadete)Tj [15 ]TJ (x.sourcefor)Tj [18 ]TJ (ge.net)Tj 
+ET
+1 0 0 1 0 -74.77999 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -0.39799 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17498 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Item)Tj [-278 ]TJ (7)Tj [-7610 ]TJ (Suppo)Tj [1 ]TJ (r)Tj [-20 ]TJ (t)Tj [-278 ]TJ (f)Tj [20 ]TJ (or)Tj [-278 ]TJ (FreeBSD)Tj [-278 ]TJ (4.4)Tj 
+ET
+1 0 0 1 0 -3.38699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(References)Tj [-6058 ]TJ (FreeB)Tj [1 ]TJ (SD)Tj [-250 ]TJ (4.4)Tj [-250 ]TJ (openjade)Tj [-250 ]TJ (port)Tj 
+0 -15.16299 Td
+(Cate)Tj [15 ]TJ (gory)Tj [-6849 ]TJ (Softw)Tj [10 ]TJ (a)Tj [1 ]TJ (re)Tj [-250 ]TJ (Bug)Tj 
+0 -15.16299 Td
+(Problem)Tj [-7111 ]TJ (OpenJa)Tj [1 ]TJ (de)Tj [-250 ]TJ (1.3)Tj [-250 ]TJ (w)Tj [10 ]TJ (ould)Tj [-250 ]TJ (not)Tj [-250 ]TJ (b)Tj [20 ]TJ (uild)Tj [-250 ]TJ (on)Tj [-250 ]TJ (FreeBSD)Tj [-250 ]TJ (4.x)Tj 
+0 -15.16398 Td
+(Resolution)Tj [-6166 ]TJ (The)Tj [-250 ]TJ (sou)Tj [1 ]TJ (rce)Tj [-250 ]TJ (con\002guration)Tj [-250 ]TJ (system)Tj [-250 ]TJ (has)Tj [-250 ]TJ (been)Tj [-250 ]TJ (enhanced)Tj [-250 ]TJ (to)Tj [-250 ]TJ (support)Tj [-250 ]TJ (Fre)Tj [1 ]TJ (eBSD)Tj [-250 ]TJ (out)Tj 
+104.60699 -12.95098 Td
+(of)Tj [-250 ]TJ (the)Tj [-250 ]TJ (box.)Tj [-250 ]TJ (Note)Tj [-250 ]TJ (that)Tj [-250 ]TJ (the)Tj [-250 ]TJ (POSIX)Tj [-249 ]TJ (locale)Tj [-250 ]TJ (feature)Tj [-250 ]TJ (of)Tj [-250 ]TJ (OpenJade)Tj [-250 ]TJ (is)Tj [-250 ]TJ (not)Tj [-250 ]TJ (a)Tj [20 ]TJ (v)Tj [25 ]TJ (ailable)Tj 
+0 -12.95098 Td
+(under)Tj [-250 ]TJ (FreeBSD.)Tj 
+ET
+1 0 0 1 0 -74.77999 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -0.39799 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17498 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Item)Tj [-278 ]TJ (8)Tj [-7610 ]TJ (Allo)Tj [15 ]TJ (w)Tj [-277 ]TJ (non)Tj [-278 ]TJ (alpha)Tj [-278 ]TJ (n)Tj [10 ]TJ (umeric)Tj [-278 ]TJ (c)Tj [10 ]TJ (haracter)Tj [15 ]TJ (s)Tj [-278 ]TJ (in)Tj [-278 ]TJ (T)Tj [80 ]TJ (ab)Tj [10 ]TJ (le)Tj [-278 ]TJ (of)Tj [-278 ]TJ (Con)Tj [1 ]TJ (tents)Tj 
+ET
+1 0 0 1 0 -3.38699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(References)Tj [-6058 ]TJ (Red)Tj [-250 ]TJ (Ha)Tj [1 ]TJ (t)Tj [-250 ]TJ (Bugzilla)Tj [-250 ]TJ (#31525)Tj 
+0 -15.16299 Td
+(Cate)Tj [15 ]TJ (gory)Tj [-6849 ]TJ (Softw)Tj [10 ]TJ (a)Tj [1 ]TJ (re)Tj [-250 ]TJ (Bug)Tj 
+0 -15.16299 Td
+(Problem)Tj [-7361 ]TJ (Certa)Tj [1 ]TJ (in)Tj [-250 ]TJ (non)Tj [-250 ]TJ (alpha-numeric)Tj [-250 ]TJ (characters)Tj [-250 ]TJ (\(such)Tj [-250 ]TJ (as)Tj [-250 ]TJ ($\))Tj [-250 ]TJ (do)Tj [-250 ]TJ (not)Tj [-250 ]TJ (appear)Tj [-249 ]TJ (correctly)Tj [-250 ]TJ (in)Tj 
+104.60699 -12.95199 Td
+(the)Tj [-250 ]TJ (table)Tj [-250 ]TJ (of)Tj [-250 ]TJ (contents.)Tj [-250 ]TJ (This)Tj [-250 ]TJ (probl)Tj [1 ]TJ (em)Tj [-250 ]TJ (is)Tj [-250 ]TJ (con\002ned)Tj [-250 ]TJ (to)Tj [-250 ]TJ (the)Tj [-250 ]TJ (T)Tj [70 ]TJ (eX)Tj [-250 ]TJ (back)Tj [10 ]TJ (end.)Tj 
+-104.60699 -15.16299 Td
+(Resolution)Tj [-6166 ]TJ (Specia)Tj [1 ]TJ (l)Tj [-250 ]TJ (characters)Tj [-250 ]TJ (are)Tj [-250 ]TJ (no)Tj [25 ]TJ (w)Tj [-250 ]TJ (correctly)Tj [-250 ]TJ (escaped)Tj [-250 ]TJ (in)Tj [-250 ]TJ (the)Tj [-250 ]TJ (T)Tj [70 ]TJ (eX)Tj [-250 ]TJ (output)Tj [-249 ]TJ (\002le.)Tj 
+ET
+1 0 0 1 0 -61.82798 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -0.39898 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Item)Tj [-278 ]TJ (9)Tj [-7610 ]TJ (Suppo)Tj [1 ]TJ (r)Tj [-20 ]TJ (t)Tj [-278 ]TJ (f)Tj [20 ]TJ (or)Tj [-278 ]TJ (latest)Tj [-278 ]TJ (Win32)Tj [-278 ]TJ (b)Tj [20 ]TJ (uild)Tj [-278 ]TJ (en)Tj [40 ]TJ (vir)Tj [20 ]TJ (onments)Tj 
+ET
+1 0 0 1 0 -3.38699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17498 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(References)Tj [-6058 ]TJ (None)Tj 
+0 -15.16299 Td
+(Cate)Tj [15 ]TJ (gory)Tj [-6849 ]TJ (Softw)Tj [10 ]TJ (a)Tj [1 ]TJ (re)Tj [-250 ]TJ (Bug)Tj 
+0 -15.16299 Td
+(Problem)Tj [-7111 ]TJ (OpenJa)Tj [1 ]TJ (de)Tj [-250 ]TJ (1.3)Tj [-250 ]TJ (does)Tj [-250 ]TJ (not)Tj [-250 ]TJ (b)Tj [20 ]TJ (uild)Tj [-250 ]TJ (with)Tj [-250 ]TJ (V)Tj [60 ]TJ (isual)Tj [-250 ]TJ (C++)Tj [-250 ]TJ (6.0)Tj 
+0 -15.16299 Td
+(Resolution)Tj [-6166 ]TJ (Fix)Tj [-250 ]TJ (C+)Tj [1 ]TJ (+)Tj [-250 ]TJ (style)Tj [-250 ]TJ (to)Tj [-250 ]TJ (be)Tj [-250 ]TJ (compatible)Tj [-250 ]TJ (with)Tj [-250 ]TJ (V)Tj [60 ]TJ (isual)Tj [-250 ]TJ (C++.)Tj [-250 ]TJ (Update)Tj [-250 ]TJ (b)Tj [20 ]TJ (uil)Tj [1 ]TJ (d)Tj [-250 ]TJ (en)Tj [40 ]TJ (vironment.)Tj 
+104.60699 -12.95098 Td
+(OpenJade)Tj [-250 ]TJ (1.3.1)Tj [-250 ]TJ (should)Tj [-250 ]TJ (run)Tj [-250 ]TJ (in)Tj [-250 ]TJ (all)Tj [-250 ]TJ (W)Tj [41 ]TJ (indo)Tj [25 ]TJ (ws)Tj [-250 ]TJ (32)Tj [-250 ]TJ (en)Tj [40 ]TJ (vironments)Tj [-250 ]TJ (from)Tj [-250 ]TJ (W)Tj [40 ]TJ (indo)Tj [25 ]TJ (ws)Tj 
+0 -12.95199 Td
+(95)Tj [-250 ]TJ (through)Tj [-250 ]TJ (W)Tj [40 ]TJ (indo)Tj [25 ]TJ (ws)Tj [-250 ]TJ (NT)Tj [-250 ]TJ (to)Tj [-250 ]TJ (W)Tj [40 ]TJ (indo)Tj [25 ]TJ (w)Tj [1 ]TJ (s)Tj [-250 ]TJ (XP)Tj [111 ]TJ (.)Tj 
+ET
+1 0 0 1 0 -74.77899 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -0.39898 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Item)Tj [-278 ]TJ (10)Tj [-7054 ]TJ (Enhan)Tj [1 ]TJ (cements)Tj [-278 ]TJ (f)Tj [20 ]TJ (or)Tj [-278 ]TJ (Software)Tj [-278 ]TJ (P)Tj [30 ]TJ (ac)Tj [20 ]TJ (ka)Tj [10 ]TJ (ging)Tj 
+ET
+1 0 0 1 0 -3.38699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17498 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(References)Tj [-6058 ]TJ (SuSE)Tj [-250 ]TJ (L)Tj [1 ]TJ (inux)Tj [-250 ]TJ (7.3)Tj 
+0 -15.16299 Td
+(Cate)Tj [15 ]TJ (gory)Tj [-6849 ]TJ (Softw)Tj [10 ]TJ (a)Tj [1 ]TJ (re)Tj [-250 ]TJ (Bug)Tj 
+0 -15.16299 Td
+(Problem)Tj [-7111 ]TJ (Numer)Tj [1 ]TJ (ous)Tj [-250 ]TJ (patches)Tj [-250 ]TJ (need)Tj [-250 ]TJ (to)Tj [-250 ]TJ (be)Tj [-250 ]TJ (applied)Tj [-250 ]TJ (to)Tj [-250 ]TJ (OpenJade)Tj [-250 ]TJ (1.3)Tj [-250 ]TJ (to)Tj [-250 ]TJ (enable)Tj [-250 ]TJ (pa)Tj [1 ]TJ (ckages)Tj [-250 ]TJ (to)Tj 
+104.60699 -12.95098 Td
+(be)Tj [-250 ]TJ (b)Tj [20 ]TJ (uilt)Tj [-250 ]TJ (\(RPM\))Tj 
+ET
+1 0 0 1 -47.82099 -155.29798 cm
+
+0 g
+0 G
+1 0 0 1 460.90199 0 cm
+
+BT
+/N117 9.96299 Tf
+0 0 Td
+(7)Tj 
+ET
+1 0 0 1 5.34999 0 cm
+
+0 g
+0 G
+PDFVars/TermAll get exec end end
+userdict /pgsave get restore
+showpage
+%%PageTrailer
+%%EndPage
+%%Page: 14 14
+%%BeginPageSetup
+userdict /pgsave save put
+PDFVars begin PDF begin PDFVars/InitAll get exec
+1.14301 1.47949 translate
+%%EndPageSetup
+0 0 609.71398 789.04098 RC
+1 0 0 1 71.73098 729.26499 cm
+
+0 g
+0 G
+1 0 0 1 0 3.58699 cm
+
+BT
+/N117 9.96299 Tf
+0 0 Td
+(OpenJ)Tj [35 ]TJ (ade)Tj [-250 ]TJ (1.3.2)Tj [-250 ]TJ (Release)Tj [-250 ]TJ (Notes)Tj 
+ET
+1 0 0 1 466.25199 -3.58699 cm
+
+0 g
+0 G
+1 0 0 1 -418.43099 -11.35699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Item)Tj [-278 ]TJ (10)Tj [-7054 ]TJ (Enhan)Tj [1 ]TJ (cements)Tj [-278 ]TJ (f)Tj [20 ]TJ (or)Tj [-278 ]TJ (Software)Tj [-278 ]TJ (P)Tj [30 ]TJ (ac)Tj [20 ]TJ (ka)Tj [10 ]TJ (ging)Tj 
+/N81 9.96299 Tf
+0 -15.16398 Td
+(Resolution)Tj [-6166 ]TJ (Enhanc)Tj [1 ]TJ (e)Tj [-250 ]TJ (Mak)Tj [10 ]TJ (e\002les)Tj [-250 ]TJ (to)Tj [-250 ]TJ (ensure)Tj [-250 ]TJ (that)Tj [-250 ]TJ (packages)Tj [-250 ]TJ (are)Tj [-250 ]TJ (easy)Tj [-250 ]TJ (to)Tj [-250 ]TJ (b)Tj [20 ]TJ (uild)Tj [-250 ]TJ (\(in)Tj [1 ]TJ (cluding)Tj 
+104.60699 -12.95098 Td
+(addition)Tj [-250 ]TJ (of)Tj 
+/N177 8.96598 Tf
+45.93798 0 Td
+(DESTDIR)Tj 
+/N81 9.96299 Tf
+40.14898 0 Td
+(en)Tj [40 ]TJ (vironment)Tj [-250 ]TJ (v)Tj [25 ]TJ (ariable\).)Tj [-250 ]TJ (It)Tj [-250 ]TJ (shou)Tj [1 ]TJ (ld)Tj [-250 ]TJ (no)Tj [25 ]TJ (w)Tj [-250 ]TJ (be)Tj [-250 ]TJ (possible)Tj [-250 ]TJ (to)Tj 
+-86.08699 -12.95098 Td
+(b)Tj [20 ]TJ (uild)Tj [-250 ]TJ (RPM)Tj [-250 ]TJ (packages)Tj [-250 ]TJ (and)Tj [-250 ]TJ (BSD)Tj [-250 ]TJ (po)Tj [1 ]TJ (rts)Tj [-250 ]TJ (without)Tj [-250 ]TJ (resorting)Tj [-250 ]TJ (to)Tj [-250 ]TJ (patches.)Tj 
+ET
+1 0 0 1 0 -44.45399 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -0.39799 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17498 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Item)Tj [-278 ]TJ (11)Tj [-7054 ]TJ (Suppo)Tj [1 ]TJ (r)Tj [-20 ]TJ (t)Tj [-278 ]TJ (f)Tj [20 ]TJ (or)Tj [-278 ]TJ (ne)Tj [15 ]TJ (wer)Tj [-278 ]TJ (GNU)Tj [-278 ]TJ (C++)Tj [-278 ]TJ (compiler)Tj [15 ]TJ (s)Tj 
+ET
+1 0 0 1 0 -3.38699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(References)Tj [-6058 ]TJ (SuSE)Tj [-250 ]TJ (L)Tj [1 ]TJ (inux)Tj [-250 ]TJ (7.3)Tj [-250 ]TJ (\(Andreas)Tj [-250 ]TJ (Schw)Tj [10 ]TJ (ab\),)Tj [-250 ]TJ (Red)Tj [-250 ]TJ (Hat)Tj [-250 ]TJ (Linux)Tj [-250 ]TJ (7.2,)Tj [-250 ]TJ (Connecti)Tj [25 ]TJ (v)Tj [25 ]TJ (a)Tj [-250 ]TJ (L)Tj [1 ]TJ (inux)Tj 
+0 -15.16299 Td
+(Cate)Tj [15 ]TJ (gory)Tj [-6849 ]TJ (Softw)Tj [10 ]TJ (a)Tj [1 ]TJ (re)Tj [-250 ]TJ (Bug)Tj 
+0 -15.16299 Td
+(Problem)Tj [-7111 ]TJ (C++)Tj [-250 ]TJ (i)Tj [1 ]TJ (s)Tj [-250 ]TJ (a)Tj [-250 ]TJ (shifting)Tj [-250 ]TJ (tar)Tj [18 ]TJ (get.)Tj [-250 ]TJ (Ne)Tj [25 ]TJ (w)Tj [-250 ]TJ (compilers/standards)Tj [-250 ]TJ (demand)Tj [-250 ]TJ (ch)Tj [1 ]TJ (anges.)Tj 
+0 -15.16299 Td
+(Resolution)Tj [-6166 ]TJ (V)Tj [111 ]TJ (ariou)Tj [1 ]TJ (s)Tj [-250 ]TJ (enhancements)Tj [-250 ]TJ (to)Tj [-250 ]TJ (allo)Tj [25 ]TJ (w)Tj [-250 ]TJ (OpenJade)Tj [-250 ]TJ (to)Tj [-250 ]TJ (b)Tj [20 ]TJ (uild)Tj [-250 ]TJ (with)Tj [-250 ]TJ (the)Tj [-250 ]TJ (ne)Tj [25 ]TJ (w)Tj [-250 ]TJ (G)Tj [1 ]TJ (NU)Tj [-250 ]TJ (GCC)Tj 
+104.60699 -12.95199 Td
+(3.0)Tj [-250 ]TJ (and)Tj [-250 ]TJ (the)Tj [-250 ]TJ (soon)Tj [-250 ]TJ (to)Tj [-250 ]TJ (be)Tj [-250 ]TJ (released)Tj [-250 ]TJ (G)Tj [1 ]TJ (NU)Tj [-250 ]TJ (GCC)Tj [-250 ]TJ (3.1)Tj [-250 ]TJ (c++)Tj [-250 ]TJ (compilers)Tj 
+ET
+1 0 0 1 0 -61.82798 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -0.39898 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Item)Tj [-278 ]TJ (12)Tj [-7054 ]TJ (Suppo)Tj [1 ]TJ (r)Tj [-20 ]TJ (t)Tj [-278 ]TJ (f)Tj [20 ]TJ (or)Tj [-278 ]TJ (jadete)Tj [15 ]TJ (x)Tj [-278 ]TJ (3.4)Tj [-278 ]TJ (and)Tj [-278 ]TJ (greater)Tj [-278 ]TJ (macr)Tj [20 ]TJ (os)Tj [-278 ]TJ (f)Tj [20 ]TJ (or)Tj [-278 ]TJ (tw)Tj [20 ]TJ (o)Tj [-277 ]TJ (sided)Tj [-278 ]TJ (suppor)Tj [-20 ]TJ (t)Tj 
+ET
+1 0 0 1 0 -3.38699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17498 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(References)Tj [-6058 ]TJ (Source)Tj [1 ]TJ (for)Tj [18 ]TJ (ge)Tj [-250 ]TJ (patch)Tj [-250 ]TJ (#439755,)Tj [-250 ]TJ (http://iNde)Tj [25 ]TJ (v)Tj [65 ]TJ (.iNsu.COM/openjade/)Tj [-250 ]TJ (\(F)Tj [1 ]TJ (rancis)Tj [-250 ]TJ (J.)Tj 
+104.60699 -12.95098 Td
+(Lacoste\))Tj 
+-104.60699 -15.16299 Td
+(Cate)Tj [15 ]TJ (gory)Tj [-6849 ]TJ (Softw)Tj [10 ]TJ (a)Tj [1 ]TJ (re)Tj [-250 ]TJ (Bug)Tj 
+0 -15.16299 Td
+(Problem)Tj [-7111 ]TJ (T)Tj [80 ]TJ (w)Tj [10 ]TJ (o)Tj [-246 ]TJ (Sided)Tj [-246 ]TJ (output)Tj [-247 ]TJ (support)Tj [-246 ]TJ (with)Tj [-246 ]TJ (the)Tj [-247 ]TJ (T)Tj [70 ]TJ (eX)Tj [-246 ]TJ (back)Tj [10 ]TJ (end)Tj [-246 ]TJ (is)Tj [-247 ]TJ (unreliable)Tj [-246 ]TJ (in)Tj [-246 ]TJ (OpenJade)Tj [-247 ]TJ (1.3)Tj 
+104.60699 -12.95199 Td
+(and)Tj [-250 ]TJ (Jadete)Tj [15 ]TJ (x)Tj [-250 ]TJ (2.x.)Tj 
+-104.60699 -15.16299 Td
+(Resolution)Tj [-6366 ]TJ (Enhanc)Tj [1 ]TJ (e)Tj [-250 ]TJ (the)Tj [-250 ]TJ (T)Tj [70 ]TJ (eX)Tj [-250 ]TJ (back)Tj [10 ]TJ (end)Tj [-250 ]TJ (tw)Tj [10 ]TJ (o)Tj [-250 ]TJ (sided)Tj [-250 ]TJ (output)Tj [-250 ]TJ (support)Tj [-250 ]TJ (and)Tj [-250 ]TJ (bring)Tj [-250 ]TJ (into)Tj [-250 ]TJ (l)Tj [1 ]TJ (ine)Tj [-250 ]TJ (with)Tj 
+106.59999 -12.95098 Td
+(adv)Tj [25 ]TJ (ances)Tj [-250 ]TJ (in)Tj [-250 ]TJ (the)Tj [-250 ]TJ (jadete)Tj [15 ]TJ (x)Tj [-250 ]TJ (late)Tj [15 ]TJ (x)Tj [-249 ]TJ (front)Tj [-250 ]TJ (end.)Tj [-250 ]TJ (T)Tj [80 ]TJ (w)Tj [10 ]TJ (o)Tj [-250 ]TJ (e)Tj [15 ]TJ (xtension)Tj [-250 ]TJ (characteristics)Tj [-250 ]TJ (are)Tj 
+0 -12.95199 Td
+(introduced)Tj [-250 ]TJ (to)Tj [-250 ]TJ (allo)Tj [25 ]TJ (w)Tj [-250 ]TJ (control)Tj [-250 ]TJ (o)Tj [1 ]TJ (f)Tj 
+/N177 8.96598 Tf
+121.22399 0 Td
+(two-side)Tj 
+/N81 9.96299 Tf
+45.52899 0 Td
+(and)Tj 
+/N177 8.96598 Tf
+-166.75299 -12.95098 Td
+(two-side-start-on-righ)Tj [-1 ]TJ (t)Tj 
+/N81 9.96299 Tf
+123.73599 0 Td
+(.)Tj [-250 ]TJ (This)Tj [-250 ]TJ (also)Tj [-250 ]TJ (\002x)Tj [15 ]TJ (es)Tj [-250 ]TJ (the)Tj [-250 ]TJ ("blank)Tj [-250 ]TJ (pa)Tj [1 ]TJ (ge)Tj [-250 ]TJ (at)Tj [-250 ]TJ (the)Tj [-250 ]TJ (end)Tj [-250 ]TJ (of)Tj 
+-123.73599 -12.95199 Td
+(the)Tj [-250 ]TJ (document")Tj [-250 ]TJ (problem.)Tj [-250 ]TJ (The)Tj [-250 ]TJ (f)Tj [1 ]TJ (ollo)Tj [25 ]TJ (wing)Tj [-250 ]TJ (ne)Tj [25 ]TJ (w)Tj [-250 ]TJ (characteristics)Tj [-250 ]TJ (are)Tj [-250 ]TJ (a)Tj [20 ]TJ (v)Tj [25 ]TJ (ailable:)Tj 
+/N177 8.96598 Tf
+0 -12.95098 Td
+("UNREGISTERED::OpenJad)Tj [-1 ]TJ (e//Characteristic::page-two-side?")Tj 
+0 -12.95098 Td
+("UNREGISTERED::OpenJad)Tj [-1 ]TJ (e//Characteristic::two-side-start-)Tj 
+0 -12.95199 Td
+(on-right?")Tj 
+ET
+1 0 0 1 0 -191.34199 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -0.39799 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17498 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Item)Tj [-278 ]TJ (13)Tj [-7054 ]TJ (Pre)Tj [15 ]TJ (ve)Tj [1 ]TJ (nt)Tj [-278 ]TJ (incorrect)Tj [-278 ]TJ (g)Tj [-10 ]TJ (eneration)Tj [-278 ]TJ (of)Tj [-278 ]TJ (ligatures)Tj [-278 ]TJ (in)Tj [-278 ]TJ (the)Tj [-278 ]TJ (T)Tj [60 ]TJ (eX)Tj [-277 ]TJ (Bac)Tj [20 ]TJ (kend)Tj 
+ET
+1 0 0 1 0 -3.38699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(References)Tj [-6058 ]TJ (Red)Tj [-250 ]TJ (Ha)Tj [1 ]TJ (t)Tj [-250 ]TJ (Bugzilla)Tj [-250 ]TJ (#11497,)Tj [-250 ]TJ (#11779)Tj 
+0 -15.16398 Td
+(Cate)Tj [15 ]TJ (gory)Tj [-6849 ]TJ (Softw)Tj [10 ]TJ (a)Tj [1 ]TJ (re)Tj [-250 ]TJ (Bug)Tj 
+0 -15.16299 Td
+(Problem)Tj [-7111 ]TJ (Certa)Tj [1 ]TJ (in)Tj [-250 ]TJ (sequences)Tj [-250 ]TJ (of)Tj [-250 ]TJ (characters)Tj [-250 ]TJ (\(such)Tj [-250 ]TJ (as)Tj [-250 ]TJ (--\))Tj [-250 ]TJ (are)Tj [-250 ]TJ (not)Tj [-250 ]TJ (correctly)Tj [-250 ]TJ (e)Tj [1 ]TJ (scaped)Tj [-250 ]TJ (in)Tj [-250 ]TJ (the)Tj 
+104.60699 -12.95098 Td
+(T)Tj [70 ]TJ (eX)Tj [-250 ]TJ (back)Tj [10 ]TJ (end,)Tj [-250 ]TJ (so)Tj [-250 ]TJ (that)Tj [-250 ]TJ (T)Tj [70 ]TJ (eX)Tj [-250 ]TJ (incorre)Tj [1 ]TJ (ctly)Tj [-250 ]TJ (creates)Tj [-250 ]TJ (lig)Tj [5 ]TJ (atures)Tj [-250 ]TJ (out)Tj [-250 ]TJ (of)Tj [-250 ]TJ (them)Tj [-250 ]TJ (\(so)Tj [-250 ]TJ (that)Tj [-250 ]TJ (--)Tj 
+0 -12.95199 Td
+(becomes)Tj [-250 ]TJ (an)Tj [-250 ]TJ (em)Tj [-250 ]TJ (dash)Tj [-250 ]TJ (\227\).)Tj 
+-104.60699 -15.16299 Td
+(Resolution)Tj [-6166 ]TJ (OpenJa)Tj [1 ]TJ (de)Tj [-250 ]TJ (1.3.1)Tj [-250 ]TJ (no)Tj [25 ]TJ (w)Tj [-250 ]TJ (correctly)Tj [-250 ]TJ (escapes)Tj [-250 ]TJ (these)Tj [-250 ]TJ (character)Tj [-250 ]TJ (sequences)Tj [1 ]TJ (.)Tj [-250 ]TJ (This)Tj [-250 ]TJ (is)Tj [-250 ]TJ (a)Tj 
+104.60699 -12.95098 Td
+(particular)Tj [-250 ]TJ (problem)Tj [-250 ]TJ (when)Tj [-250 ]TJ (repres)Tj [1 ]TJ (enting)Tj [-250 ]TJ (program)Tj [-250 ]TJ (code)Tj [-250 ]TJ (where)Tj [-250 ]TJ (sequences)Tj [-250 ]TJ (such)Tj [-250 ]TJ (as)Tj 
+0 -12.95098 Td
+(--)Tj [-250 ]TJ (are)Tj [-250 ]TJ (often)Tj [-250 ]TJ (operators.)Tj 
+ET
+1 0 0 1 0 -100.68299 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -0.39799 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17498 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Item)Tj [-278 ]TJ (14)Tj [-7054 ]TJ (Impr)Tj [20 ]TJ (o)Tj [21 ]TJ (ved)Tj [-278 ]TJ (time)Tj [-278 ]TJ (string)Tj [-278 ]TJ (handling)Tj 
+ET
+1 0 0 1 0 -3.38699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(References)Tj [-6058 ]TJ (http:/)Tj [1 ]TJ (/iNde)Tj [25 ]TJ (v)Tj [65 ]TJ (.iNsu.COM/openjade/)Tj [-250 ]TJ (\(Francis)Tj [-250 ]TJ (J.)Tj [-250 ]TJ (Lacoste\))Tj 
+0 -15.16299 Td
+(Cate)Tj [15 ]TJ (gory)Tj [-6849 ]TJ (Softw)Tj [10 ]TJ (a)Tj [1 ]TJ (re)Tj [-250 ]TJ (Bug)Tj 
+0 -15.16299 Td
+(Problem)Tj [-7111 ]TJ (OpenJa)Tj [1 ]TJ (de)Tj [-250 ]TJ (1.3)Tj [-250 ]TJ (does)Tj [-250 ]TJ (not)Tj [-250 ]TJ (support)Tj [-250 ]TJ (the)Tj 
+/N177 8.96598 Tf
+244.34199 0 Td
+(\(time<=?\))Tj 
+/N81 9.96299 Tf
+50.90899 0 Td
+(comparison)Tj 
+ET
+1 0 0 1 -47.82099 -146.07299 cm
+
+0 g
+0 G
+BT
+/N117 9.96299 Tf
+0 0 Td
+(8)Tj 
+ET
+1 0 0 1 466.25199 0 cm
+
+0 g
+0 G
+PDFVars/TermAll get exec end end
+userdict /pgsave get restore
+showpage
+%%PageTrailer
+%%EndPage
+%%Page: 15 15
+%%BeginPageSetup
+userdict /pgsave save put
+PDFVars begin PDF begin PDFVars/InitAll get exec
+1.14301 1.47949 translate
+%%EndPageSetup
+0 0 609.71398 789.04098 RC
+1 0 0 1 71.73098 729.26499 cm
+
+0 g
+0 G
+1 0 0 1 345.13699 3.58699 cm
+
+BT
+/N117 9.96299 Tf
+0 0 Td
+(OpenJ)Tj [35 ]TJ (ade)Tj [-250 ]TJ (1.3.2)Tj [-250 ]TJ (Release)Tj [-250 ]TJ (Note)Tj [1 ]TJ (s)Tj 
+ET
+1 0 0 1 121.11499 -3.58699 cm
+
+0 g
+0 G
+1 0 0 1 -418.43099 -11.35699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Item)Tj [-278 ]TJ (14)Tj [-7054 ]TJ (Impr)Tj [20 ]TJ (o)Tj [21 ]TJ (ved)Tj [-278 ]TJ (time)Tj [-278 ]TJ (string)Tj [-278 ]TJ (handling)Tj 
+/N81 9.96299 Tf
+0 -15.16398 Td
+(Resolution)Tj [-6166 ]TJ (V)Tj [111 ]TJ (ariou)Tj [1 ]TJ (s)Tj [-250 ]TJ (b)Tj [20 ]TJ (ugs)Tj [-250 ]TJ (\002x)Tj [15 ]TJ (ed)Tj [-250 ]TJ (in)Tj [-250 ]TJ (the)Tj [-250 ]TJ (time)Tj [-250 ]TJ (string)Tj [-250 ]TJ (support)Tj [-250 ]TJ (of)Tj [-250 ]TJ (OpenJade.)Tj [-250 ]TJ (It)Tj [-250 ]TJ (is)Tj [-250 ]TJ (no)Tj [26 ]TJ (w)Tj [-250 ]TJ (possible)Tj 
+104.60699 -12.95098 Td
+(to)Tj [-250 ]TJ (compare)Tj [-250 ]TJ (time,)Tj [-250 ]TJ (date)Tj [-250 ]TJ (and)Tj [-250 ]TJ (date)Tj [1 ]TJ (time.)Tj [-250 ]TJ (Also)Tj [-250 ]TJ (partial)Tj [-250 ]TJ (formats)Tj [-250 ]TJ (\(such)Tj [-250 ]TJ (as)Tj 
+0 -12.95098 Td
+(YY)Tj [111 ]TJ (-MM-DD,)Tj [-250 ]TJ (YYYY)Tj [111 ]TJ (-MM)Tj [-250 ]TJ (or)Tj [-250 ]TJ (HH:)Tj [1 ]TJ (MM\))Tj [-250 ]TJ (are)Tj [-250 ]TJ (no)Tj [25 ]TJ (w)Tj [-250 ]TJ (supported)Tj 
+ET
+1 0 0 1 0 -44.45399 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -0.39799 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17498 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Item)Tj [-278 ]TJ (15)Tj [-7054 ]TJ (Impr)Tj [20 ]TJ (o)Tj [21 ]TJ (vements)Tj [-278 ]TJ (in)Tj [-278 ]TJ (handling)Tj 
+/N289 8.96598 Tf
+230.98199 0 Td
+(sosofo-append)Tj 
+ET
+1 0 0 1 0 -3.38699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(References)Tj [-6058 ]TJ (http:/)Tj [1 ]TJ (/iNde)Tj [25 ]TJ (v)Tj [65 ]TJ (.iNsu.COM/openjade/)Tj [-250 ]TJ (\(Francis)Tj [-250 ]TJ (J.)Tj [-250 ]TJ (Lacoste\))Tj 
+0 -15.16299 Td
+(Cate)Tj [15 ]TJ (gory)Tj [-6849 ]TJ (Softw)Tj [10 ]TJ (a)Tj [1 ]TJ (re)Tj [-250 ]TJ (Bug)Tj 
+0 -15.16299 Td
+(Problem)Tj [-7111 ]TJ (sosofo)Tj [1 ]TJ (-append)Tj [-250 ]TJ (has)Tj [-250 ]TJ (problems)Tj [-250 ]TJ (with)Tj [-250 ]TJ (memory/stack)Tj [-250 ]TJ (usage)Tj [-250 ]TJ (when)Tj [-250 ]TJ (han)Tj [1 ]TJ (dling)Tj [-250 ]TJ (lar)Tj [18 ]TJ (ge)Tj 
+104.60699 -12.95199 Td
+(lists)Tj [-250 ]TJ (of)Tj [-250 ]TJ (sosofo)Tj 
+-104.60699 -15.16299 Td
+(Resolution)Tj [-6366 ]TJ (The)Tj [-250 ]TJ (\002x)Tj [-249 ]TJ (optimizes)Tj 
+/N177 8.96598 Tf
+178.82798 0 Td
+(sosofo-append)Tj 
+/N81 9.96299 Tf
+72.42898 0 Td
+(to)Tj [-250 ]TJ (reduce)Tj [-250 ]TJ (its)Tj [-250 ]TJ (memory)Tj [-250 ]TJ (and)Tj [-250 ]TJ (s)Tj [1 ]TJ (tack)Tj [-250 ]TJ (usage)Tj 
+-144.65699 -12.95098 Td
+(when)Tj [-250 ]TJ (using)Tj [-250 ]TJ (it)Tj [-250 ]TJ (to)Tj [-250 ]TJ (b)Tj [20 ]TJ (uild)Tj [-250 ]TJ (long)Tj [-250 ]TJ (lis)Tj [1 ]TJ (t)Tj [-250 ]TJ (of)Tj [-250 ]TJ (sosofo)Tj [-250 ]TJ (:)Tj 
+/N177 8.96598 Tf
+0 -12.95199 Td
+(\(let)Tj [-600 ]TJ (loop)Tj [-600 ]TJ (\()Tj [-600 ]TJ (\(res)Tj [-600 ]TJ (\(empt)Tj [-1 ]TJ (y-sosofo\)\))Tj 
+0 -12.95098 Td
+(\(nl)Tj [-1200 ]TJ (\(node-list-rest)Tj [-600 ]TJ (\()Tj [-1 ]TJ (children)Tj [-600 ]TJ (\(current-node\)\)\)\)\))Tj 
+0 -12.95199 Td
+(\(loop)Tj [-600 ]TJ (\(sosofo-append)Tj [-600 ]TJ (r)Tj [-1 ]TJ (es)Tj [-600 ]TJ (\(process-node-list)Tj 
+0 -12.95098 Td
+(\(node-list-first)Tj [-600 ]TJ (nl\)\)\))Tj [-7801 ]TJ (\(node-list-rest)Tj [-600 ]TJ (nl\)\)\))Tj 
+ET
+1 0 0 1 0 -139.53698 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -0.39799 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17498 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Item)Tj [-278 ]TJ (16)Tj [-7054 ]TJ (Impr)Tj [20 ]TJ (o)Tj [21 ]TJ (ved)Tj [-278 ]TJ (T)Tj [80 ]TJ (ab)Tj [10 ]TJ (le)Tj [-278 ]TJ (handling)Tj [-278 ]TJ (in)Tj [-278 ]TJ (T)Tj [60 ]TJ (eX)Tj [-278 ]TJ (Bac)Tj [20 ]TJ (kend)Tj 
+ET
+1 0 0 1 0 -3.38699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(References)Tj [-6058 ]TJ (http:/)Tj [1 ]TJ (/iNde)Tj [25 ]TJ (v)Tj [65 ]TJ (.iNsu.COM/openjade/)Tj [-250 ]TJ (\(Francis)Tj [-250 ]TJ (J.)Tj [-250 ]TJ (Lacoste\))Tj 
+0 -15.16299 Td
+(Cate)Tj [15 ]TJ (gory)Tj [-6849 ]TJ (Softw)Tj [10 ]TJ (a)Tj [1 ]TJ (re)Tj [-250 ]TJ (Bug)Tj 
+0 -15.16299 Td
+(Problem)Tj [-7111 ]TJ (T)Tj [80 ]TJ (able)Tj [-250 ]TJ (h)Tj [1 ]TJ (andling)Tj [-250 ]TJ (in)Tj [-250 ]TJ (the)Tj [-250 ]TJ (T)Tj [70 ]TJ (eX)Tj [-250 ]TJ (back)Tj [10 ]TJ (end)Tj [-250 ]TJ (has)Tj [-250 ]TJ (numerous)Tj [-250 ]TJ (problems.)Tj 
+0 -15.16398 Td
+(Resolution)Tj [-6366 ]TJ (Suppor)Tj [1 ]TJ (t)Tj [-250 ]TJ (for)Tj [-250 ]TJ (tables)Tj [-250 ]TJ (in)Tj [-250 ]TJ (the)Tj [-250 ]TJ (T)Tj [70 ]TJ (eX)Tj [-250 ]TJ (back)Tj [10 ]TJ (end)Tj [-250 ]TJ (has)Tj [-250 ]TJ (been)Tj [-250 ]TJ (impro)Tj [15 ]TJ (v)Tj [15 ]TJ (ed)Tj [-250 ]TJ (with:)Tj 
+ET
+1 0 0 1 116.56298 -58.44099 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 7.17298 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(Support)Tj [-250 ]TJ (for)Tj [-250 ]TJ (nested)Tj [-250 ]TJ (tables.)Tj 
+ET
+1 0 0 1 -9.96199 -25.90299 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 7.17298 0 cm
+
+BT
+/N177 8.96598 Tf
+0 0 Td
+(cell-after-column-mar)Tj [-1 ]TJ (gin:)Tj 
+/N81 9.96299 Tf
+136.98599 0 Td
+(and)Tj 
+/N177 8.96598 Tf
+-146.94799 -12.95098 Td
+(cell-before-column-margi)Tj [-1 ]TJ (n:)Tj 
+/N81 9.96299 Tf
+142.36599 0 Td
+(w)Tj [10 ]TJ (asn')Tj [18 ]TJ (t)Tj [-250 ]TJ (really)Tj [-250 ]TJ (w)Tj [10 ]TJ (orking.)Tj 
+ET
+1 0 0 1 -9.96199 -38.85398 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 7.17298 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(Ro)Tj [25 ]TJ (w)Tj [-250 ]TJ (spanning)Tj [-250 ]TJ (w)Tj [10 ]TJ (as)Tj [-250 ]TJ (brok)Tj [10 ]TJ (en.)Tj [-250 ]TJ (This)Tj [-249 ]TJ (\002x)Tj [-250 ]TJ (only)Tj [-250 ]TJ (supports)Tj 
+/N177 8.96598 Tf
+199.62998 0 Td
+('start)Tj 
+/N81 9.96299 Tf
+34.76998 0 Td
+(ro)Tj [25 ]TJ (w)Tj 
+-244.36199 -12.95199 Td
+(alignment)Tj [-250 ]TJ (though.)Tj 
+ET
+1 0 0 1 -9.96199 -38.85398 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 7.17298 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(P)Tj [15 ]TJ (aragraphs)Tj [-250 ]TJ (in)Tj [-250 ]TJ (cell)Tj [-250 ]TJ (spanning)Tj [-250 ]TJ (m)Tj [1 ]TJ (ultiple)Tj [-250 ]TJ (column)Tj [-250 ]TJ (are)Tj [-250 ]TJ (no)Tj [25 ]TJ (w)Tj [-250 ]TJ (w)Tj [10 ]TJ (orking.)Tj 
+ET
+1 0 0 1 -9.96199 -25.90299 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 7.17298 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(Support)Tj [-250 ]TJ (for)Tj [-250 ]TJ (the)Tj 
+/N177 8.96598 Tf
+62.81399 0 Td
+(row-alignment:)Tj 
+/N81 9.96299 Tf
+77.80799 0 Td
+(characteristic.)Tj 
+ET
+1 0 0 1 -9.96199 -25.90299 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 7.17298 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(Support)Tj [-250 ]TJ (for)Tj 
+/N177 8.96598 Tf
+48.14898 0 Td
+(cell-background?)Tj 
+/N81 9.96299 Tf
+88.56799 0 Td
+(and)Tj 
+/N177 8.96598 Tf
+16.87699 0 Td
+(background-color)Tj 
+/N81 9.96299 Tf
+88.56698 0 Td
+(properties)Tj 
+ET
+1 0 0 1 -126.52499 -16.33898 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -0.39799 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17498 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Item)Tj [-278 ]TJ (17)Tj [-7054 ]TJ (Suppo)Tj [1 ]TJ (r)Tj [-20 ]TJ (t)Tj [-278 ]TJ (f)Tj [20 ]TJ (or)Tj 
+/N289 8.96598 Tf
+161.61299 0 Td
+('asis)Tj 
+/N87 9.96299 Tf
+29.66799 0 Td
+(and)Tj 
+/N289 8.96598 Tf
+20.48298 0 Td
+('asis-wrap)Tj 
+ET
+1 0 0 1 0 -3.38699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(References)Tj [-6058 ]TJ (http:/)Tj [1 ]TJ (/iNde)Tj [25 ]TJ (v)Tj [65 ]TJ (.iNsu.COM/openjade/)Tj [-250 ]TJ (\(Francis)Tj [-250 ]TJ (J.)Tj [-250 ]TJ (Lacoste\))Tj 
+0 -15.16299 Td
+(Cate)Tj [15 ]TJ (gory)Tj [-6849 ]TJ (Softw)Tj [11 ]TJ (are)Tj [-250 ]TJ (Bug)Tj 
+0 -15.16398 Td
+(Problem)Tj [-7111 ]TJ (The)Tj 
+/N177 8.96598 Tf
+122.58999 0 Td
+(lines:)Tj 
+/N81 9.96299 Tf
+34.76899 0 Td
+(characteristic)Tj [-250 ]TJ (in)Tj [-250 ]TJ (the)Tj [-250 ]TJ (paragraph)Tj [-249 ]TJ (\003o)Tj [25 ]TJ (w)Tj [-250 ]TJ (object)Tj [-250 ]TJ (does)Tj [-250 ]TJ (not)Tj [-250 ]TJ (support)Tj [-250 ]TJ (the)Tj 
+/N177 8.96598 Tf
+-52.75199 -12.95098 Td
+('asis)Tj 
+/N81 9.96299 Tf
+29.38999 0 Td
+(and)Tj 
+/N177 8.96598 Tf
+16.87699 0 Td
+('asis-wrap)Tj 
+/N81 9.96299 Tf
+56.28898 0 Td
+(v)Tj [25 ]TJ (alues.)Tj 
+ET
+1 0 0 1 -47.82099 -158.32699 cm
+
+0 g
+0 G
+1 0 0 1 461.26998 0 cm
+
+BT
+/N117 9.96299 Tf
+0 0 Td
+(9)Tj 
+ET
+1 0 0 1 4.98199 0 cm
+
+0 g
+0 G
+PDFVars/TermAll get exec end end
+userdict /pgsave get restore
+showpage
+%%PageTrailer
+%%EndPage
+%%Page: 16 16
+%%BeginPageSetup
+userdict /pgsave save put
+PDFVars begin PDF begin PDFVars/InitAll get exec
+1.14301 1.47949 translate
+%%EndPageSetup
+0 0 609.71398 789.04098 RC
+1 0 0 1 71.73098 729.26499 cm
+
+0 g
+0 G
+1 0 0 1 0 3.58699 cm
+
+BT
+/N117 9.96299 Tf
+0 0 Td
+(OpenJ)Tj [35 ]TJ (ade)Tj [-250 ]TJ (1.3.2)Tj [-250 ]TJ (Release)Tj [-250 ]TJ (Notes)Tj 
+ET
+1 0 0 1 466.25199 -3.58699 cm
+
+0 g
+0 G
+1 0 0 1 -418.43099 -11.35699 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 0 -12.17399 cm
+
+BT
+/N87 9.96299 Tf
+0 0 Td
+(Item)Tj [-278 ]TJ (17)Tj [-7054 ]TJ (Suppo)Tj [1 ]TJ (r)Tj [-20 ]TJ (t)Tj [-278 ]TJ (f)Tj [20 ]TJ (or)Tj 
+/N289 8.96598 Tf
+161.61299 0 Td
+('asis)Tj 
+/N87 9.96299 Tf
+29.66899 0 Td
+(and)Tj 
+/N289 8.96598 Tf
+20.48298 0 Td
+('asis-wrap)Tj 
+/N81 9.96299 Tf
+-211.76499 -15.16398 Td
+(Resolution)Tj [-6416 ]TJ (This)Tj [-250 ]TJ (a)Tj [1 ]TJ (dds)Tj [-250 ]TJ (support)Tj [-250 ]TJ (for)Tj [-250 ]TJ (the)Tj 
+/N177 8.96598 Tf
+209.20399 0 Td
+('asis)Tj 
+/N81 9.96299 Tf
+29.38999 0 Td
+(and)Tj 
+/N177 8.96598 Tf
+16.87699 0 Td
+('asis-wrap)Tj 
+/N81 9.96299 Tf
+56.28898 0 Td
+(v)Tj [25 ]TJ (alues)Tj [-250 ]TJ (for)Tj [-250 ]TJ (the)Tj [-250 ]TJ (paragraph')Tj [55 ]TJ (s)Tj 
+-207.15299 -12.95098 Td
+(lines:)Tj [-250 ]TJ (characteristic.)Tj 
+ET
+1 0 0 1 0 -31.50199 cm
+
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+q
+[]0 d
+0 J
+0.39799 w
+0 0.19898 m
+418.43099 0.19898 l
+S 
+Q
+1 0 0 1 -47.82099 -42.57099 cm
+
+BT
+/N87 12.05499 Tf
+0 0 Td
+(V)Tj [50 ]TJ (er)Tj [15 ]TJ (sion)Tj [-278 ]TJ (1.3)Tj 
+/N90 9.96299 Tf
+47.82099 -18.97799 Td
+(Released)Tj [-250 ]TJ (October)Tj [-250 ]TJ (1999.)Tj 
+/N81 9.96299 Tf
+102.375 0 Td
+(V)Tj [111 ]TJ (ersion)Tj [-250 ]TJ (1.3)Tj [-250 ]TJ (added)Tj [-250 ]TJ (man)Tj [15 ]TJ (y)Tj [-250 ]TJ (impro)Tj [15 ]TJ (v)Tj [15 ]TJ (e)Tj [1 ]TJ (ments)Tj [-250 ]TJ (to)Tj [-250 ]TJ (increase)Tj [-250 ]TJ (the)Tj [-250 ]TJ (scope)Tj [-250 ]TJ (of)Tj [-250 ]TJ (the)Tj 
+-102.375 -12.95199 Td
+(implementation)Tj [-250 ]TJ (of)Tj [-250 ]TJ (DSSSL)Tj [1 ]TJ (.)Tj [-250 ]TJ (Changes)Tj [-250 ]TJ (include:)Tj 
+ET
+1 0 0 1 47.82099 -59.82499 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 7.17298 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(The)Tj [-250 ]TJ (SGML)Tj [-250 ]TJ (back)Tj [10 ]TJ (end)Tj [-250 ]TJ (will)Tj [-250 ]TJ (no)Tj [25 ]TJ (w)Tj [-250 ]TJ (em)Tj [1 ]TJ (it)Tj [-250 ]TJ (linebreaks)Tj [-250 ]TJ (when)Tj [-250 ]TJ (used)Tj [-250 ]TJ (as)Tj 
+/N177 8.96598 Tf
+240.37699 0 Td
+(-t)Tj [-600 ]TJ (sgml-raw)Tj 
+/N81 9.96299 Tf
+59.17799 0 Td
+(.)Tj 
+ET
+1 0 0 1 -9.96199 -17.93299 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 9.66398 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(Jade)Tj [-250 ]TJ (can)Tj [-250 ]TJ (bind)Tj [-250 ]TJ (v)Tj [25 ]TJ (ariables)Tj [-250 ]TJ (to)Tj [-250 ]TJ (ar)Tj [1 ]TJ (bitrary)Tj [-250 ]TJ (v)Tj [25 ]TJ (alues)Tj [-250 ]TJ (on)Tj [-250 ]TJ (the)Tj [-250 ]TJ (command)Tj [-250 ]TJ (line)Tj [-250 ]TJ (with)Tj [-250 ]TJ (the)Tj 
+/N177 8.96598 Tf
+290.85598 0 Td
+(-V)Tj 
+/N81 9.96299 Tf
+13.25 0 Td
+(option.)Tj 
+ET
+1 0 0 1 -12.45298 -17.93299 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 9.66398 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(The)Tj 
+/N177 8.96598 Tf
+17.98199 0 Td
+(prlabs1)Tj 
+/N81 9.96299 Tf
+40.14999 0 Td
+(module)Tj [-250 ]TJ (of)Tj [-250 ]TJ (the)Tj [-250 ]TJ (SGML)Tj [-250 ]TJ (property)Tj [-249 ]TJ (set)Tj [-250 ]TJ (is)Tj [-250 ]TJ (supported.)Tj 
+ET
+1 0 0 1 -12.45298 -17.93299 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 9.66398 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(Style)Tj [-250 ]TJ (sheet)Tj 
+/N177 8.96598 Tf
+45.93699 0 Td
+(extensions.dsl)Tj 
+/N81 9.96299 Tf
+77.80799 0 Td
+(lists)Tj [-250 ]TJ (all)Tj [-250 ]TJ (kno)Tj [25 ]TJ (wn)Tj [-250 ]TJ (e)Tj [15 ]TJ (xternal)Tj [-250 ]TJ (proce)Tj [1 ]TJ (dures)Tj [-250 ]TJ (ready)Tj [-250 ]TJ (for)Tj [-250 ]TJ (easy)Tj [-250 ]TJ (inclusion)Tj [-250 ]TJ (as)Tj [-250 ]TJ (an)Tj 
+/N177 8.96598 Tf
+-126.23599 -12.95098 Td
+(external-specificati)Tj [-1 ]TJ (on)Tj 
+/N81 9.96299 Tf
+118.35598 0 Td
+(.)Tj 
+ET
+1 0 0 1 -12.45298 -30.88398 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 9.66398 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(External)Tj [-250 ]TJ (procedure)Tj [-250 ]TJ (with)Tj [-250 ]TJ (publi)Tj [1 ]TJ (c)Tj [-250 ]TJ (identi\002er)Tj 
+/N177 8.96598 Tf
+8.26899 -16.63699 Td
+("UNREGISTERED::OpenJad)Tj [-1 ]TJ (e//Procedure::expt")Tj 
+/N81 9.96299 Tf
+-10.75999 -17.93299 Td
+(to)Tj [-250 ]TJ (pro)Tj [15 ]TJ (vide)Tj [-250 ]TJ (inte)Tj [15 ]TJ (gral)Tj [-250 ]TJ (po)Tj [25 ]TJ (wers)Tj [-250 ]TJ (of)Tj [-250 ]TJ (qua)Tj [1 ]TJ (ntities.)Tj 
+ET
+1 0 0 1 -12.45298 -52.50299 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 9.66398 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(External)Tj [-250 ]TJ (procedure)Tj [-250 ]TJ (with)Tj [-250 ]TJ (publi)Tj [1 ]TJ (c)Tj [-250 ]TJ (identi\002er)Tj 
+/N177 8.96598 Tf
+8.26899 -16.63699 Td
+("UNREGISTERED::OpenJad)Tj [-1 ]TJ (e//Procedure::sgml-parse")Tj 
+/N81 9.96299 Tf
+-10.75999 -17.93299 Td
+(allo)Tj [25 ]TJ (ws)Tj [-250 ]TJ (to)Tj [-250 ]TJ (parse)Tj [-250 ]TJ (w)Tj [65 ]TJ (.r)Tj [55 ]TJ (.t.)Tj [-250 ]TJ (an)Tj [-250 ]TJ (archite)Tj [1 ]TJ (cture.)Tj 
+ET
+1 0 0 1 -12.45298 -52.50299 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 9.66398 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(Jade)Tj [-250 ]TJ (supports)Tj 
+/N177 8.96598 Tf
+56.44799 0 Td
+(force!)Tj 
+/N81 9.96299 Tf
+34.76899 0 Td
+(for)Tj [-250 ]TJ (inherited)Tj [-250 ]TJ (characteristics)Tj [1 ]TJ (.)Tj 
+ET
+1 0 0 1 -12.45298 -17.93299 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 9.66398 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(Jade)Tj [-250 ]TJ (supports)Tj [-250 ]TJ (character)Tj [-250 ]TJ (prope)Tj [1 ]TJ (rties.)Tj 
+ET
+1 0 0 1 -12.45298 -17.93199 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 9.66398 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(Jade)Tj [-250 ]TJ (supports)Tj 
+/N177 8.96598 Tf
+56.44799 0 Td
+(special-query-expressio)Tj [-1 ]TJ (ns)Tj 
+/N81 9.96299 Tf
+134.49499 0 Td
+(.)Tj 
+ET
+1 0 0 1 -12.45298 -17.93299 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 9.66398 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(Jade)Tj [-250 ]TJ (can)Tj [-250 ]TJ (bind)Tj [-250 ]TJ (v)Tj [25 ]TJ (ariables)Tj [-250 ]TJ (to)Tj [-250 ]TJ (st)Tj [1 ]TJ (ring)Tj [-250 ]TJ (v)Tj [25 ]TJ (alues)Tj [-250 ]TJ (on)Tj [-250 ]TJ (the)Tj [-250 ]TJ (command)Tj [-250 ]TJ (line.)Tj 
+ET
+1 0 0 1 -12.45298 -17.93299 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 9.66398 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(All)Tj [-250 ]TJ (standard)Tj [-250 ]TJ (color)Tj [-250 ]TJ (spaces)Tj [-250 ]TJ (su)Tj [1 ]TJ (pported.)Tj 
+ET
+1 0 0 1 -12.45298 -17.93299 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 9.66398 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(Jade)Tj [-250 ]TJ (ignores)Tj [-250 ]TJ (duplicate)Tj [-250 ]TJ (k)Tj [10 ]TJ (e)Tj [15 ]TJ (yw)Tj [10 ]TJ (or)Tj [1 ]TJ (ds)Tj [-250 ]TJ (in)Tj [-250 ]TJ (mak)Tj [10 ]TJ (e)Tj [-250 ]TJ (e)Tj [15 ]TJ (xpressions,)Tj [-250 ]TJ (as)Tj [-250 ]TJ (mandated)Tj [-250 ]TJ (by)Tj [-250 ]TJ (DSSSL.)Tj 
+ET
+1 0 0 1 -12.45298 -17.93199 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 9.66398 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(External)Tj [-250 ]TJ (procedure)Tj [-250 ]TJ (with)Tj [-250 ]TJ (publi)Tj [1 ]TJ (c)Tj [-250 ]TJ (identi\002er)Tj 
+/N177 8.96598 Tf
+8.26899 -16.63798 Td
+("UNREGISTERED::OpenJad)Tj [-1 ]TJ (e//Procedure::language")Tj 
+/N81 9.96299 Tf
+-10.75999 -17.93299 Td
+(to)Tj [-250 ]TJ (create)Tj [-250 ]TJ (a)Tj [-250 ]TJ (language)Tj [-250 ]TJ (object)Tj [-250 ]TJ (by)Tj [-250 ]TJ (r)Tj [1 ]TJ (eference)Tj [-250 ]TJ (to)Tj [-250 ]TJ (a)Tj [-250 ]TJ (POSIX)Tj [-250 ]TJ (locale.)Tj 
+ET
+1 0 0 1 -12.45298 -52.50399 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 9.66398 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(Language-dependent)Tj [-250 ]TJ (procedure)Tj [1 ]TJ (s)Tj [-250 ]TJ (of)Tj [-250 ]TJ (the)Tj [-250 ]TJ (e)Tj [15 ]TJ (xpression)Tj [-250 ]TJ (language:)Tj 
+/N177 8.96598 Tf
+243.86399 0 Td
+(language?,)Tj [-278 ]TJ (current-language,)Tj 
+-246.35499 -12.95098 Td
+(declare-default-lang)Tj [-1 ]TJ (uage,)Tj [-277 ]TJ (with)Tj [-1 ]TJ (-language,)Tj [-278 ]TJ (define-language,)Tj [-278 ]TJ (char<?,)Tj [-278 ]TJ (char>?,)Tj 
+0 -12.95098 Td
+(char<=?,)Tj [-278 ]TJ (char>=?,)Tj [-278 ]TJ (char-ci=?,)Tj [-278 ]TJ (char-ci<?,)Tj [-278 ]TJ (char-ci>?,)Tj [-278 ]TJ (char-ci<=?,)Tj [-278 ]TJ (char-ci<=?,)Tj 
+0 -12.95199 Td
+(char-upcase,)Tj [-278 ]TJ (char-downcase,)Tj [-278 ]TJ (string-ci=?,)Tj [-278 ]TJ (string-eq)Tj [-1 ]TJ (uiv?,)Tj [-277 ]TJ (stri)Tj [-1 ]TJ (ng<?,)Tj [-277 ]TJ (str)Tj [-1 ]TJ (ing>?,)Tj 
+0 -12.95098 Td
+(string<=?,)Tj [-278 ]TJ (string>=?,)Tj [-278 ]TJ (string-ci<?,)Tj [-278 ]TJ (string-ci>?,)Tj [-278 ]TJ (string-ci<=?)Tj [-1 ]TJ (,)Tj [-277 ]TJ (string-c)Tj [-1 ]TJ (i>=?.)Tj 
+ET
+1 0 0 1 -60.27398 -173.22999 cm
+
+0 g
+0 G
+BT
+/N117 9.96299 Tf
+0 0 Td
+(10)Tj 
+ET
+1 0 0 1 466.25199 0 cm
+
+0 g
+0 G
+PDFVars/TermAll get exec end end
+userdict /pgsave get restore
+showpage
+%%PageTrailer
+%%EndPage
+%%Page: 17 17
+%%BeginPageSetup
+userdict /pgsave save put
+PDFVars begin PDF begin PDFVars/InitAll get exec
+1.14301 1.47949 translate
+%%EndPageSetup
+0 0 609.71398 789.04098 RC
+1 0 0 1 71.73098 729.26499 cm
+
+0 g
+0 G
+1 0 0 1 345.13699 3.58699 cm
+
+BT
+/N117 9.96299 Tf
+0 0 Td
+(OpenJ)Tj [35 ]TJ (ade)Tj [-250 ]TJ (1.3.2)Tj [-250 ]TJ (Release)Tj [-250 ]TJ (Note)Tj [1 ]TJ (s)Tj 
+ET
+1 0 0 1 121.11499 -3.58699 cm
+
+0 g
+0 G
+1 0 0 1 -418.43099 -20.92098 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 9.66398 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(The)Tj [-250 ]TJ (style-sheet.dtd)Tj [-250 ]TJ (deri)Tj [25 ]TJ (v)Tj [15 ]TJ (ed)Tj [-250 ]TJ (fr)Tj [1 ]TJ (om)Tj [-250 ]TJ (the)Tj [-250 ]TJ (DSSSL)Tj [-250 ]TJ (architecture)Tj [-250 ]TJ (has)Tj [-250 ]TJ (been)Tj [-250 ]TJ (e)Tj [15 ]TJ (xtended)Tj [-250 ]TJ (\(in)Tj [-250 ]TJ (a)Tj [-250 ]TJ (backw)Tj [11 ]TJ (ard)Tj 
+-2.49099 -12.95199 Td
+(compatible)Tj [-250 ]TJ (w)Tj [10 ]TJ (ay\))Tj [-250 ]TJ (to)Tj [-250 ]TJ (include)Tj [-250 ]TJ (the)Tj [-249 ]TJ (declaration)Tj [-250 ]TJ (element)Tj [-250 ]TJ (type)Tj [-250 ]TJ (forms)Tj [-250 ]TJ (supported)Tj [-250 ]TJ (by)Tj [-250 ]TJ (Jade.)Tj [-250 ]TJ (The)Tj [-250 ]TJ (p)Tj [1 ]TJ (ublic)Tj 
+0 -12.95098 Td
+(identi\002er)Tj [-250 ]TJ (for)Tj [-250 ]TJ (the)Tj [-250 ]TJ (dtd)Tj [-250 ]TJ (is)Tj 
+/N177 8.96598 Tf
+10.75999 -16.63798 Td
+("-//OpenJade//DTD)Tj [-600 ]TJ (DSSS)Tj [-1 ]TJ (L)Tj [-600 ]TJ (Style)Tj [-600 ]TJ (Sheet//EN")Tj 
+ET
+1 0 0 1 -12.45298 -65.45498 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 9.66398 0 cm
+
+BT
+/N177 8.96598 Tf
+0 0 Td
+(char-repertoire)Tj 
+/N81 9.96299 Tf
+80.69699 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98199 0 Td
+(add-name-chars)Tj 
+/N81 9.96299 Tf
+77.80799 0 Td
+(and)Tj 
+/N177 8.96598 Tf
+16.87599 0 Td
+(add-separator-chars)Tj 
+/N81 9.96299 Tf
+104.70799 0 Td
+(declaration)Tj [-250 ]TJ (element)Tj [-250 ]TJ (type)Tj 
+-287.56199 -12.95098 Td
+(forms)Tj [-250 ]TJ (are)Tj [-250 ]TJ (supported.)Tj [-250 ]TJ (When)Tj [-250 ]TJ (gi)Tj [25 ]TJ (v)Tj [15 ]TJ (en)Tj [-249 ]TJ (the)Tj 
+/N177 8.96598 Tf
+149.83699 0 Td
+(-s)Tj 
+/N81 9.96299 Tf
+13.25099 0 Td
+(command)Tj [-250 ]TJ (line)Tj [-250 ]TJ (\003ag,)Tj [-250 ]TJ (Jade)Tj [-250 ]TJ (doe)Tj [1 ]TJ (sn')Tj [18 ]TJ (t)Tj [-250 ]TJ (use)Tj [-250 ]TJ (its)Tj [-250 ]TJ (b)Tj [20 ]TJ (uilt)Tj [-250 ]TJ (in)Tj [-250 ]TJ (character)Tj 
+-163.08799 -12.95199 Td
+(repertoire.)Tj 
+ET
+1 0 0 1 -12.45298 -43.83499 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 9.66398 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(Most)Tj [-250 ]TJ (of)Tj [-250 ]TJ (the)Tj [-250 ]TJ (deri)Tj [25 ]TJ (v)Tj [15 ]TJ (ed)Tj [-250 ]TJ (procedures)Tj [-249 ]TJ (in)Tj [-250 ]TJ (the)Tj [-250 ]TJ (query)Tj [-250 ]TJ (language:)Tj 
+/N177 8.96598 Tf
+217.90098 0 Td
+(current-root)Tj 
+/N81 9.96299 Tf
+64.55799 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(node-list-reduce)Tj 
+/N81 9.96299 Tf
+86.07699 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+-376.00799 -12.95199 Td
+(node-list-contains?)Tj 
+/N81 9.96299 Tf
+102.21699 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(node-list-remove-dup)Tj [-1 ]TJ (licates)Tj 
+/N81 9.96299 Tf
+145.25498 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98199 0 Td
+(node-list-union)Tj 
+/N81 9.96299 Tf
+80.69699 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+-338.13198 -12.95098 Td
+(node-list-intersecti)Tj [-1 ]TJ (on)Tj 
+/N81 9.96299 Tf
+118.35598 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98199 0 Td
+(node-list-difference)Tj 
+/N81 9.96299 Tf
+107.59599 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(node-list-symmetric-)Tj [-1 ]TJ (difference)Tj 
+/N81 9.96299 Tf
+161.39498 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+-397.30999 -12.95199 Td
+(node-list-union-map)Tj 
+/N81 9.96299 Tf
+102.21699 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(node-list-some?)Tj 
+/N81 9.96299 Tf
+80.69799 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(node-list-every?)Tj 
+/N81 9.96299 Tf
+86.07699 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(node-list-filter)Tj 
+/N81 9.96299 Tf
+86.07699 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+-370.01199 -12.95098 Td
+(node-list->list)Tj 
+/N81 9.96299 Tf
+80.69799 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(node-list-tail)Tj 
+/N81 9.96299 Tf
+75.31698 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98199 0 Td
+(node-list-head)Tj 
+/N81 9.96299 Tf
+75.31698 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98199 0 Td
+(node-list-sublist)Tj 
+/N81 9.96299 Tf
+91.45698 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+-337.73399 -12.95199 Td
+(node-list-count)Tj 
+/N81 9.96299 Tf
+80.69799 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(node-list-last)Tj 
+/N81 9.96299 Tf
+75.31698 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98199 0 Td
+(node-list-property)Tj 
+/N81 9.96299 Tf
+96.83699 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(origin)Tj 
+/N81 9.96299 Tf
+32.27899 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+-300.07499 -12.95098 Td
+(origin-to-subnode-re)Tj [-1 ]TJ (l)Tj 
+/N81 9.96299 Tf
+112.97698 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.89799 0 Td
+(tree-root)Tj 
+/N81 9.96299 Tf
+48.41799 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.89898 0 Td
+(grove-root)Tj 
+/N81 9.96299 Tf
+53.79798 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.89799 0 Td
+(source)Tj 
+/N81 9.96299 Tf
+32.27899 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.89898 0 Td
+(subtree)Tj 
+/N81 9.96299 Tf
+37.65798 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.89898 0 Td
+(subgrove)Tj 
+/N81 9.96299 Tf
+43.03799 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.89898 0 Td
+(ancestors)Tj 
+/N81 9.96299 Tf
+48.41799 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+-405.97799 -12.95098 Td
+(grove-root-path)Tj 
+/N81 9.96299 Tf
+80.69799 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(rsiblings)Tj 
+/N81 9.96299 Tf
+48.41799 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98199 0 Td
+(ipreced)Tj 
+/N81 9.96299 Tf
+37.65798 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98199 0 Td
+(ifollow)Tj 
+/N81 9.96299 Tf
+37.65899 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(grove-before?)Tj 
+/N81 9.96299 Tf
+69.93798 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(sort-in-tree-order)Tj 
+/N81 9.96299 Tf
+96.83699 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+-396.11499 -12.95199 Td
+(tree-before?)Tj 
+/N81 9.96299 Tf
+64.55799 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98199 0 Td
+(tree-before)Tj 
+/N81 9.96299 Tf
+59.17799 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(property-lookup)Tj 
+/N81 9.96299 Tf
+80.69699 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98199 0 Td
+(select-by-property)Tj 
+/N81 9.96299 Tf
+96.83599 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+-316.21299 -12.95098 Td
+(select-by-null-property)Tj 
+/N81 9.96299 Tf
+123.73498 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98199 0 Td
+(select-by-missing-prope)Tj [-1 ]TJ (rty)Tj 
+/N81 9.96299 Tf
+139.875 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(attribute)Tj 
+/N81 9.96299 Tf
+48.41899 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(referent)Tj 
+/N81 9.96299 Tf
+43.03898 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+-370.01199 -12.95199 Td
+(q-element)Tj 
+/N81 9.96299 Tf
+48.41799 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(q-class)Tj 
+/N81 9.96299 Tf
+37.65899 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(q-sdata)Tj 
+/N81 9.96299 Tf
+37.65899 0 Td
+(.)Tj 
+/N87 12.05499 Tf
+-191.48199 -40.57798 Td
+(V)Tj [50 ]TJ (er)Tj [15 ]TJ (sion)Tj [-278 ]TJ (1.2.2)Tj 
+/N90 9.96299 Tf
+47.82099 -18.97799 Td
+(Released)Tj [-250 ]TJ (J)Tj [15 ]TJ (une)Tj [-250 ]TJ (1999.)Tj 
+/N81 9.96299 Tf
+87.84999 0 Td
+(The)Tj [-250 ]TJ (\002rst)Tj [-250 ]TJ (release)Tj [-250 ]TJ (of)Tj [-250 ]TJ (OpenJad)Tj [1 ]TJ (e.)Tj 
+-87.84999 -17.93299 Td
+(Changes)Tj [-250 ]TJ (in)Tj [-250 ]TJ (OpenJade)Tj [-250 ]TJ (1.2.2)Tj 
+ET
+1 0 0 1 -12.45298 -234.89999 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 9.66398 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(The)Tj [-250 ]TJ (HTML)Tj [-250 ]TJ (and)Tj [-250 ]TJ (MIF)Tj [-250 ]TJ (back)Tj [10 ]TJ (ends)Tj [-249 ]TJ (are)Tj [-250 ]TJ (no)Tj [25 ]TJ (w)Tj [-250 ]TJ (enabled)Tj [-250 ]TJ (by)Tj [-250 ]TJ (def)Tj [10 ]TJ (ault.)Tj 
+ET
+1 0 0 1 -12.45298 -17.93199 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 9.66398 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(The)Tj [-250 ]TJ (T)Tj [70 ]TJ (eX)Tj [-250 ]TJ (back)Tj [10 ]TJ (end)Tj [-250 ]TJ (has)Tj [-250 ]TJ (support)Tj [-250 ]TJ (fo)Tj [1 ]TJ (r)Tj [-250 ]TJ (PDF)Tj [-250 ]TJ (bookmarks.)Tj [-250 ]TJ (This)Tj [-250 ]TJ (is)Tj [-250 ]TJ (supported)Tj [-250 ]TJ (by)Tj [-250 ]TJ (the)Tj [-250 ]TJ (ne)Tj [25 ]TJ (w)Tj [-250 ]TJ (v)Tj [15 ]TJ (ersion)Tj [-250 ]TJ (of)Tj [-250 ]TJ (ja)Tj [1 ]TJ (dete)Tj [15 ]TJ (x)Tj 
+-2.49099 -12.95199 Td
+(which)Tj [-250 ]TJ (is)Tj [-250 ]TJ (included.)Tj 
+ET
+1 0 0 1 -12.45298 -30.88499 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 9.66398 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(Prede\002ned)Tj [-250 ]TJ (character)Tj [-250 ]TJ (names)Tj 
+/N177 8.96598 Tf
+112.03898 0 Td
+(line-feed)Tj 
+/N81 9.96299 Tf
+50.90899 0 Td
+(and)Tj 
+/N177 8.96598 Tf
+16.87599 0 Td
+(carriage-return)Tj 
+/N81 9.96299 Tf
+83.18798 0 Td
+(for)Tj [-250 ]TJ (the)Tj [-250 ]TJ (character)Tj [-250 ]TJ (numbers)Tj [-250 ]TJ (10)Tj [-250 ]TJ (an)Tj [1 ]TJ (d)Tj 
+-265.50299 -12.95098 Td
+(13.)Tj 
+ET
+1 0 0 1 -12.45298 -30.88398 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 9.66398 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(standard-chars)Tj [-250 ]TJ (and)Tj [-250 ]TJ (map-sdat)Tj [1 ]TJ (a-entity)Tj [-250 ]TJ (declaration)Tj [-250 ]TJ (element)Tj [-250 ]TJ (type)Tj [-250 ]TJ (forms)Tj [-250 ]TJ (are)Tj [-250 ]TJ (supported.)Tj 
+ET
+1 0 0 1 -12.45298 -17.93199 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 9.66398 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(Style)Tj [-250 ]TJ (language)Tj [-250 ]TJ (additions:)Tj [-250 ]TJ (m)Tj [1 ]TJ (ap-constructor)Tj [55 ]TJ (.)Tj 
+ET
+1 0 0 1 -12.45298 -17.93299 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 9.66398 0 cm
+
+BT
+/N177 8.96598 Tf
+0 0 Td
+(+)Tj 
+/N81 9.96299 Tf
+7.86999 0 Td
+(and)Tj 
+/N177 8.96598 Tf
+16.87699 0 Td
+(-)Tj 
+/N81 9.96299 Tf
+7.87098 0 Td
+(return)Tj [-250 ]TJ (a)Tj 
+/N177 8.96598 Tf
+33.19499 0 Td
+(length-spec)Tj 
+/N81 9.96299 Tf
+61.66799 0 Td
+(if)Tj [-250 ]TJ (an)Tj [15 ]TJ (y)Tj [-250 ]TJ (of)Tj [-250 ]TJ (there)Tj [-250 ]TJ (ar)Tj [18 ]TJ (guments)Tj [-250 ]TJ (is)Tj [-250 ]TJ (a)Tj 
+/N177 8.96598 Tf
+118.36599 0 Td
+(length-spec)Tj 
+/N81 9.96299 Tf
+59.17799 0 Td
+(.)Tj 
+ET
+1 0 0 1 -12.45298 -17.93299 cm
+
+0 g
+0 G
+BT
+/N81 7.96998 Tf
+0 0 Td
+(\225)Tj 
+ET
+1 0 0 1 2.78898 0 cm
+
+0 g
+0 G
+0 g
+0 G
+0 g
+0 G
+1 0 0 1 9.66398 0 cm
+
+BT
+/N81 9.96299 Tf
+0 0 Td
+(Most)Tj [-250 ]TJ (of)Tj [-250 ]TJ (the)Tj [-250 ]TJ (DSSSL)Tj [-250 ]TJ (non-core)Tj [-250 ]TJ (e)Tj [16 ]TJ (xpression)Tj [-250 ]TJ (language:)Tj 
+/N177 8.96598 Tf
+204.88999 0 Td
+(c...r)Tj 
+/N81 9.96299 Tf
+26.89898 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(assoc)Tj 
+/N81 9.96299 Tf
+26.89898 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98199 0 Td
+(keyword->string)Tj 
+/N81 9.96299 Tf
+80.69699 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+-351.83898 -12.95098 Td
+(string->keyword)Tj 
+/N81 9.96299 Tf
+80.69799 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(exact?)Tj 
+/N81 9.96299 Tf
+32.27899 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(inexact?)Tj 
+/N81 9.96299 Tf
+43.03898 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(zero?)Tj 
+/N81 9.96299 Tf
+26.89898 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98199 0 Td
+(positive?)Tj 
+/N81 9.96299 Tf
+48.41799 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(negative?)Tj 
+/N81 9.96299 Tf
+48.41899 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(odd?)Tj 
+/N81 9.96299 Tf
+21.51899 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98199 0 Td
+(even?)Tj 
+/N81 9.96299 Tf
+26.89898 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(exp)Tj 
+/N81 9.96299 Tf
+16.13899 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98199 0 Td
+(log)Tj 
+/N81 9.96299 Tf
+16.13899 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+-405.27999 -12.95199 Td
+(sin)Tj 
+/N81 9.96299 Tf
+16.13999 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(cos)Tj 
+/N81 9.96299 Tf
+16.13999 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(tan)Tj 
+/N81 9.96299 Tf
+16.13899 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98199 0 Td
+(asin)Tj 
+/N81 9.96299 Tf
+21.51899 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(acos)Tj 
+/N81 9.96299 Tf
+21.51998 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(atan)Tj 
+/N81 9.96299 Tf
+21.51899 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98199 0 Td
+(expt)Tj 
+/N81 9.96299 Tf
+21.51899 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(exact->inexact)Tj 
+/N81 9.96299 Tf
+75.31799 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.98098 0 Td
+(inexact->exact)Tj 
+/N81 9.96299 Tf
+75.31698 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+-324.98098 -12.95098 Td
+(quantity->number)Tj 
+/N81 9.96299 Tf
+86.07798 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.96699 0 Td
+(string->list)Tj 
+/N81 9.96299 Tf
+64.55799 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.96699 0 Td
+(list->string)Tj 
+/N81 9.96299 Tf
+64.55799 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.96699 0 Td
+(map)Tj 
+/N81 9.96299 Tf
+16.13899 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.96699 0 Td
+(time<?)Tj 
+/N81 9.96299 Tf
+32.27899 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.96699 0 Td
+(time>?)Tj 
+/N81 9.96299 Tf
+32.27899 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.96699 0 Td
+(time<=?)Tj 
+/N81 9.96299 Tf
+37.65899 0 Td
+(,)Tj 
+/N177 8.96598 Tf
+4.96699 0 Td
+(time>=?)Tj 
+/N81 9.96299 Tf
+37.65899 0 Td
+(.)Tj 
+ET
+1 0 0 1 -60.27398 -181.83799 cm
+
+0 g
+0 G
+1 0 0 1 456.28898 0 cm
+
+BT
+/N117 9.96299 Tf
+0 0 Td
+(11)Tj 
+ET
+1 0 0 1 9.96299 0 cm
+
+0 g
+0 G
+PDFVars/TermAll get exec end end
+userdict /pgsave get restore
+showpage
+%%PageTrailer
+%%EndPage
+%%Page: 18 18
+%%BeginPageSetup
+userdict /pgsave save put
+PDFVars begin PDF begin PDFVars/InitAll get exec
+1.14301 1.47949 translate
+%%EndPageSetup
+0 0 609.71398 789.04098 RC
+1 0 0 1 71.73098 729.26499 cm
+
+0 g
+0 G
+1 0 0 1 0 3.58699 cm
+
+BT
+/N117 9.96299 Tf
+0 0 Td
+(OpenJ)Tj [35 ]TJ (ade)Tj [-250 ]TJ (1.3.2)Tj [-250 ]TJ (Release)Tj [-250 ]TJ (Notes)Tj 
+ET
+1 0 0 1 466.25199 -3.58699 cm
+
+0 g
+0 G
+1 0 0 1 -466.25199 -20.92098 cm
+
+BT
+/N87 12.05499 Tf
+0 0 Td
+(Jade)Tj [-278 ]TJ (V)Tj [50 ]TJ (er)Tj [15 ]TJ (sion)Tj [-278 ]TJ (1.2.1)Tj 
+/N90 9.96299 Tf
+47.82099 -18.97898 Td
+(Released)Tj [-243 ]TJ (October)Tj [-243 ]TJ (199)Tj [1 ]TJ (8.)Tj 
+/N81 9.96299 Tf
+102.16499 0 Td
+(Jade)Tj [-243 ]TJ (1.2.1)Tj [-243 ]TJ (w)Tj [10 ]TJ (as)Tj [-243 ]TJ (the)Tj [-243 ]TJ (\002)Tj [1 ]TJ (nal)Tj [-243 ]TJ (release)Tj [-243 ]TJ (of)Tj [-243 ]TJ (jade)Tj [-243 ]TJ (from)Tj [-243 ]TJ (James)Tj [-243 ]TJ (Clark.)Tj [-243 ]TJ (Ope)Tj [1 ]TJ (nJade)Tj [-243 ]TJ (is)Tj [-243 ]TJ (based)Tj [-243 ]TJ (on)Tj 
+-102.16499 -12.95199 Td
+(this)Tj [-250 ]TJ (code)Tj [-250 ]TJ (base.)Tj 
+ET
+1 0 0 1 0 -659.52699 cm
+
+0 g
+0 G
+BT
+/N117 9.96299 Tf
+0 0 Td
+(12)Tj 
+ET
+1 0 0 1 466.25199 0 cm
+
+0 g
+0 G
+PDFVars/TermAll get exec end end
+userdict /pgsave get restore
+showpage
+%%PageTrailer
+%%EndPage
+%%Trailer
+%%DocumentProcessColors: Cyan Magenta Yellow Black
+%%DocumentNeededResources:
+%%+ font Courier-Oblique
+%%+ font Times-Roman
+%%+ font Courier-Bold
+%%+ font Times-Bold
+%%+ font Helvetica-Bold
+%%+ font Times-Italic
+%%+ font Courier
+%%EOF
diff --git a/sp-generate.mak b/sp-generate.mak
new file mode 100644 (file)
index 0000000..9962588
--- /dev/null
@@ -0,0 +1,68 @@
+# This is a Makefile for nmake that makes all the .cxx and .h files that
+# are automatically generated.  It's too painful to do in the IDE.
+# You'll need perl in your PATH to use this.
+
+M4=m4
+PERL=perl
+
+GENSRCS=lib\entmgr_inst.cxx \
+lib\xentmgr_inst.cxx \
+lib\parser_inst.cxx \
+lib\app_inst.cxx \
+lib\arc_inst.cxx \
+lib\ArcEngineMessages.h \
+lib\EntityManagerMessages.h \
+lib\CatalogMessages.h \
+lib\MessageFormatterMessages.h \
+lib\MessageReporterMessages.h \
+lib\PosixStorageMessages.h \
+lib\URLStorageMessages.h \
+lib\WinInetStorageMessages.h \
+lib\StdioStorageMessages.h \
+lib\ParserMessages.h \
+lib\ParserAppMessages.h \
+lib\CmdLineAppMessages.h \
+lib\version.h \
+nsgmls\nsgmls_inst.cxx \
+nsgmls\RastEventHandlerMessages.h \
+nsgmls\NsgmlsMessages.h \
+spam\SpamMessages.h \
+spam\spam_inst.cxx \
+sx\SxMessages.h \
+sx\XmlOutputMessages.h \
+sx\sx_inst.cxx
+
+.SUFFIXES: .m4 .msg
+
+all: $(GENSRCS)
+
+
+.m4.cxx:
+       del /f $@ 2> nul
+       $(PERL) lib\instmac.pl $< >$@
+       attrib +r $@
+
+{lib}.msg{lib}.h:
+       del /f $@ 2> nul
+       $(PERL) -w msggen.pl -l $<
+       attrib +r $@
+
+{nsgmls}.msg{nsgmls}.h:
+       del /f $@ 2> nul
+       $(PERL) -w msggen.pl $<
+       attrib +r $@
+
+{spam}.msg{spam}.h:
+       del /f $@ 2> nul
+       $(PERL) -w msggen.pl $<
+       attrib +r $@
+
+{sx}.msg{sx}.h:
+       del /f $@ 2> nul
+       $(PERL) -w msggen.pl $<
+       attrib +r $@
+
+lib\version.h: lib\mkversion.pl VERSION
+       del /f $@ 2> nul
+       $(PERL) -w lib\mkversion.pl VERSION >$@
+       attrib +r $@
diff --git a/spgrove/GroveApp.cxx b/spgrove/GroveApp.cxx
new file mode 100644 (file)
index 0000000..9bb8d44
--- /dev/null
@@ -0,0 +1,56 @@
+// Copyright (c) 1996 James Clark
+// See the file COPYING for copying permission.
+
+#ifdef __GNUG__
+#pragma implementation
+#endif
+
+#include "config.h"
+#include "GroveApp.h"
+#include "GroveBuilder.h"
+#include "threads.h"
+
+#ifdef SP_NAMESPACE
+namespace SP_NAMESPACE {
+#endif
+
+GroveApp::GroveApp(const char *requiredCodingSystem)
+: ParserApp(requiredCodingSystem)
+{
+}
+
+static int generateEventsThread(void *args)
+{
+  return ((GroveApp::GenerateEventArgs *)args)->run();
+}
+
+int GroveApp::generateEvents(ErrorCountEventHandler *eceh)
+{
+#if 0
+  int ret = ParserApp::generateEvents(eceh);
+  processGrove();
+  return ret;
+#else
+  GenerateEventArgs args(eceh, this);
+  Thread thread(generateEventsThread, &args);
+  processGrove();
+  rootNode_.clear();
+  return thread.wait();
+#endif
+}
+
+ErrorCountEventHandler *GroveApp::makeEventHandler()
+{
+  return GroveBuilder::make(0, this, this, 0, rootNode_);
+}
+
+void GroveApp::dispatchMessage(const Message &message)
+{
+  static Mutex mutex;
+  Mutex::Lock lock(&mutex);
+  MessageReporter::dispatchMessage(message);
+}
+
+#ifdef SP_NAMESPACE
+}
+#endif
diff --git a/spgrove/GroveApp.h b/spgrove/GroveApp.h
new file mode 100644 (file)
index 0000000..7a7c2c9
--- /dev/null
@@ -0,0 +1,58 @@
+// Copyright (c) 1996 James Clark
+// See the file COPYING for copying permission.
+
+#ifndef GroveApp_INCLUDED
+#define GroveApp_INCLUDED 1
+#ifdef __GNUG__
+#pragma interface
+#endif
+
+#include "ParserApp.h"
+#include "GroveBuilder.h"
+#include "HashTable.h"
+
+#ifdef SP_NAMESPACE
+namespace SP_NAMESPACE {
+#endif
+
+class SPGROVE_API GroveApp : public ParserApp {
+public:
+  GroveApp(const char *requiredCodingSystem = 0);
+  ErrorCountEventHandler *makeEventHandler();
+  int generateEvents(ErrorCountEventHandler *eceh);
+  virtual void processGrove() = 0;
+
+  class GenerateEventArgs {
+  public:
+    int run() { return app_->inheritedGenerateEvents(eceh_); }
+  private:
+    GenerateEventArgs(ErrorCountEventHandler *eceh, GroveApp *app)
+      : app_(app), eceh_(eceh) { }
+    ErrorCountEventHandler *eceh_;
+    GroveApp *app_;
+    friend class GroveApp;
+  };
+  friend class GenerateEventArgs;
+  void dispatchMessage(const Message &);
+protected:
+  GROVE_NAMESPACE_SCOPE NodePtr rootNode_;
+private:
+  int inheritedGenerateEvents(ErrorCountEventHandler *eceh) {
+    return ParserApp::generateEvents(eceh);
+  }
+};
+
+inline
+OutputCharStream &operator<<(OutputCharStream &os, 
+#ifdef GROVE_NAMESPACE
+                            GROVE_NAMESPACE::
+#endif
+                            GroveString &str)
+{
+  return os.write(str.data(), str.size());
+}
+
+#ifdef SP_NAMESPACE
+}
+#endif
+#endif /* not GroveApp_INCLUDED */
diff --git a/spgrove/GroveBuilder.cxx b/spgrove/GroveBuilder.cxx
new file mode 100644 (file)
index 0000000..98c77ad
--- /dev/null
@@ -0,0 +1,6294 @@
+// Copyright (c) 1996, 1997 James Clark
+// See the file COPYING for copying permission.
+
+// FIXME location for SgmlDocument node.
+
+#include "config.h"
+#include "Boolean.h"
+#include "Node.h"
+#include "Resource.h"
+#include "Ptr.h"
+#include "xnew.h"
+#include "Event.h"
+#include "GroveBuilder.h"
+#include "ErrorCountEventHandler.h"
+#include "OutputCharStream.h"
+#include "MessageFormatter.h"
+#include "Dtd.h"
+#include "Syntax.h"
+#include "Attribute.h"
+#include "Vector.h"
+#include "LocNode.h"
+#include "SdNode.h"
+#include "threads.h"
+#include "macros.h"
+#include <assert.h>
+#include <stdio.h>
+
+#ifdef _MSC_VER
+#pragma warning ( disable : 4250 ) // inherits via dominance
+#endif
+
+#include <stddef.h>
+#include <string.h>
+
+#ifdef SP_NAMESPACE
+namespace SP_NAMESPACE {
+#endif
+
+#ifdef GROVE_NAMESPACE
+using namespace GROVE_NAMESPACE;
+#endif
+
+static bool blockingAccess = 1;
+
+size_t initialBlockSize = 8192;
+unsigned maxBlocksPerSize = 20;
+
+struct Chunk;
+struct ParentChunk;
+class ElementChunk;
+struct SgmlDocumentChunk;
+class DataChunk;
+class GroveImpl;
+class BaseNode;
+class ChunkNode;
+class ElementNode;
+class DataNode;
+class CdataAttributeValueNode;
+class AttributeValueTokenNode;
+class AttributeAsgnNode;
+class AttributeDefNode;
+class EntityNode;
+class NotationNode;
+class ExternalIdNode;
+class DocumentTypeNode;
+class SgmlConstantsNode;
+class MessageNode;
+class ElementTypeNode;
+class ModelGroupNode;
+class ElementTokenNode;
+class PcdataTokenNode;
+class DefaultEntityNode;
+
+struct Chunk {
+  // second arg never null
+  // Set ptr to a node pointing to first Node in this.
+  virtual AccessResult setNodePtrFirst(NodePtr &ptr,
+                                      const BaseNode *) const = 0;
+  virtual AccessResult setNodePtrFirst(NodePtr &ptr,
+                                      const ElementNode *node) const;
+  virtual AccessResult setNodePtrFirst(NodePtr &ptr,
+                                      const DataNode *node) const;
+  virtual const Chunk *after() const = 0;
+  virtual AccessResult getFollowing(const GroveImpl *,
+                                    const Chunk *&, unsigned long &nNodes)
+    const;
+  virtual AccessResult getFirstSibling(const GroveImpl *, const Chunk *&) const;
+  virtual const StringC *id() const;
+  virtual Boolean getLocOrigin(const Origin *&) const;
+  ParentChunk *origin;
+};
+
+struct LocChunk : public Chunk {
+  Index locIndex;
+};
+
+struct ParentChunk : public LocChunk {
+  ParentChunk() : nextSibling(0) { }
+  Chunk *nextSibling;
+};
+
+class ElementChunk : public ParentChunk {
+public:
+  virtual const AttributeValue *
+    attributeValue(size_t attIndex, const GroveImpl &grove) const;
+  virtual Boolean mustOmitEndTag() const;
+  virtual Boolean included() const;
+  const AttributeDefinitionList *attDefList() const;
+  AccessResult setNodePtrFirst(NodePtr &ptr, const BaseNode *node) const;
+  AccessResult setNodePtrFirst(NodePtr &ptr, const DataNode *node) const;
+  AccessResult setNodePtrFirst(NodePtr &ptr, const ElementNode *node) const;
+  static const StringC &key(const ElementChunk &chunk) { return *chunk.id(); }
+  const Chunk *after() const;
+  AccessResult getFollowing(const GroveImpl *, const Chunk *&, unsigned long &nNodes)
+    const;
+  const ElementType *elementType() const { return type; }
+private:
+  friend class ElementNode;
+  const ElementType *type;
+public:
+  unsigned long elementIndex;
+};
+
+inline
+const AttributeDefinitionList *ElementChunk::attDefList() const
+{
+  return type->attributeDefTemp();
+}
+
+class LocOriginChunk : public Chunk {
+public:
+  LocOriginChunk(const Origin *lo) : locOrigin(lo) { }
+  AccessResult setNodePtrFirst(NodePtr &ptr, const BaseNode *) const;
+  AccessResult setNodePtrFirst(NodePtr &ptr, const ElementNode *node) const;
+  AccessResult setNodePtrFirst(NodePtr &ptr, const DataNode *node) const;
+  const Chunk *after() const;
+  AccessResult getFollowing(const GroveImpl *,
+                            const Chunk *&, unsigned long &nNodes)
+    const;
+  Boolean getLocOrigin(const Origin *&) const;
+private:
+  const Origin *locOrigin;
+};
+
+class MessageItem {
+public:
+  MessageItem(Node::Severity severity, const StringC &text, const Location &loc)
+    : severity_(severity), text_(text), loc_(loc), next_(0) { }
+  Node::Severity severity() const { return severity_; }
+  const Location &loc() const { return loc_; }
+  const StringC &text() const { return text_; }
+  const MessageItem *next() const { return next_; }
+  MessageItem **nextP() { return &next_; }
+private:
+  Node::Severity severity_;
+  StringC text_;
+  Location loc_;
+  MessageItem *next_;
+};
+
+// multiple threads using const interface.
+
+class GroveImpl {
+public:
+  GroveImpl(unsigned groveIndex);
+
+  // Const interface
+  void addRef() const { ++(((GroveImpl *)this)->refCount_); }
+  void release() const {
+    if (!--(((GroveImpl *)this)->refCount_))
+      delete (GroveImpl *)this;
+  }
+  unsigned groveIndex() const { return groveIndex_; }
+  const SgmlDocumentChunk *root() const { return root_; }
+  const AttributeValue *impliedAttributeValue() const {
+    return impliedAttributeValue_.pointer();
+  }
+  // Return 0 if not yet available.
+  Boolean getAppinfo(const StringC *&) const;
+  const SubstTable *generalSubstTable() const {
+    return instanceSyntax_.isNull() ? 0 : instanceSyntax_->generalSubstTable();
+  }
+  const SubstTable *entitySubstTable() const {
+    return instanceSyntax_.isNull() ? 0 : instanceSyntax_->entitySubstTable();
+  }
+  // Be careful not to change ref counts while accessing DTD.
+  const Dtd *governingDtd() const { return dtd_.pointer(); }
+  // must not be called till grove is complete
+  Dtd::ConstEntityIter defaultedEntityIter() const;
+  const Entity *lookupDefaultedEntity(const StringC &) const;
+  const ElementChunk *lookupElement(const StringC &) const;
+  typedef PointerTableIter<ElementChunk *,StringC,Hash,ElementChunk> ElementIter;
+  // must not be called till grove is complete
+  ElementIter elementIter() const;
+  Boolean complete() const { return complete_; }
+  const void *completeLimit() const { return completeLimit_; }
+  const void *completeLimitWithLocChunkAfter() const {
+    return completeLimitWithLocChunkAfter_;
+  }
+  const Origin *currentLocOrigin() const { return currentLocOrigin_; }
+  Boolean hasDefaultEntity() const { return hasDefaultEntity_; }
+  Boolean maybeMoreSiblings(const ParentChunk *chunk) const;
+  // return zero for timeout
+  Boolean waitForMoreNodes() const;
+  AccessResult proxifyLocation(const Location &, Location &) const;
+  const MessageItem *messageList() const { return messageList_; }
+  // must not be called till grove is complete
+  void getSd(ConstPtr<Sd> &, ConstPtr<Syntax> &, ConstPtr<Syntax> &) const;
+  // non-const interface
+  void *allocChunk(size_t);
+  void appendSibling(Chunk *);
+  void appendSibling(DataChunk *);
+  Boolean tryExtend(size_t n) {
+    if (n <= nFree_) {
+      nFree_ -= n;
+      freePtr_ += n;
+      return 1;
+    }
+    else
+      return 0;
+  }
+  DataChunk *pendingData() { return pendingData_; }
+  void push(ElementChunk *, Boolean hasId);
+  void pop();
+  void setAppinfo(const StringC &);
+  void setDtd(const ConstPtr<Dtd> &dtd);
+  void setSd(const ConstPtr<Sd> &, const ConstPtr<Syntax> &, const ConstPtr<Syntax> &);
+  void storeAttributeValue(const ConstPtr<AttributeValue> &value) {
+    values_.push_back(value);
+  }
+  void addDefaultedEntity(const ConstPtr<Entity> &);
+  void setComplete();
+  Boolean haveRootOrigin();
+  void setLocOrigin(const ConstPtr<Origin> &);
+  void appendMessage(MessageItem *);
+  ~GroveImpl();
+private:
+  GroveImpl(const GroveImpl &);
+  void operator=(const GroveImpl &);
+
+  Boolean maybeMoreSiblings1(const ParentChunk *) const;
+  void *allocFinish(size_t);
+  void pulse();
+  void maybePulse();
+  void finishDocumentElement();
+  void finishProlog();
+  void addBarrier();
+  void storeLocOrigin(const ConstPtr<Origin> &);
+
+  struct BlockHeader {
+    BlockHeader() : next(0) { }
+    BlockHeader *next;
+  };
+  unsigned groveIndex_;
+  SgmlDocumentChunk *root_;
+  ParentChunk *origin_;
+  DataChunk *pendingData_;
+  Chunk **tailPtr_;
+  ConstPtr<Dtd> dtd_;
+  ConstPtr<Sd> sd_;
+  ConstPtr<Syntax> prologSyntax_;
+  ConstPtr<Syntax> instanceSyntax_;
+  ConstPtr<AttributeValue> impliedAttributeValue_;
+  Vector<ConstPtr<AttributeValue> > values_;
+  Vector<ConstPtr<Origin> > origins_;
+  NamedResourceTable<Entity> defaultedEntityTable_;
+  PointerTable<ElementChunk *,StringC,Hash,ElementChunk> idTable_;
+  Boolean hasDefaultEntity_;
+  Boolean haveAppinfo_;
+  StringC appinfo_;
+  const Origin *currentLocOrigin_;
+
+  Boolean complete_;
+  const void *completeLimit_;
+  const void *completeLimitWithLocChunkAfter_;
+  // pointer to first free byte in current block
+  char *freePtr_;
+  // free bytes in current block
+  // there's space for a forwarding chunk after this if freePtr_ != 0
+  size_t nFree_;
+  // the head of the list of blocks
+  BlockHeader *blocks_;
+  // where to store pointer to next block
+  BlockHeader **blockTailPtr_;
+  // current normal size for a block
+  size_t blockAllocSize_;
+  // number of blocks allocated at this size
+  size_t nBlocksThisSizeAlloced_;
+  RefCount refCount_;
+  mutable Condition moreNodesCondition_;
+  Mutex mutex_;
+  Mutex *mutexPtr_;
+  unsigned pulseStep_;
+  unsigned long nEvents_;
+  unsigned long nElements_;
+  enum { maxChunksWithoutLocOrigin = 100 };
+  unsigned nChunksSinceLocOrigin_;
+  MessageItem *messageList_;
+  MessageItem **messageListTailP_;
+};
+
+class GroveImplPtr {
+public:
+  GroveImplPtr(const GroveImpl *grove) : grove_(grove) { grove_->addRef(); }
+  ~GroveImplPtr() { grove_->release(); }
+  const GroveImpl *operator->() const { return grove_; }
+  operator const GroveImpl *() const { return grove_; }
+private:
+  GroveImplPtr(const GroveImplPtr &); // undefined
+  void operator=(const GroveImplPtr &);        // undefined
+  const GroveImpl *grove_;
+};
+
+class GroveImplProxyOrigin : public ProxyOrigin {
+public:
+  GroveImplProxyOrigin(const GroveImpl *grove, const Origin *origin)
+    : grove_(grove), ProxyOrigin(origin) { }
+private:
+  GroveImplPtr grove_;
+};
+
+class GroveBuilderMessageEventHandler : public ErrorCountEventHandler {
+public:
+  GroveBuilderMessageEventHandler(unsigned groveIndex, Messenger *mgr, MessageFormatter *msgFmt_);
+  ~GroveBuilderMessageEventHandler();
+  void message(MessageEvent *);
+  void sgmlDecl(SgmlDeclEvent *);
+  void makeInitialRoot(NodePtr &);
+  void setSd(const ConstPtr<Sd> &, const ConstPtr<Syntax> &, const ConstPtr<Syntax> &);
+protected:
+  GroveImpl *grove_;
+private:
+  Messenger *mgr_;
+  MessageFormatter *msgFmt_;
+};
+
+class GroveBuilderEventHandler : public GroveBuilderMessageEventHandler {
+public:
+  GroveBuilderEventHandler(unsigned groveIndex, Messenger *mgr, MessageFormatter *msgFmt_);
+  void appinfo(AppinfoEvent *);
+  void startElement(StartElementEvent *);
+  void endElement(EndElementEvent *);
+  void data(DataEvent *);
+  void sdataEntity(SdataEntityEvent *);
+  void nonSgmlChar(NonSgmlCharEvent *);
+  void externalDataEntity(ExternalDataEntityEvent *);
+  void subdocEntity(SubdocEntityEvent *);
+  void pi(PiEvent *);
+  void endProlog(EndPrologEvent *);
+  void entityDefaulted(EntityDefaultedEvent *);
+};
+
+inline
+void setString(GroveString &to, const StringC &from)
+{
+  to.assign(from.data(), from.size());
+}
+
+inline
+bool operator==(const StringC &str1, const GroveString &str2)
+{
+  return (str1.size() == str2.size()
+          && memcmp(str1.data(), str2.data(), str1.size()*sizeof(Char)) == 0);
+}
+
+inline
+bool operator!=(const StringC &str1, const GroveString &str2)
+{
+  return !(str1 == str2);
+}
+
+inline
+size_t roundUp(size_t n)
+{
+  return (n + (sizeof(void *) - 1)) & ~(sizeof(void *) - 1);
+}
+
+// All nodes in this grove must be derived from BaseNode.
+
+class BaseNode : public Node, public LocNode {
+public:
+  BaseNode(const GroveImpl *grove);
+  virtual ~BaseNode();
+  void addRef();
+  void release();
+  bool canReuse(NodePtr &ptr) const;
+  unsigned groveIndex() const;
+  bool operator==(const Node &node) const;
+  // Implemented with double dispatching.
+  virtual bool same(const BaseNode &) const = 0;
+  // The second half of the dispatch.
+  virtual bool same2(const ChunkNode *) const;
+  virtual bool same2(const DataNode *) const;
+  virtual bool same2(const AttributeAsgnNode *) const;
+  virtual bool same2(const AttributeValueTokenNode *) const;
+  virtual bool same2(const CdataAttributeValueNode *) const;
+  virtual bool same2(const EntityNode *) const;
+  virtual bool same2(const NotationNode *) const;
+  virtual bool same2(const ExternalIdNode *) const;
+  virtual bool same2(const DocumentTypeNode *) const;
+  virtual bool same2(const SgmlConstantsNode *) const;
+  virtual bool same2(const MessageNode *) const;
+  virtual bool same2(const ElementTypeNode *) const;
+  virtual bool same2(const ModelGroupNode *) const;
+  virtual bool same2(const ElementTokenNode *) const;
+  virtual bool same2(const PcdataTokenNode *) const;
+  virtual bool same2(const AttributeDefNode *) const;
+  virtual bool same2(const DefaultEntityNode *) const;
+  const GroveImpl *grove() const { return grove_; }
+  AccessResult nextSibling(NodePtr &ptr) const;
+  AccessResult follow(NodeListPtr &ptr) const;
+  AccessResult children(NodeListPtr &) const;
+  AccessResult getOrigin(NodePtr &ptr) const;
+  AccessResult getGroveRoot(NodePtr &ptr) const;
+  AccessResult getLocation(Location &) const;
+  bool queryInterface(IID, const void *&) const;
+  bool chunkContains(const Node &) const;
+  bool inChunk(const DataNode *node) const;
+  bool inChunk(const CdataAttributeValueNode *) const;
+protected:
+  static unsigned long secondHash(unsigned long n) {
+    return n * 1001;
+  }
+private:
+  unsigned refCount_;
+  GroveImplPtr grove_;
+};
+
+inline
+BaseNode::BaseNode(const GroveImpl *grove)
+: grove_(grove), refCount_(0)
+{
+}
+
+inline
+bool BaseNode::canReuse(NodePtr &ptr) const
+{
+  const Node *tem = &*ptr;
+  return tem == this && refCount_ == 1;
+}
+
+struct ForwardingChunk : Chunk {
+  ForwardingChunk(const Chunk *to, ParentChunk *p)
+    : forwardTo(to) { origin = p; }
+  AccessResult setNodePtrFirst(NodePtr &ptr, const BaseNode *node) const;
+  AccessResult getFollowing(const GroveImpl *,
+                            const Chunk *&, unsigned long &nNodes)
+    const;
+  const Chunk *after() const { return forwardTo; }
+  const Chunk *forwardTo;
+};
+
+class ChunkNode : public BaseNode {
+public:
+  ChunkNode(const GroveImpl *grove, const LocChunk *chunk);
+  const LocChunk *chunk() const { return chunk_; }
+  bool same(const BaseNode &node) const;
+  bool same2(const ChunkNode *node) const;
+  unsigned long hash() const;
+  AccessResult getParent(NodePtr &ptr) const;
+  AccessResult getTreeRoot(NodePtr &ptr) const;
+  AccessResult getOrigin(NodePtr &) const;
+  AccessResult getOriginToSubnodeRelPropertyName(ComponentName::Id &) const;
+  AccessResult nextChunkSibling(NodePtr &) const;
+  AccessResult nextChunkAfter(NodePtr &) const;
+  AccessResult firstSibling(NodePtr &) const;
+  AccessResult siblingsIndex(unsigned long &) const;
+  AccessResult followSiblingRef(unsigned long, NodePtr &) const;
+  AccessResult getLocation(Location &) const;
+protected:
+  const LocChunk *chunk_;              // never null
+};
+
+inline
+ChunkNode::ChunkNode(const GroveImpl *grove, const LocChunk *chunk)
+: BaseNode(grove), chunk_(chunk)
+{
+}
+
+class SgmlDocumentNode;
+
+struct SgmlDocumentChunk : public ParentChunk {
+  SgmlDocumentChunk() : prolog(0), documentElement(0), epilog(0) { }
+  Chunk *prolog;
+  Chunk *documentElement;
+  Chunk *epilog;
+  AccessResult setNodePtrFirst(NodePtr &ptr, const BaseNode *node) const;
+  const Chunk *after() const { return this + 1; }
+};
+
+class SgmlDocumentNode : public ChunkNode, public SdNode {
+public:
+  SgmlDocumentNode(const GroveImpl *grove,
+                  const SgmlDocumentChunk *chunk);
+  void accept(NodeVisitor &visitor);
+  const ClassDef &classDef() const { return ClassDef::sgmlDocument; }
+  AccessResult getDocumentElement(NodePtr &ptr) const;
+  AccessResult getElements(NamedNodeListPtr &ptr) const;
+  AccessResult getEntities(NamedNodeListPtr &ptr) const;
+  AccessResult getDefaultedEntities(NamedNodeListPtr &ptr) const;
+  AccessResult getGoverningDoctype(NodePtr &ptr) const;
+  AccessResult getDoctypesAndLinktypes(NamedNodeListPtr &ptr) const;
+  AccessResult getProlog(NodeListPtr &ptr) const;
+  AccessResult getEpilog(NodeListPtr &ptr) const;
+  AccessResult getSgmlConstants(NodePtr &) const;
+  AccessResult getApplicationInfo(GroveString &str) const;
+  AccessResult getMessages(NodeListPtr &ptr) const;
+  AccessResult nextChunkSibling(NodePtr &) const { return accessNotInClass; }
+  AccessResult firstSibling(NodePtr &) const { return accessNotInClass; }
+  AccessResult siblingsIndex(unsigned long &) const { return accessNotInClass; }
+  AccessResult getOriginToSubnodeRelPropertyName(ComponentName::Id &) const { return accessNull; }
+  AccessResult getSd(ConstPtr<Sd> &sd,
+                    ConstPtr<Syntax> &prologSyntax,
+                    ConstPtr<Syntax> &instanceSyntax) const;
+private:
+  const SgmlDocumentChunk *chunk() const {
+    return (const SgmlDocumentChunk *)ChunkNode::chunk();
+  }
+};
+
+inline
+SgmlDocumentNode::SgmlDocumentNode(const GroveImpl *grove,
+                                  const SgmlDocumentChunk *chunk)
+: ChunkNode(grove, chunk)
+{
+}
+
+// array of pointers to attribute values stored after chunk
+
+class AttElementChunk : private ElementChunk {
+protected:
+  AttElementChunk(size_t n) : nAtts(n) { }
+  friend class ElementNode;
+private:
+  const AttributeValue *
+    attributeValue(size_t attIndex, const GroveImpl &) const;
+  Boolean mustOmitEndTag() const;
+  const Chunk *after() const;
+  const StringC *id() const;
+  size_t nAtts;
+};
+
+class IncludedElementChunk : public ElementChunk {
+  friend class ElementNode;
+  Boolean included() const;
+};
+
+class IncludedAttElementChunk : public AttElementChunk {
+  IncludedAttElementChunk(size_t n) : AttElementChunk(n) { }
+  friend class ElementNode;
+  Boolean included() const;
+};
+
+class ElementNode : public ChunkNode {
+public:
+  friend class ElementChunk;
+  ElementNode(const GroveImpl *grove, const ElementChunk *chunk)
+    : ChunkNode(grove, chunk) { }
+  AccessResult attributeRef(unsigned long i, NodePtr &ptr) const;
+  AccessResult nextChunkSibling(NodePtr &ptr) const;
+  AccessResult nextChunkAfter(NodePtr &) const;
+  AccessResult firstChild(NodePtr &ptr) const;
+  AccessResult getAttributes(NamedNodeListPtr &ptr) const;
+  AccessResult getGi(GroveString &str) const;
+  bool hasGi(GroveString) const;
+  AccessResult getId(GroveString &str) const;
+  AccessResult getContent(NodeListPtr &ptr) const;
+  AccessResult getMustOmitEndTag(bool &) const;
+  AccessResult getIncluded(bool &) const;
+  AccessResult elementIndex(unsigned long &) const;
+  AccessResult getElementType(NodePtr &) const;
+  void accept(NodeVisitor &visitor);
+  const ClassDef &classDef() const { return ClassDef::element; }
+  static void add(GroveImpl &grove, const StartElementEvent &event);
+private:
+  static
+    ElementChunk *makeAttElementChunk(GroveImpl &grove,
+                                     const StartElementEvent &,
+                                     Boolean &hasId);
+  const ElementChunk *chunk() const {
+    return (const ElementChunk *)ChunkNode::chunk();
+  }
+  void reuseFor(const ElementChunk *chunk) { chunk_ = chunk; }
+};
+
+class CharsChunk : public LocChunk {
+public:
+  const Chunk *after() const {
+    return (const Chunk *)((char *)this + allocSize(size));
+  }
+  const Char *data() const { return (const Char *)(this + 1); }
+  size_t size;
+  static size_t allocSize(size_t nChars) {
+    return roundUp(sizeof(CharsChunk) + nChars*sizeof(Char));
+  }
+};
+// The characters immediately follow the chunk
+
+class DataChunk : public CharsChunk {
+private:
+  friend class DataNode;
+  AccessResult setNodePtrFirst(NodePtr &ptr, const BaseNode *node) const;
+  AccessResult setNodePtrFirst(NodePtr &ptr, const ElementNode *node) const;
+  AccessResult setNodePtrFirst(NodePtr &ptr, const DataNode *node) const;
+  AccessResult getFollowing(const GroveImpl *, const Chunk *&, unsigned long &) const;
+};
+
+class DataNode : public ChunkNode {
+public:
+  friend class DataChunk;
+  DataNode(const GroveImpl *, const DataChunk *chunk, size_t index);
+  bool same(const BaseNode &node) const;
+  bool same2(const DataNode *node) const;
+  AccessResult nextSibling(NodePtr &ptr) const;
+  AccessResult nextChunkSibling(NodePtr &ptr) const;
+  AccessResult nextChunkAfter(NodePtr &) const;
+  AccessResult siblingsIndex(unsigned long &) const;
+  AccessResult followSiblingRef(unsigned long, NodePtr &) const;
+  AccessResult charChunk(const SdataMapper &, GroveString &) const;
+  bool chunkContains(const Node &) const;
+  bool inChunk(const DataNode *node) const;
+  AccessResult getNonSgml(unsigned long &) const;
+  AccessResult getLocation(Location &) const;
+  void accept(NodeVisitor &visitor);
+  const ClassDef &classDef() const { return ClassDef::dataChar; }
+  unsigned long hash() const;
+  static void add(GroveImpl &grove, const DataEvent &event);
+private:
+  const DataChunk *chunk() const {
+    return (const DataChunk *)ChunkNode::chunk();
+  }
+  void reuseFor(const DataChunk *chunk, size_t index);
+  size_t index_;
+};
+
+inline
+DataNode::DataNode(const GroveImpl *grove,
+                  const DataChunk *chunk, size_t index)
+: ChunkNode(grove, chunk), index_(index)
+{
+}
+
+class PiChunk : protected CharsChunk {
+  friend class PiNode;
+  AccessResult setNodePtrFirst(NodePtr &ptr, const BaseNode *node) const;
+};
+
+class PrologPiChunk : public PiChunk {
+  AccessResult getFirstSibling(const GroveImpl *, const struct Chunk *&) const;
+};
+
+class EpilogPiChunk : public PiChunk {
+  AccessResult getFirstSibling(const GroveImpl *, const struct Chunk *&) const;
+};
+
+class PiNode : public ChunkNode {
+public:
+  PiNode(const GroveImpl *grove, const PiChunk *chunk)
+    : ChunkNode(grove, chunk) {}
+  AccessResult getSystemData(GroveString &) const;
+  AccessResult getEntityName(GroveString &) const{ return accessNull; }
+  AccessResult getEntity(NodePtr &) const { return accessNull; }
+  void accept(NodeVisitor &visitor) { visitor.pi(*this); }
+  const ClassDef &classDef() const { return ClassDef::pi; }
+  static void add(GroveImpl &grove, const PiEvent &);
+private:
+  const PiChunk *chunk() const {
+    return (const PiChunk *)ChunkNode::chunk();
+  }
+};
+
+class EntityRefChunk : public LocChunk {
+public:
+  const Entity *entity;
+  const Chunk *after() const { return this + 1; }
+};
+
+class EntityRefNode : public ChunkNode {
+public:
+  EntityRefNode(const GroveImpl *grove, const EntityRefChunk *chunk)
+    : ChunkNode(grove, chunk) { }
+  AccessResult getEntity(NodePtr &) const;
+  AccessResult getEntityName(GroveString &) const;
+protected:
+  const EntityRefChunk *chunk() const {
+    return (const EntityRefChunk *)ChunkNode::chunk();
+  }
+};
+
+class SdataNode;
+
+class SdataChunk : private EntityRefChunk {
+  friend class SdataNode;
+  AccessResult setNodePtrFirst(NodePtr &ptr, const BaseNode *node) const;
+};
+
+class SdataNode : public EntityRefNode {
+public:
+  SdataNode(const GroveImpl *grove, const SdataChunk *chunk)
+    : EntityRefNode(grove, chunk) { }
+  AccessResult charChunk(const SdataMapper &, GroveString &) const;
+  AccessResult getSystemData(GroveString &str) const;
+  void accept(NodeVisitor &visitor) { visitor.sdata(*this); }
+  const ClassDef &classDef() const { return ClassDef::sdata; }
+  static void add(GroveImpl &grove, const SdataEntityEvent &event);
+private:
+  Char c_;
+};
+
+class NonSgmlNode;
+
+class NonSgmlChunk : public LocChunk {
+public:
+  Char c;
+  AccessResult setNodePtrFirst(NodePtr &ptr, const BaseNode *node) const;
+  const Chunk *after() const { return this + 1; }
+};
+
+class NonSgmlNode : public ChunkNode {
+public:
+  NonSgmlNode(const GroveImpl *grove, const NonSgmlChunk *chunk)
+    : ChunkNode(grove, chunk) { }
+  AccessResult charChunk(const SdataMapper &, GroveString &) const;
+  AccessResult getNonSgml(unsigned long &) const;
+  void accept(NodeVisitor &visitor) { visitor.nonSgml(*this); }
+  const ClassDef &classDef() const { return ClassDef::nonSgml; }
+  static void add(GroveImpl &grove, const NonSgmlCharEvent &event);
+protected:
+  const NonSgmlChunk *chunk() const {
+    return (const NonSgmlChunk *)ChunkNode::chunk();
+  }
+};
+
+class ExternalDataNode;
+
+class ExternalDataChunk : private EntityRefChunk {
+  friend class ExternalDataNode;
+  AccessResult setNodePtrFirst(NodePtr &ptr, const BaseNode *node) const;
+};
+
+class ExternalDataNode : public EntityRefNode {
+public:
+  ExternalDataNode(const GroveImpl *grove, const ExternalDataChunk *chunk)
+    : EntityRefNode(grove, chunk) { }
+  void accept(NodeVisitor &visitor) { visitor.externalData(*this); }
+  const ClassDef &classDef() const { return ClassDef::externalData; }
+  static void add(GroveImpl &grove, const ExternalDataEntityEvent &event);
+};
+
+class SubdocChunk : private EntityRefChunk {
+  friend class SubdocNode;
+  AccessResult setNodePtrFirst(NodePtr &ptr, const BaseNode *node) const;
+};
+
+class SubdocNode : public EntityRefNode {
+public:
+  SubdocNode(const GroveImpl *grove, const SubdocChunk *chunk)
+    : EntityRefNode(grove, chunk) { }
+  void accept(NodeVisitor &visitor) { visitor.subdocument(*this); }
+  const ClassDef &classDef() const { return ClassDef::subdocument; }
+  static void add(GroveImpl &grove, const SubdocEntityEvent &event);
+};
+
+class PiEntityChunk : private EntityRefChunk {
+  friend class PiEntityNode;
+  AccessResult setNodePtrFirst(NodePtr &ptr, const BaseNode *node) const;
+};
+
+class PiEntityNode : public EntityRefNode {
+public:
+  PiEntityNode(const GroveImpl *grove, const PiEntityChunk *chunk)
+    : EntityRefNode(grove, chunk) { }
+  AccessResult getSystemData(GroveString &) const;
+  void accept(NodeVisitor &visitor) { visitor.pi(*this); }
+  const ClassDef &classDef() const { return ClassDef::pi; }
+  static void add(GroveImpl &grove,  const Entity *, const Location &);
+};
+
+struct AttributeDefOrigin {
+  AttributeDefOrigin(size_t attIndex = 0) : attIndex_(attIndex) { }
+  virtual const AttributeDefinitionList *attDefList() const = 0;
+  virtual Node *makeCdataAttributeValueNode(const GroveImpl *grove,
+                                           const AttributeValue *value,
+                                           size_t attIndex,
+                                           const TextIter &iter,
+                                           size_t charIndex = 0) const = 0;
+  virtual Node *makeAttributeValueTokenNode(const GroveImpl *grove,
+                                           const TokenizedAttributeValue *value,
+                                           size_t attIndex,
+                                           size_t tokenIndex) const = 0;
+  virtual Node *makeOriginNode(const GroveImpl *grove, size_t attIndex) const = 0;
+  virtual AccessResult makeAttributeValueNode(const GroveImpl *grove,
+                                              NodePtr &ptr,
+                                              const AttributeValue *value) const;
+  virtual AccessResult makeAttributeValueNodeList(const GroveImpl *grove,
+                                                  NodeListPtr &ptr,
+                                                  const AttributeValue *value) const;
+  virtual AccessResult makeAttributeDefNode(const GroveImpl *grove,
+                                            NodePtr &ptr,
+                                            size_t attributeDefIdx) const = 0;
+  virtual AccessResult makeAttributeDefList(const GroveImpl *,
+                                            NodeListPtr &,
+                                            size_t) const {
+    return accessNull;
+  } 
+  AccessResult makeAttributeDefNode(const GroveImpl *grove,
+                                    NodePtr &ptr,
+                                    const StringC &name) const;
+  virtual const void *attributeOriginId() const = 0;
+  const size_t attIndex() const { return attIndex_; }
+protected:
+  size_t attIndex_;
+};
+
+struct AttributeOrigin : public virtual AttributeDefOrigin {
+  virtual const AttributeValue *
+    attributeValue(size_t attIndex, const GroveImpl &grove) const = 0;
+  virtual AccessResult
+    setNodePtrAttributeOrigin(NodePtr &, const BaseNode *) const = 0;
+  virtual Node *makeAttributeAsgnNode(const GroveImpl *grove,
+                                     size_t attIndex) const = 0;
+};
+
+class ElementAttributeOrigin : public virtual AttributeOrigin {
+public:
+  ElementAttributeOrigin(const ElementChunk *);
+  const AttributeDefinitionList *attDefList() const;
+  const AttributeValue *
+    attributeValue(size_t attIndex, const GroveImpl &grove) const;
+  AccessResult setNodePtrAttributeOrigin(NodePtr &, const BaseNode *) const;
+  Node *makeCdataAttributeValueNode(const GroveImpl *grove,
+                                   const AttributeValue *value,
+                                   size_t attIndex,
+                                   const TextIter &iter,
+                                   size_t charIndex) const;
+  Node *makeAttributeValueTokenNode(const GroveImpl *grove,
+                                   const TokenizedAttributeValue *value,
+                                   size_t attIndex,
+                                   size_t tokenIndex) const;
+  Node *makeAttributeAsgnNode(const GroveImpl *grove,
+                             size_t attIndex) const;
+  virtual Node *makeOriginNode(const GroveImpl *grove, size_t attIndex) const;
+  virtual AccessResult makeAttributeDefNode(const GroveImpl *grove,
+                                            NodePtr &ptr,
+                                            size_t attributeDefIdx) const;
+  const void *attributeOriginId() const;
+private:
+  const ElementChunk *chunk_;
+};
+
+class EntityAttributeOrigin : public virtual AttributeOrigin {
+public:
+  EntityAttributeOrigin(const ExternalDataEntity *);
+  const AttributeDefinitionList *attDefList() const;
+  const AttributeValue *
+    attributeValue(size_t attIndex, const GroveImpl &grove) const;
+  AccessResult setNodePtrAttributeOrigin(NodePtr &, const BaseNode *) const;
+  Node *makeCdataAttributeValueNode(const GroveImpl *grove,
+                                   const AttributeValue *value,
+                                   size_t attIndex,
+                                   const TextIter &iter,
+                                   size_t charIndex) const;
+  Node *makeAttributeValueTokenNode(const GroveImpl *grove,
+                                   const TokenizedAttributeValue *value,
+                                   size_t attIndex,
+                                   size_t tokenIndex) const;
+  Node *makeAttributeAsgnNode(const GroveImpl *grove,
+                             size_t attIndex) const;
+  virtual AccessResult makeAttributeDefNode(const GroveImpl *grove,
+                                            NodePtr &ptr,
+                                            size_t attributeDefIdx) const;
+  virtual Node *makeOriginNode(const GroveImpl *grove, size_t attIndex) const;
+  const void *attributeOriginId() const;
+private:
+  const ExternalDataEntity *entity_;
+};
+
+// CLASS DEF: ElementTypeAttributeDefOrigin
+class ElementTypeAttributeDefOrigin : public virtual AttributeDefOrigin {
+public:
+  ElementTypeAttributeDefOrigin(const ElementType *);
+  const AttributeDefinitionList *attDefList() const;
+  Node *makeCdataAttributeValueNode(const GroveImpl *grove,
+                                   const AttributeValue *value,
+                                   size_t attIndex,
+                                   const TextIter &iter,
+                                   size_t charIndex) const;
+  Node *makeAttributeValueTokenNode(const GroveImpl *grove,
+                                   const TokenizedAttributeValue *value,
+                                   size_t attIndex,
+                                   size_t tokenIndex) const;
+  virtual AccessResult makeAttributeDefNode(const GroveImpl *grove,
+                                            NodePtr &ptr,
+                                            size_t attributeDefIdx) const;
+  virtual AccessResult makeAttributeDefList(const GroveImpl *grove,
+                                            NodeListPtr &ptr,
+                                            size_t firstAttDefIdx) const;
+  virtual Node *makeOriginNode(const GroveImpl *grove, size_t attIndex) const;
+  virtual const void *attributeOriginId() const;
+protected:
+  const ElementType *elementType_;
+};
+
+// CLASS DEF: NotationAttributeDefOrigin
+class NotationAttributeDefOrigin : public virtual AttributeDefOrigin {
+public:
+  NotationAttributeDefOrigin(const Notation *);
+  virtual const AttributeDefinitionList *attDefList() const;
+  Node *makeCdataAttributeValueNode(const GroveImpl *grove,
+                                   const AttributeValue *value,
+                                   size_t attIndex,
+                                   const TextIter &iter,
+                                   size_t charIndex) const;
+  Node *makeAttributeValueTokenNode(const GroveImpl *grove,
+                                   const TokenizedAttributeValue *value,
+                                   size_t attIndex,
+                                   size_t tokenIndex) const;
+  virtual AccessResult makeAttributeDefNode(const GroveImpl *grove,
+                                            NodePtr &ptr,
+                                            size_t attributeDefIdx) const;
+  virtual AccessResult makeAttributeDefList(const GroveImpl *grove,
+                                            NodeListPtr &ptr,
+                                            size_t firstAttDefIdx) const;
+  virtual Node *makeOriginNode(const GroveImpl *grove, size_t attIndex) const;
+  virtual const void *attributeOriginId() const;
+protected:
+  const Notation *notation_;
+};
+
+class AttributeAsgnNode : public BaseNode, public virtual AttributeOrigin {
+public:
+  AttributeAsgnNode(const GroveImpl *grove, size_t attIndex);
+  AccessResult getOrigin(NodePtr &ptr) const;
+  AccessResult getName(GroveString &str) const;
+  AccessResult getImplied(bool &implied) const;
+  AccessResult getValue(NodeListPtr &ptr) const;
+  AccessResult children(NodeListPtr &ptr) const;
+  AccessResult firstChild(NodePtr &ptr) const;
+  AccessResult nextChunkSibling(NodePtr &ptr) const;
+  AccessResult followSiblingRef(unsigned long, NodePtr &) const;
+  AccessResult firstSibling(NodePtr &) const;
+  AccessResult siblingsIndex(unsigned long &) const;
+  AccessResult getTokenSep(Char &) const;
+  AccessResult tokens(GroveString &) const;
+  AccessResult getAttributeDef(NodePtr &) const;
+  void accept(NodeVisitor &visitor);
+  const ClassDef &classDef() const { return ClassDef::attributeAssignment; }
+  AccessResult getOriginToSubnodeRelPropertyName(ComponentName::Id &name) const {
+    name = ComponentName::idAttributes;
+    return accessOK;
+  }
+  bool same(const BaseNode &node) const;
+  bool same2(const AttributeAsgnNode *node) const;
+  unsigned long hash() const;
+};
+
+class ElementAttributeAsgnNode
+: public AttributeAsgnNode, public ElementAttributeOrigin {
+public:
+  ElementAttributeAsgnNode(const GroveImpl *grove, size_t attIndex,
+                          const ElementChunk *);
+};
+
+class EntityAttributeAsgnNode
+: public AttributeAsgnNode, public EntityAttributeOrigin {
+public:
+  EntityAttributeAsgnNode(const GroveImpl *grove, size_t attIndex,
+                          const ExternalDataEntity *);
+};
+
+class AttributeValueTokenNode
+: public BaseNode, public virtual AttributeDefOrigin {
+public:
+  AttributeValueTokenNode(const GroveImpl *grove,
+                         const TokenizedAttributeValue *value,
+                          size_t attIndex,
+                         size_t tokenIndex);
+  AccessResult getParent(NodePtr &ptr) const;
+  AccessResult nextChunkSibling(NodePtr &ptr) const;
+  AccessResult followSiblingRef(unsigned long, NodePtr &ptr) const;
+  AccessResult firstSibling(NodePtr &) const;
+  AccessResult siblingsIndex(unsigned long &) const;
+  AccessResult getToken(GroveString &str) const;
+  AccessResult getEntity(NodePtr &ptr) const;
+  AccessResult getNotation(NodePtr &ptr) const;
+  AccessResult getReferent(NodePtr &ptr) const;
+  AccessResult getLocation(Location &) const;
+  void accept(NodeVisitor &visitor);
+  const ClassDef &classDef() const { return ClassDef::attributeValueToken; }
+  AccessResult getOriginToSubnodeRelPropertyName(ComponentName::Id &name) const {
+    name = ComponentName::idValue;
+    return accessOK;
+  }
+  bool same(const BaseNode &node) const;
+  bool same2(const AttributeValueTokenNode *node) const;
+  unsigned long hash() const;
+private:
+  const TokenizedAttributeValue *value_;
+  size_t tokenIndex_;
+};
+
+class ElementAttributeValueTokenNode
+: public AttributeValueTokenNode, public ElementAttributeOrigin {
+public:
+  ElementAttributeValueTokenNode(const GroveImpl *grove,
+                                const TokenizedAttributeValue *value,
+                                size_t attIndex,
+                                size_t tokenIndex,
+                                const ElementChunk *);
+};
+
+class EntityAttributeValueTokenNode
+: public AttributeValueTokenNode, public EntityAttributeOrigin {
+public:
+  EntityAttributeValueTokenNode(const GroveImpl *grove,
+                               const TokenizedAttributeValue *value,
+                               size_t attIndex,
+                               size_t tokenIndex,
+                               const ExternalDataEntity *);
+};
+
+class ElementTypeAttributeValueTokenNode
+: public AttributeValueTokenNode, public ElementTypeAttributeDefOrigin {
+public:
+  ElementTypeAttributeValueTokenNode(const GroveImpl *grove,
+                                    const TokenizedAttributeValue *value,
+                                    size_t attIndex,
+                                    size_t tokenIndex,
+                                    const ElementType *);
+  AccessResult getOriginToSubnodeRelPropertyName(ComponentName::Id &name) const {
+    name = ComponentName::idDefaultValue;
+    return accessOK;
+  }
+};
+
+class NotationAttributeValueTokenNode
+: public AttributeValueTokenNode, public NotationAttributeDefOrigin {
+public:
+  NotationAttributeValueTokenNode(const GroveImpl *grove,
+                                 const TokenizedAttributeValue *value,
+                                 size_t attIndex,
+                                 size_t tokenIndex,
+                                 const Notation *);
+  AccessResult getOriginToSubnodeRelPropertyName(ComponentName::Id &name) const {
+    name = ComponentName::idDefaultValue;
+    return accessOK;
+  }
+};
+
+class CdataAttributeValueNode
+: public BaseNode, public virtual AttributeDefOrigin {
+public:
+  static bool skipBoring(TextIter &iter);
+  CdataAttributeValueNode(const GroveImpl *grove,
+                         const AttributeValue *value,
+                         size_t attIndex,
+                         const TextIter &iter,
+                         size_t charIndex);
+  AccessResult getParent(NodePtr &ptr) const;
+  AccessResult charChunk(const SdataMapper &, GroveString &) const;
+  bool chunkContains(const Node &) const;
+  bool inChunk(const CdataAttributeValueNode *) const;
+  AccessResult getEntity(NodePtr &) const;
+  AccessResult getEntityName(GroveString &) const;
+  AccessResult getSystemData(GroveString &str) const;
+  AccessResult nextSibling(NodePtr &ptr) const;
+  AccessResult nextChunkSibling(NodePtr &ptr) const;
+  AccessResult firstSibling(NodePtr &) const;
+  AccessResult siblingsIndex(unsigned long &) const;
+  AccessResult getLocation(Location &) const;
+  void accept(NodeVisitor &visitor);
+  const ClassDef &classDef() const;
+  AccessResult getOriginToSubnodeRelPropertyName(ComponentName::Id &name) const {
+    name = ComponentName::idValue;
+    return accessOK;
+  }
+  bool same(const BaseNode &node) const;
+  bool same2(const CdataAttributeValueNode *node) const;
+  unsigned long hash() const;
+private:
+  const AttributeValue *value_;
+  TextIter iter_; // must be valid
+  size_t charIndex_;
+  Char c_;
+};
+
+class ElementCdataAttributeValueNode
+: public CdataAttributeValueNode, public ElementAttributeOrigin {
+public:
+  ElementCdataAttributeValueNode(const GroveImpl *grove,
+                                const AttributeValue *value,
+                                size_t attIndex,
+                                const TextIter &iter,
+                                size_t charIndex,
+                                const ElementChunk *);
+};
+
+class EntityCdataAttributeValueNode
+: public CdataAttributeValueNode, public EntityAttributeOrigin {
+public:
+  EntityCdataAttributeValueNode(const GroveImpl *grove,
+                               const AttributeValue *value,
+                               size_t attIndex,
+                               const TextIter &iter,
+                               size_t charIndex,
+                               const ExternalDataEntity *);
+};
+
+class ElementTypeCdataAttributeValueNode
+: public CdataAttributeValueNode, public ElementTypeAttributeDefOrigin {
+public:
+  ElementTypeCdataAttributeValueNode(const GroveImpl *grove,
+                                    const AttributeValue *value,
+                                    size_t attIndex,
+                                    const TextIter &iter,
+                                    size_t charIndex,
+                                    const ElementType *);
+  AccessResult getOriginToSubnodeRelPropertyName(ComponentName::Id &name) const {
+    name = ComponentName::idDefaultValue;
+    return accessOK;
+  }
+};
+
+class NotationCdataAttributeValueNode
+: public CdataAttributeValueNode, public NotationAttributeDefOrigin {
+public:
+  NotationCdataAttributeValueNode(const GroveImpl *grove,
+                                 const AttributeValue *value,
+                                 size_t attIndex,
+                                 const TextIter &iter,
+                                 size_t charIndex,
+                                 const Notation *);
+  AccessResult getOriginToSubnodeRelPropertyName(ComponentName::Id &name) const {
+    name = ComponentName::idDefaultValue;
+    return accessOK;
+  }
+};
+
+class EntityNodeBase : public BaseNode {
+public:
+  EntityNodeBase(const GroveImpl *grove, const Entity *entity)
+   : BaseNode(grove), entity_(entity) {}
+  AccessResult getName(GroveString &str) const;
+  AccessResult getExternalId(NodePtr &ptr) const;
+  AccessResult getNotation(NodePtr &) const;
+  AccessResult getNotationName(GroveString &) const;
+  AccessResult getText(GroveString &) const;
+  AccessResult getEntityType(Node::EntityType::Enum &) const;
+  AccessResult getAttributes(NamedNodeListPtr &) const;
+  AccessResult attributeRef(unsigned long i, NodePtr &ptr) const;
+  AccessResult getLocation(Location &) const;
+  unsigned long hash() const;
+protected:
+  const Entity *entity_;
+};
+
+class EntityNode : public EntityNodeBase {
+public:
+  EntityNode(const GroveImpl *grove, const Entity *entity);
+  AccessResult getOrigin(NodePtr &ptr) const;
+  AccessResult getOriginToSubnodeRelPropertyName(ComponentName::Id &) const;
+  AccessResult getDefaulted(bool &) const;
+  bool same(const BaseNode &) const;
+  bool same2(const EntityNode *) const;
+  void accept(NodeVisitor &);
+  const ClassDef &classDef() const { return ClassDef::entity; }
+};
+
+class DefaultEntityNode : public EntityNodeBase {
+public:
+  DefaultEntityNode(const GroveImpl *grove, const Entity *entity);
+  AccessResult getOrigin(NodePtr &ptr) const;
+  AccessResult getOriginToSubnodeRelPropertyName(ComponentName::Id &) const;
+  bool same(const BaseNode &) const;
+  bool same2(const DefaultEntityNode *) const;
+  void accept(NodeVisitor &);
+  const ClassDef &classDef() const { return ClassDef::defaultEntity; }
+};
+
+class NotationNode : public BaseNode {
+public:
+  NotationNode(const GroveImpl *grove, const Notation *notation);
+  AccessResult getOrigin(NodePtr &ptr) const;
+  AccessResult getOriginToSubnodeRelPropertyName(ComponentName::Id &name) const {
+    name = ComponentName::idNotations;
+    return accessOK;
+  }
+  AccessResult getName(GroveString &str) const;
+  AccessResult getExternalId(NodePtr &ptr) const;
+  AccessResult getAttributeDefs(NamedNodeListPtr &) const;
+  bool same(const BaseNode &) const;
+  bool same2(const NotationNode *) const;
+  AccessResult getLocation(Location &) const;
+  void accept(NodeVisitor &);
+  const ClassDef &classDef() const { return ClassDef::notation; }
+  unsigned long hash() const;
+private:
+  const Notation *notation_;
+};
+
+class ExternalIdNode : public BaseNode {
+public:
+  ExternalIdNode(const GroveImpl *grove);
+  virtual const ExternalId &externalId() const = 0;
+  AccessResult getPublicId(GroveString &) const;
+  AccessResult getSystemId(GroveString &) const;
+  AccessResult getGeneratedSystemId(GroveString &) const;
+  void accept(NodeVisitor &);
+  const ClassDef &classDef() const { return ClassDef::externalId; }
+  AccessResult getOriginToSubnodeRelPropertyName(ComponentName::Id &name) const {
+    name = ComponentName::idExternalId;
+    return accessOK;
+  }
+  bool same(const BaseNode &) const;
+  bool same2(const ExternalIdNode *) const;
+};
+
+class EntityExternalIdNode : public ExternalIdNode {
+public:
+  EntityExternalIdNode(const GroveImpl *grove,
+                      const ExternalEntity *entity);
+  const ExternalId &externalId() const;
+  AccessResult getOrigin(NodePtr &ptr) const;
+  unsigned long hash() const;
+private:
+  const ExternalEntity *entity_;
+};
+
+class NotationExternalIdNode : public ExternalIdNode {
+public:
+  NotationExternalIdNode(const GroveImpl *grove,
+                        const Notation *notation);
+  const ExternalId &externalId() const;
+  AccessResult getOrigin(NodePtr &ptr) const;
+  unsigned long hash() const;
+private:
+  const Notation *notation_;
+};
+
+class DocumentTypeNode : public BaseNode {
+public:
+  DocumentTypeNode(const GroveImpl *grove, const Dtd *);
+  AccessResult getName(GroveString &) const;
+  AccessResult getGoverning(bool &) const;
+  AccessResult getGeneralEntities(NamedNodeListPtr &) const;
+  AccessResult getNotations(NamedNodeListPtr &) const;
+  AccessResult getElementTypes(NamedNodeListPtr &) const;
+  AccessResult getDefaultEntity(NodePtr &) const;
+  AccessResult getParameterEntities(NamedNodeListPtr &) const;
+  AccessResult getOrigin(NodePtr &) const;
+  AccessResult getOriginToSubnodeRelPropertyName(ComponentName::Id &name) const {
+    name = ComponentName::idDoctypesAndLinktypes;
+    return accessOK;
+  }
+  AccessResult nextChunkSibling(NodePtr &) const;
+  void accept(NodeVisitor &);
+  const ClassDef &classDef() const { return ClassDef::documentType; }
+  bool same(const BaseNode &) const;
+  bool same2(const DocumentTypeNode *) const;
+private:
+  const Dtd *dtd_;
+};
+
+class SgmlConstantsNode : public BaseNode {
+public:
+  SgmlConstantsNode(const GroveImpl *);
+  AccessResult getOrigin(NodePtr &) const;
+  void accept(NodeVisitor &);
+  const ClassDef &classDef() const { return ClassDef::sgmlConstants; }
+  AccessResult getOriginToSubnodeRelPropertyName(ComponentName::Id &name) const {
+    name = ComponentName::idSgmlConstants;
+    return accessOK;
+  }
+  bool same(const BaseNode &) const;
+  bool same2(const SgmlConstantsNode *) const;
+};
+
+class MessageNode : public BaseNode {
+public:
+  MessageNode(const GroveImpl *, const MessageItem *);
+  AccessResult getOrigin(NodePtr &) const;
+  AccessResult getOriginToSubnodeRelPropertyName(ComponentName::Id &name) const {
+    name = ComponentName::noId;
+    return accessOK;
+  }
+  AccessResult nextChunkSibling(NodePtr &) const;
+  AccessResult firstSibling(NodePtr &) const;
+  AccessResult siblingsIndex(unsigned long &) const;
+  void accept(NodeVisitor &);
+  const ClassDef &classDef() const { return ClassDef::message; }
+  bool same(const BaseNode &) const;
+  bool same2(const MessageNode *) const;
+  AccessResult getLocation(Location &) const;
+  AccessResult getText(GroveString &) const;
+  AccessResult getSeverity(Severity &) const;
+private:
+  const MessageItem *item_;
+};
+
+// CLASS DEF: ElementTypeNode
+class ElementTypeNode : public BaseNode {
+public:
+  ElementTypeNode(const GroveImpl *grove, const ElementType &elementType)
+    : BaseNode(grove), elementType_(elementType) {};
+  AccessResult getOrigin(NodePtr &) const;
+  const ClassDef &classDef() const { return ClassDef::elementType; }
+  AccessResult getOriginToSubnodeRelPropertyName(ComponentName::Id &name) const {
+    name = ComponentName::idElementTypes;
+    return accessOK;
+  }
+  AccessResult getGi(GroveString &str) const;
+  AccessResult getAttributeDefs(NamedNodeListPtr &) const;
+  AccessResult getContentType(Node::ContentType::Enum &) const;
+  AccessResult getExclusions(GroveStringListPtr &) const;
+  AccessResult getInclusions(GroveStringListPtr &) const;
+  AccessResult getModelGroup(NodePtr &) const;
+  AccessResult getOmitEndTag(bool &) const;
+  AccessResult getOmitStartTag(bool &) const;
+  AccessResult getLocation(Location &) const;
+  bool same(const BaseNode &) const;
+  bool same2(const ElementTypeNode *) const;
+  void accept(NodeVisitor &);
+  unsigned long hash() const;
+  const ElementType &elementType() const { return elementType_; }
+protected:
+  const ElementType &elementType_;
+};
+
+// CLASS DEF: ContentTokenNodeBase
+class ModelGroupNode;
+class ContentTokenNodeBase : public BaseNode {
+public:
+  ContentTokenNodeBase(const GroveImpl *grove,
+                       const ElementType &elementType,
+                       ModelGroupNode *parentModelGroupNode = 0);
+  ~ContentTokenNodeBase();
+  AccessResult getOriginToSubnodeRelPropertyName(ComponentName::Id &name) const {
+    name = ComponentName::idContentTokens;
+    return accessOK;
+  }
+  AccessResult getOrigin(NodePtr &) const;
+  AccessResult getLocation(Location &) const;
+  const ElementType &elementType() const { return elementType_; }
+protected:
+  ModelGroupNode *parentModelGroupNode_;
+  const ElementType &elementType_;
+};
+
+// CLASS DEF: ElementTokenNode
+class ElementTokenNode : public ContentTokenNodeBase {
+public:
+  ElementTokenNode(const GroveImpl *grove,
+                   const ElementType &elementType,
+                   const ElementToken &elementToken,
+                   ModelGroupNode *parentModelGroupNode)
+   : ContentTokenNodeBase(grove, elementType, parentModelGroupNode),
+     elementToken_(elementToken) {}
+  const ClassDef &classDef() const { return ClassDef::elementToken; }
+  AccessResult getGi(GroveString &str) const;
+  AccessResult getOccurIndicator(Node::OccurIndicator::Enum &) const;
+  bool same(const BaseNode &) const;
+  bool same2(const ElementTokenNode *) const;
+  void accept(NodeVisitor &);
+  unsigned long hash() const;
+  const ElementToken &elementToken() const { return elementToken_; }
+protected:
+  const ElementToken &elementToken_;
+};
+
+// CLASS DEF: PcdataTokenNode
+class PcdataTokenNode : public ContentTokenNodeBase {
+public:
+  PcdataTokenNode(const GroveImpl *grove,
+                  const ElementType &elementType,
+                  const PcdataToken &pcdataToken,
+                  ModelGroupNode *parentModelGroupNode)
+   : ContentTokenNodeBase(grove, elementType, parentModelGroupNode),
+     pcdataToken_(pcdataToken) {}
+  const ClassDef &classDef() const { return ClassDef::pcdataToken; }
+  bool same(const BaseNode &) const;
+  bool same2(const PcdataTokenNode *) const;
+  void accept(NodeVisitor &);
+  unsigned long hash() const;
+  const PcdataToken &pcdataToken() const { return pcdataToken_; }
+protected:
+  const PcdataToken &pcdataToken_;
+};
+
+// CLASS DEF: ModelGroupNode
+class ModelGroupNode : public ContentTokenNodeBase {
+public:
+  ModelGroupNode(const GroveImpl *grove,
+                 const ElementType &elementType,
+                 const ModelGroup &modelGroup,
+                 ModelGroupNode *parentModelGroupNode = 0)
+   : ContentTokenNodeBase(grove, elementType, parentModelGroupNode),
+     modelGroup_(modelGroup) {}
+  const ClassDef &classDef() const { return ClassDef::modelGroup; }
+  AccessResult getOriginToSubnodeRelPropertyName(ComponentName::Id &name) const;
+  AccessResult getConnector(Node::Connector::Enum &con) const;
+  AccessResult getOccurIndicator(Node::OccurIndicator::Enum &occur) const;
+  AccessResult getContentTokens(NodeListPtr &) const;
+  bool same(const BaseNode &) const;
+  bool same2(const ModelGroupNode *) const;
+  void accept(NodeVisitor &);
+  unsigned long hash() const;
+  void makeNode(NodePtr &ptr, unsigned contentTokenIdx);
+  const ModelGroup &modelGroup() const { return modelGroup_; }
+private:
+  const ModelGroup &modelGroup_;
+};
+
+// class DEF: AttributeDefNode
+class AttributeDefNode : public BaseNode, public virtual AttributeDefOrigin {
+public:
+  AttributeDefNode(const GroveImpl *grove, size_t attIndex)
+   : BaseNode(grove), AttributeDefOrigin(attIndex) {}
+  const ClassDef &classDef() const { return ClassDef::attributeDef; }
+  AccessResult getOrigin(NodePtr &ptr) const;
+  AccessResult getName(GroveString &) const;
+  AccessResult getDeclValueType(Node::DeclValueType::Enum &) const;
+  AccessResult getDefaultValueType(Node::DefaultValueType::Enum &) const;
+  AccessResult getTokens(GroveStringListPtr &) const;
+  AccessResult getCurrentAttributeIndex(long &) const;
+  void accept(NodeVisitor &visitor);
+  bool same(const BaseNode &node) const;
+  bool same2(const AttributeDefNode *node) const;
+  unsigned long hash() const;
+protected:
+};
+
+// class DEF: ElementTypeAttributeDefNode
+class ElementTypeAttributeDefNode
+: public AttributeDefNode, public ElementTypeAttributeDefOrigin {
+public:
+  ElementTypeAttributeDefNode(const GroveImpl *grove,
+                              const ElementType &elementType,
+                              size_t attributeDefIdx)
+   : AttributeDefNode(grove, attributeDefIdx),
+     ElementTypeAttributeDefOrigin(&elementType),
+     AttributeDefOrigin(attributeDefIdx) {}
+  AccessResult getOriginToSubnodeRelPropertyName(ComponentName::Id &name) const {
+    name = ComponentName::idAttributeDefs;
+    return accessOK;
+  }
+  AccessResult getCurrentGroup(NodeListPtr &) const;
+  AccessResult getLocation(Location &) const;
+  AccessResult getDefaultValue(NodeListPtr &) const;
+};
+
+// class DEF: NotationAttributeDefNode
+class NotationAttributeDefNode
+: public AttributeDefNode, public NotationAttributeDefOrigin {
+public:
+  NotationAttributeDefNode(const GroveImpl *grove,
+                           const Notation &notation,
+                           size_t attributeDefIdx)
+   : AttributeDefNode(grove, attributeDefIdx),
+     NotationAttributeDefOrigin(&notation),
+     AttributeDefOrigin(attributeDefIdx)  {};
+  AccessResult getOriginToSubnodeRelPropertyName(ComponentName::Id &name) const {
+    name = ComponentName::idAttributeDefs;
+    return accessOK;
+  }
+  AccessResult getCurrentGroup(NodeListPtr &) const;
+  AccessResult getLocation(Location &) const;
+  //AccessResult getDefaultValue(NodeListPtr &) const;
+};
+
+class BaseNodeList : public NodeList {
+public:
+  BaseNodeList() : refCount_(0) { }
+  virtual ~BaseNodeList() { }
+  void addRef() { ++refCount_; }
+  bool canReuse(NodeListPtr &ptr) const {
+    const NodeList *tem = &*ptr;
+    return tem == this && refCount_ == 1;
+  }
+  void release() {
+    ASSERT(refCount_ != 0);
+    if (--refCount_ == 0) delete this;
+  }
+  AccessResult first(NodePtr &) const { return accessNull; }
+  AccessResult rest(NodeListPtr &ptr) const { return chunkRest(ptr); }
+  AccessResult chunkRest(NodeListPtr &) const { return accessNull; }
+private:
+  unsigned refCount_;
+};
+
+class SiblingNodeList : public BaseNodeList {
+public:
+  SiblingNodeList(const NodePtr &first) : first_(first) { }
+  AccessResult first(NodePtr &ptr) const {
+    ptr = first_;
+    return accessOK;
+  }
+  AccessResult rest(NodeListPtr &ptr) const {
+    AccessResult ret;
+    if (canReuse(ptr)) {
+      ret = ((SiblingNodeList *)this)->first_.assignNextSibling();
+      if (ret == accessOK)
+       return ret;
+    }
+    else {
+      NodePtr next;
+      ret = first_->nextSibling(next);
+      if (ret == accessOK) {
+       ptr.assign(new SiblingNodeList(next));
+       return ret;
+      }
+    }
+    if (ret == accessNull) {
+      ptr.assign(new BaseNodeList);
+      return accessOK;
+    }
+    return ret;
+  }
+  AccessResult chunkRest(NodeListPtr &ptr) const {
+    AccessResult ret;
+    if (canReuse(ptr)) {
+      ret = ((SiblingNodeList *)this)->first_.assignNextChunkSibling();
+      if (ret == accessOK)
+       return ret;
+    }
+    else {
+      NodePtr next;
+      ret = first_->nextChunkSibling(next);
+      if (ret == accessOK) {
+       ptr.assign(new SiblingNodeList(next));
+       return ret;
+      }
+    }
+    if (ret == accessNull) {
+      ptr.assign(new BaseNodeList);
+      return accessOK;
+    }
+    return ret;
+  }
+  AccessResult ref(unsigned long i, NodePtr &ptr) const {
+    if (i == 0) {
+      ptr = first_;
+      return accessOK;
+    }
+    return first_->followSiblingRef(i - 1, ptr);
+  }
+private:
+  NodePtr first_; // never null
+};
+
+class BaseNamedNodeList : public NamedNodeList {
+public:
+  BaseNamedNodeList(const GroveImpl *grove,
+                   const SubstTable *substTable)
+  : grove_(grove), substTable_(substTable), refCount_(0) { }
+  virtual ~BaseNamedNodeList() { }
+  void addRef() { ++refCount_; }
+  bool canReuse(NamedNodeListPtr &ptr) const {
+    const NamedNodeList *tem = &*ptr;
+    return tem == this && refCount_ == 1;
+  }
+  void release() {
+    ASSERT(refCount_ != 0);
+    if (--refCount_ == 0) delete this;
+  }
+  size_t normalize(Char *s, size_t n) const {
+    if (substTable_) {
+      for (size_t i = 0; i < n; i++)
+       substTable_->subst(s[i]);
+    }
+    return n;
+  }
+  const GroveImpl *grove() const { return grove_; }
+  AccessResult namedNode(GroveString str, NodePtr &node) const {
+    StringC tem(str.data(), str.size());
+    normalize(&tem[0], tem.size());
+    return namedNodeU(tem, node);
+  }
+  virtual AccessResult namedNodeU(const StringC &, NodePtr &) const = 0;
+private:
+  GroveImplPtr grove_;
+  const SubstTable *substTable_;
+  unsigned refCount_;
+};
+
+class AttributesNamedNodeList
+: public BaseNamedNodeList, public virtual AttributeOrigin {
+public:
+  AttributesNamedNodeList(const GroveImpl *grove)
+   : BaseNamedNodeList(grove, grove->generalSubstTable()) { }
+  NodeListPtr nodeList() const;
+  AccessResult namedNodeU(const StringC &, NodePtr &) const;
+  Type type() const { return attributes; }
+};
+
+class ElementAttributesNamedNodeList
+: public AttributesNamedNodeList, public ElementAttributeOrigin {
+public:
+  ElementAttributesNamedNodeList(const GroveImpl *grove,
+                                const ElementChunk *chunk)
+   : AttributesNamedNodeList(grove), ElementAttributeOrigin(chunk) { }
+};
+
+class EntityAttributesNamedNodeList
+: public AttributesNamedNodeList, public EntityAttributeOrigin {
+public:
+  EntityAttributesNamedNodeList(const GroveImpl *grove,
+                               const ExternalDataEntity *entity)
+   : AttributesNamedNodeList(grove), EntityAttributeOrigin(entity) { }
+};
+
+class ElementsNamedNodeList : public BaseNamedNodeList {
+public:
+  ElementsNamedNodeList(const GroveImpl *grove)
+    : BaseNamedNodeList(grove, grove->generalSubstTable()) { }
+  NodeListPtr nodeList() const;
+  AccessResult namedNodeU(const StringC &, NodePtr &) const;
+  Type type() const { return elements; }
+};
+
+class DocEntitiesNamedNodeList : public BaseNamedNodeList {
+public:
+  DocEntitiesNamedNodeList(const GroveImpl *grove)
+   : BaseNamedNodeList(grove, grove->entitySubstTable()) { }
+  NodeListPtr nodeList() const;
+  AccessResult namedNodeU(const StringC &, NodePtr &) const;
+  Type type() const { return entities; }
+};
+
+class DefaultedEntitiesNamedNodeList : public BaseNamedNodeList {
+public:
+  DefaultedEntitiesNamedNodeList(const GroveImpl *grove)
+   : BaseNamedNodeList(grove, grove->entitySubstTable()) { }
+  NodeListPtr nodeList() const;
+  AccessResult namedNodeU(const StringC &, NodePtr &) const;
+  Type type() const { return entities; }
+};
+
+class GeneralEntitiesNamedNodeList : public BaseNamedNodeList {
+public:
+  GeneralEntitiesNamedNodeList(const GroveImpl *, const Dtd *);
+  NodeListPtr nodeList() const;
+  AccessResult namedNodeU(const StringC &, NodePtr &) const;
+  Type type() const { return entities; }
+private:
+  const Dtd *dtd_;
+};
+
+class ParameterEntitiesNamedNodeList : public BaseNamedNodeList {
+public:
+  ParameterEntitiesNamedNodeList(const GroveImpl *, const Dtd *);
+  NodeListPtr nodeList() const;
+  AccessResult namedNodeU(const StringC &, NodePtr &) const;
+  Type type() const { return entities; }
+private:
+  const Dtd *dtd_;
+};
+
+class NotationsNamedNodeList : public BaseNamedNodeList {
+public:
+  NotationsNamedNodeList(const GroveImpl *, const Dtd *);
+  NodeListPtr nodeList() const;
+  AccessResult namedNodeU(const StringC &, NodePtr &) const;
+  Type type() const { return notations; }
+private:
+  const Dtd *dtd_;
+};
+
+class DoctypesAndLinktypesNamedNodeList : public BaseNamedNodeList {
+public:
+  DoctypesAndLinktypesNamedNodeList(const GroveImpl *);
+  NodeListPtr nodeList() const;
+  AccessResult namedNodeU(const StringC &, NodePtr &) const;
+  Type type() const { return doctypesAndLinktypes; }
+};
+
+class ElementsNodeList : public BaseNodeList {
+public:
+  ElementsNodeList(const GroveImpl *grove,
+                   const Chunk *head);
+  AccessResult first(NodePtr &) const;
+  AccessResult chunkRest(NodeListPtr &) const;
+public:
+  GroveImplPtr grove_;
+  const Chunk *first_;
+};
+
+class EntitiesNodeList : public BaseNodeList {
+public:
+  EntitiesNodeList(const GroveImpl *grove,
+                  const Dtd::ConstEntityIter &iter);
+  AccessResult first(NodePtr &) const;
+  AccessResult chunkRest(NodeListPtr &) const;
+protected:
+  const GroveImpl *grove() const { return grove_; }
+public:
+  GroveImplPtr grove_;
+  Dtd::ConstEntityIter iter_;
+};
+
+class DocEntitiesNodeList : public EntitiesNodeList {
+public:
+  DocEntitiesNodeList(const GroveImpl *grove);
+  AccessResult first(NodePtr &) const;
+  AccessResult chunkRest(NodeListPtr &) const;
+};
+
+class NotationsNodeList : public BaseNodeList {
+public:
+  NotationsNodeList(const GroveImpl *grove,
+                    const Dtd::ConstNotationIter &iter);
+  AccessResult first(NodePtr &) const;
+  AccessResult chunkRest(NodeListPtr &) const;
+public:
+  GroveImplPtr grove_;
+  Dtd::ConstNotationIter iter_;
+};
+
+// -- CLASS DEF: ElementTypesNodeList
+class ElementTypesNodeList : public BaseNodeList {
+public:
+  ElementTypesNodeList( const GroveImpl *grove,
+                        const Dtd::ConstElementTypeIter &iter);
+  AccessResult first(NodePtr &) const;
+  AccessResult chunkRest(NodeListPtr &) const;
+public:
+  GroveImplPtr grove_;
+  Dtd::ConstElementTypeIter iter_;
+};
+
+// -- CLASS DEF: ElementTypesNamedNodeList
+class ElementTypesNamedNodeList : public BaseNamedNodeList {
+public:
+  ElementTypesNamedNodeList(const GroveImpl *, const Dtd *);
+  NodeListPtr nodeList() const;
+  AccessResult namedNodeU(const StringC &, NodePtr &) const;
+  Type type() const { return elementTypes; }
+protected:
+  const Dtd *dtd_;
+};
+
+// -- CLASS DEF: ContentTokenNodeList
+class ContentTokenNodeList : public BaseNodeList {
+public:
+  ContentTokenNodeList(const GroveImpl *grove,
+                       ModelGroupNode &modelGroupNode,
+                       unsigned firstTokenIdx = 0);
+  AccessResult first(NodePtr &) const;
+  AccessResult chunkRest(NodeListPtr &) const;
+  unsigned firstTokenIdx() const { return firstTokenIdx_; }
+  AccessResult next();
+protected:
+  GroveImplPtr grove_;
+  ModelGroupNode &modelGroupNode_;
+  unsigned firstTokenIdx_;
+};
+
+// -- CLASS DEF: ModelGroupNodeList
+class ModelGroupNodeList : public BaseNodeList {
+public:
+  ModelGroupNodeList(const GroveImpl *grove,
+                     const ModelGroup &modelGroupNode,
+                     size_t firstTokenIdx);
+  AccessResult first(NodePtr &) const;
+  AccessResult chunkRest(NodeListPtr &) const;
+protected:
+  GroveImplPtr grove_;
+  ModelGroup &modelGroup_;
+  size_t firstTokenIdx_;
+};
+
+// -- CLASS DEF: AttributeDefsNodeList
+class AttributeDefsNodeList
+ : public BaseNodeList, public virtual AttributeDefOrigin {
+public:
+  AttributeDefsNodeList(const GroveImpl *grove,
+                        size_t firstAttIndex)
+   : grove_(grove), AttributeDefOrigin(firstAttIndex) {}
+  AccessResult first(NodePtr &) const;
+  AccessResult chunkRest(NodeListPtr &) const;
+  bool inList(size_t attIndex) const;
+protected:
+  GroveImplPtr grove_;
+};
+
+// -- CLASS DEF: ElementTypeAttributeDefsNodeList
+class ElementTypeAttributeDefsNodeList
+ : public AttributeDefsNodeList, public ElementTypeAttributeDefOrigin {
+public:
+  ElementTypeAttributeDefsNodeList(const GroveImpl *grove,
+                                   const ElementType &elementType,
+                                   size_t firstAttIndex)
+   : AttributeDefsNodeList(grove, firstAttIndex),
+     ElementTypeAttributeDefOrigin(&elementType),
+     AttributeDefOrigin(firstAttIndex) {}
+};
+
+// -- CLASS DEF: NotationAttributeDefsNodeList
+class NotationAttributeDefsNodeList
+ : public AttributeDefsNodeList, public NotationAttributeDefOrigin {
+public:
+  NotationAttributeDefsNodeList(const GroveImpl *grove,
+                                const Notation &notation,
+                                size_t firstAttIndex)
+   : AttributeDefsNodeList(grove, firstAttIndex),
+     NotationAttributeDefOrigin(&notation),
+     AttributeDefOrigin(firstAttIndex) {}
+};
+
+// -- CLASS DEF: AttributeDefsNamedNodeList
+class AttributeDefsNamedNodeList
+ : public BaseNamedNodeList, public virtual AttributeDefOrigin {
+public:
+  AttributeDefsNamedNodeList(const GroveImpl *grove)
+   : BaseNamedNodeList(grove, grove->generalSubstTable()) { }
+  NodeListPtr nodeList() const;
+  AccessResult namedNodeU(const StringC &, NodePtr &) const;
+  Type type() const { return attributeDefs; }
+};
+
+// -- CLASS DEF: ElementTypeAttributeDefsNamedNodeList
+class ElementTypeAttributeDefsNamedNodeList
+ : public AttributeDefsNamedNodeList, public ElementTypeAttributeDefOrigin {
+public:
+  ElementTypeAttributeDefsNamedNodeList(const GroveImpl *grove,
+                                       const ElementType &elementType)
+   : AttributeDefsNamedNodeList(grove), ElementTypeAttributeDefOrigin(&elementType) { }
+};
+
+// -- CLASS DEF: NotationAttributeDefsNamedNodeList
+class NotationAttributeDefsNamedNodeList
+ : public AttributeDefsNamedNodeList, public NotationAttributeDefOrigin {
+public:
+  NotationAttributeDefsNamedNodeList(const GroveImpl *grove,
+                                    const Notation &notation)
+   : AttributeDefsNamedNodeList(grove), NotationAttributeDefOrigin(&notation) { }
+};
+
+// -- CLASS DEF: ElementTypeCurrentGroupAttributeDefsNodeList
+// elementType_ is first list element, iter.next() represents rest
+class ElementTypeCurrentGroupAttributeDefsNodeList 
+: public BaseNodeList {
+public:
+  ElementTypeCurrentGroupAttributeDefsNodeList(const GroveImpl *grove,
+                                               const Dtd::ConstElementTypeIter &iter,
+                                               size_t currentGroupIndex);
+  ElementTypeCurrentGroupAttributeDefsNodeList(const GroveImpl *grove,
+                                               const Dtd::ConstElementTypeIter &iter,
+                                               const ElementType *elementType,
+                                               size_t firstAttIndex,
+                                               size_t currentGroupIndex)
+   : grove_(grove), iter_(iter), elementType_(elementType), attIndex_(firstAttIndex),
+     currentGroupIndex_(currentGroupIndex) {}
+  AccessResult first(NodePtr &) const;
+  AccessResult chunkRest(NodeListPtr &) const;
+  bool next(Dtd::ConstElementTypeIter &iter,
+            const ElementType *&elementType,
+            size_t &attIndex,
+            bool incrementFirst = true) const;
+  bool next(bool incrementFirst = true) {
+    return next(iter_, elementType_, attIndex_, incrementFirst); }
+protected:
+  GroveImplPtr grove_;
+  Dtd::ConstElementTypeIter iter_;
+  const ElementType *elementType_;
+  size_t currentGroupIndex_;
+  size_t attIndex_;
+};
+
+inline
+Boolean GroveImpl::waitForMoreNodes() const
+{
+  if (blockingAccess)
+    return moreNodesCondition_.wait();
+  else
+    return 0;
+}
+
+inline
+void GroveImpl::pulse()
+{
+  moreNodesCondition_.pulse();
+}
+
+inline
+void GroveImpl::maybePulse()
+{
+  // Once we've had (2^n)*(2^10) events, only pulse every (2^n)th event.
+  // Up to a limit of n == 8.
+  // This reduces the overhead of pulsing to negligible levels on WinNT.
+  if ((++nEvents_ & ~(~unsigned(0) << pulseStep_)) == 0) {
+    pulse();
+    if (pulseStep_ < 8 && nEvents_ > (1 << (pulseStep_ + 10)))
+      pulseStep_++;
+  }
+}
+
+inline
+void GroveImpl::appendSibling(Chunk *chunk)
+{
+  if (pendingData_) {
+    if (tailPtr_) {
+      // Must set completeLimit_ before setting tailPtr_.
+      completeLimit_ = pendingData_->after();
+      *tailPtr_ = pendingData_;
+      tailPtr_ = 0;
+    }
+    pendingData_ = 0;
+  }
+  // Must set origin before advancing completeLimit_.
+  chunk->origin = origin_;
+  // Must advance completeLimit_ before setting tailPtr_.
+  completeLimit_ = freePtr_;
+  if (tailPtr_) {
+    *tailPtr_ = chunk;
+    tailPtr_ = 0;
+  }
+  pendingData_ = 0;
+  maybePulse();
+}
+
+inline
+void GroveImpl::appendSibling(DataChunk *chunk)
+{
+  // Since we might extend this DataChunk, it's
+  // not safe to set completeLimit_ to after this chunk yet.
+  // This means we can't yet set tailPtr_.
+  if (pendingData_) {
+    // Must set completeLimit_ before setting tailPtr_.
+    completeLimit_ = pendingData_->after();
+    if (tailPtr_) {
+      *tailPtr_ = pendingData_;
+      tailPtr_ = 0;
+    }
+  }
+  chunk->origin = origin_;
+  pendingData_ = chunk;
+  maybePulse();
+}
+
+inline
+void GroveImpl::push(ElementChunk *chunk, Boolean hasId)
+{
+  if (pendingData_) {
+    if (tailPtr_) {
+      // Must set completeLimit_ before setting tailPtr_.
+      completeLimit_ = pendingData_->after();
+      *tailPtr_ = pendingData_;
+      tailPtr_ = 0;
+    }
+    pendingData_ = 0;
+  }
+  chunk->elementIndex = nElements_++;
+  chunk->origin = origin_;
+  // Must set origin_ to chunk before advancing completeLimit_
+  // otherwise thread would look at element and
+  // maybeMoreSiblings() would return false.
+  // Must advance completeLimit_ before setting tailPtr_,
+  // otherwise tailPtr_ would be beyond completeLimit_.
+  origin_ = chunk;
+  completeLimit_ = freePtr_;
+  // Allow for the possibility of invalid documents with elements
+  // after the document element.
+  if ((const Chunk *)chunk->origin == root_ && root_->documentElement == 0)
+    root_->documentElement = chunk;
+  else if (tailPtr_) {
+    *tailPtr_ = chunk;
+    tailPtr_ = 0;
+  }
+  if (hasId) {
+    Mutex::Lock lock(mutexPtr_);
+    idTable_.insert(chunk);
+  }
+  maybePulse();
+}
+
+inline
+void GroveImpl::pop()
+{
+  if (pendingData_) {
+    // Must set completeLimit_ before setting tailPtr_.
+    completeLimit_ = pendingData_->after();
+    if (tailPtr_) {
+      *tailPtr_ = pendingData_;
+      tailPtr_ = 0;
+    }
+    pendingData_ = 0;
+  }
+  tailPtr_ = &origin_->nextSibling;
+  origin_ = origin_->origin;
+  if ((const Chunk *)origin_ == root_)
+    finishDocumentElement();
+  maybePulse();
+}
+
+inline
+Boolean GroveImpl::haveRootOrigin()
+{
+  return (const Chunk *)origin_ == root_;
+}
+
+inline
+void GroveImpl::setDtd(const ConstPtr<Dtd> &dtd)
+{
+  dtd_ = dtd;
+  hasDefaultEntity_ = !dtd_->defaultEntity().isNull();
+  finishProlog();
+  pulse();
+}
+
+inline
+const ElementChunk *GroveImpl::lookupElement(const StringC &id) const
+{
+  Mutex::Lock lock(mutexPtr_);
+  return idTable_.lookup(id);
+}
+
+inline
+GroveImpl::ElementIter GroveImpl::elementIter() const
+{
+  ASSERT(complete());
+  return ElementIter(idTable_);
+}
+
+inline
+Boolean GroveImpl::maybeMoreSiblings(const ParentChunk *chunk) const
+{
+  return (complete_
+          ? chunk->nextSibling != 0
+         : (origin_ == chunk 
+             || &chunk->nextSibling == tailPtr_
+             || maybeMoreSiblings1(chunk)));
+} 
+
+inline
+void *GroveImpl::allocChunk(size_t n)
+{
+  nChunksSinceLocOrigin_++;
+  if (n <= nFree_) {
+    void *p = freePtr_;
+    freePtr_ += n;
+    nFree_ -= n;
+    return p;
+  }
+  else
+    return allocFinish(n);
+}
+
+inline
+void GroveImpl::setLocOrigin(const ConstPtr<Origin> &locOrigin)
+{
+  if (locOrigin.pointer() != currentLocOrigin_
+      || nChunksSinceLocOrigin_ >= maxChunksWithoutLocOrigin)
+    storeLocOrigin(locOrigin);
+}
+
+inline
+void GroveImpl::appendMessage(MessageItem *item)
+{
+  *messageListTailP_ = item;
+  messageListTailP_ = item->nextP();
+  pulse();
+}
+
+inline
+void ElementNode::add(GroveImpl &grove, const StartElementEvent &event)
+{
+  grove.setLocOrigin(event.location().origin());
+  ElementChunk *chunk;
+  const AttributeList &atts = event.attributes();
+  Boolean hasId;
+  if (atts.nSpec() == 0 && !atts.anyCurrent()) {
+    void *mem = grove.allocChunk(sizeof(ElementChunk));
+    if (event.included())
+      chunk = new (mem) IncludedElementChunk;
+    else
+      chunk = new (mem) ElementChunk;
+    hasId = 0;
+  }
+  else
+    chunk = makeAttElementChunk(grove, event, hasId);
+  chunk->type = event.elementType();
+  chunk->locIndex = event.location().index();
+  grove.push(chunk, hasId);
+}
+
+// We duplicate ChunkNode::nextChunkSibling to take advantage
+// of Node reuse (via setNodePtrFirst(NodePtr &, const DataNode *).
+inline
+AccessResult DataNode::nextChunkSibling(NodePtr &ptr) const
+{
+  // The forwarding chunk has origin = 0, so it will stop
+  // the iteration before after() can return 0.
+  const Chunk *p = chunk_->after();
+  while (p == grove()->completeLimit())
+    if (!grove()->waitForMoreNodes())
+      return accessTimeout;
+  if (p->origin != chunk_->origin)
+    return accessNull;
+  return p->setNodePtrFirst(ptr, this);
+}
+
+inline
+void DataNode::reuseFor(const DataChunk *chunk, size_t index)
+{
+  chunk_ = chunk;
+  index_ = index;
+}
+
+inline
+void DataNode::add(GroveImpl &grove, const DataEvent &event)
+{
+  size_t dataLen = event.dataLength();
+  if (dataLen) {
+   DataChunk *chunk = grove.pendingData();
+   if (chunk
+       && event.location().origin().pointer() == grove.currentLocOrigin()
+       && event.location().index() == chunk->locIndex + chunk->size
+       && grove.tryExtend(CharsChunk::allocSize(chunk->size + dataLen)
+                          - CharsChunk::allocSize(chunk->size))) {
+     memcpy((Char *)(chunk + 1) + chunk->size,
+           event.data(),
+           dataLen * sizeof(Char));
+     chunk->size += dataLen;
+   }
+   else {
+     grove.setLocOrigin(event.location().origin());
+     chunk = new (grove.allocChunk(CharsChunk::allocSize(dataLen))) DataChunk;
+     chunk->size = dataLen;
+     chunk->locIndex = event.location().index();
+     memcpy(chunk + 1, event.data(), dataLen * sizeof(Char));
+     grove.appendSibling(chunk);
+   }
+ }
+}
+
+GroveBuilderMessageEventHandler::GroveBuilderMessageEventHandler(unsigned groveIndex,
+                                                                Messenger *mgr,
+                                                                MessageFormatter *msgFmt)
+: mgr_(mgr), grove_(new GroveImpl(groveIndex)), msgFmt_(msgFmt)
+{
+  grove_->addRef();
+}
+
+GroveBuilderMessageEventHandler::~GroveBuilderMessageEventHandler()
+{
+  grove_->setComplete();
+  grove_->release();
+}
+
+void GroveBuilderMessageEventHandler::makeInitialRoot(NodePtr &root)
+{
+  root.assign(new SgmlDocumentNode(grove_, grove_->root()));
+}
+
+void GroveBuilderMessageEventHandler::message(MessageEvent *event)
+{
+  mgr_->dispatchMessage(event->message());
+  const Message &msg = event->message();
+  StrOutputCharStream os;
+  msgFmt_->formatMessage(*msg.type, msg.args, os);
+  StringC tem;
+  os.extractString(tem);
+  Node::Severity severity;
+  switch (msg.type->severity()) {
+  case MessageType::info:
+    severity = Node::info;
+    break;
+  case MessageType::warning:
+    severity = Node::warning;
+    break;
+  default:
+    severity = Node::error;
+    break;
+  }
+  grove_->appendMessage(new MessageItem(severity, tem, msg.loc));
+  if (!msg.auxLoc.origin().isNull()) {
+    msgFmt_->formatMessage(msg.type->auxFragment(), msg.args, os);
+    os.extractString(tem);
+    grove_->appendMessage(new MessageItem(Node::info, tem, msg.auxLoc));
+  }
+  ErrorCountEventHandler::message(event);
+}
+
+void GroveBuilderMessageEventHandler::sgmlDecl(SgmlDeclEvent *event)
+{
+  grove_->setSd(event->sdPointer(), event->prologSyntaxPointer(), event->instanceSyntaxPointer());
+  delete event;
+}
+
+void GroveBuilderMessageEventHandler::setSd(const ConstPtr<Sd> &sd, const ConstPtr<Syntax> &prologSyntax, const ConstPtr<Syntax> &instanceSyntax)
+{
+  grove_->setSd(sd, prologSyntax, instanceSyntax);
+}
+
+GroveBuilderEventHandler::GroveBuilderEventHandler(unsigned groveIndex,
+                                                  Messenger *mgr,
+                                                  MessageFormatter *msgFmt)
+: GroveBuilderMessageEventHandler(groveIndex, mgr, msgFmt)
+{
+}
+
+void GroveBuilderEventHandler::appinfo(AppinfoEvent *event)
+{
+  const StringC *appinfo;
+  if (event->literal(appinfo))
+    grove_->setAppinfo(*appinfo);
+  delete event;
+}
+
+void GroveBuilderEventHandler::endProlog(EndPrologEvent *event)
+{
+  grove_->setDtd(event->dtdPointer());
+  delete event;
+}
+
+void GroveBuilderEventHandler::startElement(StartElementEvent *event)
+{
+  ElementNode::add(*grove_, *event);
+  delete event;
+}
+
+void GroveBuilderEventHandler::endElement(EndElementEvent *event)
+{
+  grove_->pop();
+  delete event;
+}
+
+void GroveBuilderEventHandler::data(DataEvent *event)
+{
+  DataNode::add(*grove_, *event);
+  delete event;
+}
+
+void GroveBuilderEventHandler::sdataEntity(SdataEntityEvent *event)
+{
+  SdataNode::add(*grove_, *event);
+  delete event;
+}
+
+void GroveBuilderEventHandler::nonSgmlChar(NonSgmlCharEvent *event)
+{
+  NonSgmlNode::add(*grove_, *event);
+  delete event;
+}
+
+void GroveBuilderEventHandler::externalDataEntity(ExternalDataEntityEvent *event)
+{
+  ExternalDataNode::add(*grove_, *event);
+  delete event;
+}
+
+void GroveBuilderEventHandler::subdocEntity(SubdocEntityEvent *event)
+{
+  SubdocNode::add(*grove_, *event);
+  delete event;
+}
+
+void GroveBuilderEventHandler::pi(PiEvent *event)
+{
+  PiNode::add(*grove_, *event);
+  delete event;
+}
+
+void GroveBuilderEventHandler::entityDefaulted(EntityDefaultedEvent *event)
+{
+  grove_->addDefaultedEntity(event->entityPointer());
+  delete event;
+}
+
+ErrorCountEventHandler *GroveBuilder::make(unsigned index,
+                                          Messenger *mgr,
+                                          MessageFormatter *msgFmt,
+                                          bool validateOnly,
+                                          NodePtr &root)
+{
+  GroveBuilderMessageEventHandler *eh;
+  if (validateOnly)
+    eh = new GroveBuilderMessageEventHandler(index, mgr, msgFmt);
+  else
+    eh = new GroveBuilderEventHandler(index, mgr, msgFmt);
+  eh->makeInitialRoot(root);
+  return eh;
+}
+
+ErrorCountEventHandler *GroveBuilder::make(unsigned index,
+                                          Messenger *mgr,
+                                          MessageFormatter *msgFmt,
+                                          bool validateOnly,
+                                          const ConstPtr<Sd> &sd,
+                                          const ConstPtr<Syntax> &prologSyntax,
+                                          const ConstPtr<Syntax> &instanceSyntax,
+                                          NodePtr &root)
+{
+  GroveBuilderMessageEventHandler *eh;
+  if (validateOnly)
+    eh = new GroveBuilderMessageEventHandler(index, mgr, msgFmt);
+  else
+    eh = new GroveBuilderEventHandler(index, mgr, msgFmt);
+  eh->makeInitialRoot(root);
+  eh->setSd(sd, prologSyntax, instanceSyntax);
+  return eh;
+}
+
+bool GroveBuilder::setBlocking(bool b)
+{
+  bool prev = blockingAccess;
+  blockingAccess = b;
+  return prev;
+}
+
+GroveImpl::GroveImpl(unsigned groveIndex)
+: groveIndex_(groveIndex),
+  root_(0),
+  impliedAttributeValue_(new ImpliedAttributeValue),
+  tailPtr_(0),
+  freePtr_(0),
+  nFree_(0),
+  blocks_(0),
+  blockTailPtr_(&blocks_),
+  blockAllocSize_(initialBlockSize),
+  nBlocksThisSizeAlloced_(0),
+  complete_(0),
+  mutexPtr_(&mutex_),
+  pulseStep_(0),
+  nEvents_(0),
+  haveAppinfo_(0),
+  pendingData_(0),
+  nElements_(0),
+  currentLocOrigin_(0),
+  completeLimitWithLocChunkAfter_(0),
+  nChunksSinceLocOrigin_(0),
+  messageList_(0),
+  messageListTailP_(&messageList_)
+{
+  root_ = new (allocChunk(sizeof(SgmlDocumentChunk))) SgmlDocumentChunk;
+  root_->origin = 0;
+  root_->locIndex = 0;
+  completeLimit_ = freePtr_;
+  origin_ = root_;
+  tailPtr_ = &root_->prolog;
+}
+
+GroveImpl::~GroveImpl()
+{
+  while (blocks_) {
+    BlockHeader *tem = blocks_;
+    blocks_ = blocks_->next;
+    ::operator delete(tem);
+  }
+  while (messageList_) {
+    MessageItem *tem = messageList_;
+    messageList_ = *messageList_->nextP();
+    delete tem;
+  }
+}
+
+void GroveImpl::setAppinfo(const StringC &appinfo)
+{
+  appinfo_ = appinfo;
+  haveAppinfo_ = 1;
+}
+
+Boolean GroveImpl::getAppinfo(const StringC *&appinfo) const
+{
+  if (!haveAppinfo_) {
+    if (!complete_ && sd_.isNull())
+      return 0; // not available yet
+    appinfo = 0;
+  }
+  else
+    appinfo = &appinfo_;
+  return 1;
+}
+
+void GroveImpl::setSd(const ConstPtr<Sd> &sd, const ConstPtr<Syntax> &prologSyntax, const ConstPtr<Syntax> &instanceSyntax)
+{
+  instanceSyntax_ = instanceSyntax;
+  prologSyntax_ = prologSyntax;
+  sd_ = sd;
+}
+
+void GroveImpl::getSd(ConstPtr<Sd> &sd, ConstPtr<Syntax> &prologSyntax, ConstPtr<Syntax> &instanceSyntax) const
+{
+  instanceSyntax = instanceSyntax_;
+  prologSyntax = prologSyntax_;
+  sd = sd_;
+}
+
+void GroveImpl::finishProlog()
+{
+  if (root_->prolog)
+    addBarrier();
+  tailPtr_ = 0;
+}
+
+void GroveImpl::finishDocumentElement()
+{
+  // Be robust in the case of erroneous documents.
+  if (root_->epilog == 0) {
+    addBarrier();
+    tailPtr_ = &root_->epilog;
+  }
+}
+
+void GroveImpl::addBarrier()
+{
+  if (freePtr_) {
+    (void) new (freePtr_) ForwardingChunk(0, 0);
+    if (nFree_ <= sizeof(ForwardingChunk)) {
+      nFree_ = 0;
+      freePtr_ = 0;
+    }
+    else {
+      nFree_ -= sizeof(ForwardingChunk);
+      freePtr_ += sizeof(ForwardingChunk);
+    }
+  }
+}
+
+void GroveImpl::setComplete()
+{
+  addBarrier();
+  mutexPtr_ = 0;
+  completeLimit_ = 0;
+  completeLimitWithLocChunkAfter_ = 0;
+  if (pendingData_ && tailPtr_)
+    *tailPtr_ = pendingData_;
+  tailPtr_ = 0; 
+  pendingData_ = 0;
+  complete_ = 1;
+  moreNodesCondition_.set();
+}
+
+void GroveImpl::addDefaultedEntity(const ConstPtr<Entity> &entity)
+{
+  Mutex::Lock lock(mutexPtr_);
+  // We need a table of ConstPtr<Entity> but we don't have one.
+  defaultedEntityTable_.insert((Entity *)entity.pointer());
+}
+
+const Entity *GroveImpl::lookupDefaultedEntity(const StringC &name) const
+{
+  Mutex::Lock lock(mutexPtr_);
+  return defaultedEntityTable_.lookupTemp(name);
+}
+
+Dtd::ConstEntityIter GroveImpl::defaultedEntityIter() const
+{
+  ASSERT(complete());
+  return Dtd::ConstEntityIter(defaultedEntityTable_);
+}
+
+Boolean GroveImpl::maybeMoreSiblings1(const ParentChunk *chunk) const
+{
+  for (const ParentChunk *open = origin_; open; open = open->origin)
+    if (open == chunk)
+      return 1;
+  // for multi-thread case
+  return tailPtr_ == &chunk->nextSibling || chunk->nextSibling != 0;
+}
+
+void *GroveImpl::allocFinish(size_t n)
+{
+  if (++nBlocksThisSizeAlloced_ >= maxBlocksPerSize) {
+     blockAllocSize_ *= 2;
+     nBlocksThisSizeAlloced_ = 0;
+  }
+  size_t allocSize = n + (sizeof(ForwardingChunk) + sizeof(BlockHeader));
+  if (allocSize < blockAllocSize_) {
+    nFree_ = blockAllocSize_ - allocSize;
+    allocSize = blockAllocSize_;
+  }
+  else
+    nFree_ = 0;
+  *blockTailPtr_ = new (::operator new(allocSize)) BlockHeader;
+  char *chunkStart = (char *)(*blockTailPtr_ + 1);
+  blockTailPtr_ = &(*blockTailPtr_)->next;
+  if (freePtr_)
+    (void)new (freePtr_) ForwardingChunk((const Chunk *)chunkStart, origin_);
+  freePtr_ = chunkStart + n;
+  return chunkStart;
+}
+
+AccessResult ChunkNode::getLocation(Location &loc) const
+{
+  const Origin *origin = grove()->currentLocOrigin();
+  for (const Chunk *p = chunk_->after(); p; p = p->after()) {
+    if (p == grove()->completeLimitWithLocChunkAfter()) {
+      while (!p->getLocOrigin(origin)) {
+       p = p->after();
+       ASSERT(p != 0);
+      }
+      break;
+    }
+    if (p == grove()->completeLimit() || p->getLocOrigin(origin))
+      break;
+  }
+  if (!origin)
+    return accessNull;
+  loc = Location(new GroveImplProxyOrigin(grove(), origin), chunk_->locIndex);
+  return accessOK;
+}
+
+void GroveImpl::storeLocOrigin(const ConstPtr<Origin> &locOrigin)
+{
+  LocOriginChunk *chunk
+    = new (allocChunk(sizeof(LocOriginChunk)))
+         LocOriginChunk(currentLocOrigin_);
+  chunk->origin = origin_;
+  completeLimitWithLocChunkAfter_ = completeLimit_;
+  nChunksSinceLocOrigin_ = 0;
+  if (locOrigin.pointer() == currentLocOrigin_)
+    return;
+  if (currentLocOrigin_
+      && locOrigin == currentLocOrigin_->parent().origin()) {
+    // Don't need to store it.
+    currentLocOrigin_ = locOrigin.pointer();
+    return;
+  }
+  currentLocOrigin_ = locOrigin.pointer();
+  if (locOrigin.isNull())
+    return;
+  origins_.push_back(locOrigin);
+}
+
+AccessResult GroveImpl::proxifyLocation(const Location &loc, Location &ret) const
+{
+  if (loc.origin().isNull())
+    return accessNull;
+  ret = Location(new GroveImplProxyOrigin(this, loc.origin().pointer()),
+                loc.index());
+  return accessOK;
+}
+
+NodeListPtr AttributesNamedNodeList::nodeList() const
+{
+  const AttributeDefinitionList *defList = attDefList();
+  if (!defList || defList->size() == 0)
+    return new BaseNodeList;
+  else
+    return new SiblingNodeList(makeAttributeAsgnNode(grove(), 0));
+}
+
+AccessResult
+AttributesNamedNodeList::namedNodeU(const StringC &str, NodePtr &ptr) const
+{
+  const AttributeDefinitionList *defList = attDefList();
+  if (defList) {
+    for (size_t i = 0; i < defList->size(); i++)
+      if (defList->def(i)->name() == str) {
+        ptr.assign(makeAttributeAsgnNode(grove(), i));
+       return accessOK;
+      }
+  }
+  return accessNull;
+}
+
+void SgmlDocumentNode::accept(NodeVisitor &visitor)
+{
+  visitor.sgmlDocument(*this);
+}
+
+AccessResult SgmlDocumentNode::getSgmlConstants(NodePtr &ptr) const
+{
+  ptr.assign(new SgmlConstantsNode(grove()));
+  return accessOK;
+}
+
+AccessResult SgmlDocumentNode::getApplicationInfo(GroveString &str) const
+{
+  const StringC *appinfo;
+  while (!grove()->getAppinfo(appinfo))
+    if (!grove()->waitForMoreNodes())
+      return accessTimeout;
+  if (!appinfo)
+    return accessNull;
+  setString(str, *appinfo);
+  return accessOK;
+}
+
+AccessResult SgmlDocumentNode::getDocumentElement(NodePtr &ptr) const
+{
+  while (chunk()->documentElement == 0) {
+    if (grove()->complete()) {
+      // Just in case another thread crept 
+      if (chunk()->documentElement)
+       break;
+      return accessNull;
+    }
+    if (!grove()->waitForMoreNodes())
+      return accessTimeout;
+  }
+  return chunk()->documentElement->setNodePtrFirst(ptr, this);
+}
+
+AccessResult SgmlDocumentNode::getProlog(NodeListPtr &ptr) const
+{
+  while (chunk()->prolog == 0) {
+    if (chunk()->documentElement || grove()->complete())
+      break;
+    if (!grove()->waitForMoreNodes())
+      return accessTimeout;
+  }
+  if (chunk()->prolog == 0)
+    ptr.assign(new BaseNodeList);
+  else {
+    NodePtr tem;
+    chunk()->prolog->setNodePtrFirst(tem, this);
+    ptr.assign(new SiblingNodeList(tem));
+  }
+  return accessOK;
+}
+
+AccessResult SgmlDocumentNode::getEpilog(NodeListPtr &ptr) const
+{
+  while (chunk()->epilog == 0) {
+    if (grove()->complete())
+      break;
+    if (!grove()->waitForMoreNodes())
+      return accessTimeout;
+  }
+  if (chunk()->epilog == 0)
+    ptr.assign(new BaseNodeList);
+  else {
+    NodePtr tem;
+    chunk()->epilog->setNodePtrFirst(tem, this);
+    ptr.assign(new SiblingNodeList(tem));
+  }
+  return accessOK;
+}
+
+AccessResult SgmlDocumentNode::getElements(NamedNodeListPtr &ptr) const
+{
+  while (!grove()->root()->documentElement) {
+    if (grove()->complete()) {
+      if (grove()->root()->documentElement)
+       break;
+      return accessNull;
+    }
+    if (!grove()->waitForMoreNodes())
+      return accessTimeout;
+  }
+  if (!grove()->generalSubstTable())
+    return accessNull;
+  ptr.assign(new ElementsNamedNodeList(grove()));
+  return accessOK;
+}
+
+AccessResult SgmlDocumentNode::getEntities(NamedNodeListPtr &ptr) const
+{
+  while (!grove()->governingDtd()) {
+    if (grove()->complete()) {
+      if (grove()->governingDtd())
+       break;
+      return accessNull;
+    }
+    if (!grove()->waitForMoreNodes())
+      return accessTimeout;
+  }
+  ptr.assign(new DocEntitiesNamedNodeList(grove()));
+  return accessOK;
+}
+
+AccessResult SgmlDocumentNode::getDefaultedEntities(NamedNodeListPtr &ptr) const
+{
+  while (!grove()->complete())
+    if (!grove()->waitForMoreNodes())
+      return accessTimeout;
+  ptr.assign(new DefaultedEntitiesNamedNodeList(grove()));
+  return accessOK;
+}
+
+AccessResult SgmlDocumentNode::getGoverningDoctype(NodePtr &ptr) const
+{
+  while (!grove()->governingDtd()) {
+    if (grove()->complete()) {
+      if (grove()->governingDtd())
+       break;
+      return accessNull;
+    }
+    if (!grove()->waitForMoreNodes())
+      return accessTimeout;
+  }
+  ptr.assign(new DocumentTypeNode(grove(), grove()->governingDtd()));
+  return accessOK;
+}
+
+AccessResult SgmlDocumentNode::getDoctypesAndLinktypes(NamedNodeListPtr &ptr) const
+{
+  while (!grove()->governingDtd()) {
+    if (grove()->complete()) {
+      if (grove()->governingDtd())
+       break;
+      return accessNull;
+    }
+    if (!grove()->waitForMoreNodes())
+      return accessTimeout;
+  }
+  ptr.assign(new DoctypesAndLinktypesNamedNodeList(grove()));
+  return accessOK;
+}
+
+AccessResult SgmlDocumentNode::getMessages(NodeListPtr &ptr) const
+{
+  while (grove()->messageList() == 0) {
+    if (grove()->complete())
+      break;
+    if (!grove()->waitForMoreNodes())
+      return accessTimeout;
+  }
+  if (grove()->messageList()) {
+    NodePtr tem(new MessageNode(grove(), grove()->messageList()));
+    ptr.assign(new SiblingNodeList(tem));
+  }
+  else
+    ptr.assign(new BaseNodeList);
+  return accessOK;
+}
+
+AccessResult SgmlDocumentNode::getSd(ConstPtr<Sd> &sd,
+                                    ConstPtr<Syntax> &prologSyntax,
+                                    ConstPtr<Syntax> &instanceSyntax) const
+{
+  while (!grove()->complete()) {
+    if (!grove()->waitForMoreNodes())
+      return accessTimeout;
+  }
+  grove()->getSd(sd, prologSyntax, instanceSyntax);
+  if (!sd.isNull() && !prologSyntax.isNull() && !instanceSyntax.isNull())
+    return accessOK;
+  return accessNull;
+}
+
+AccessResult
+SgmlDocumentChunk::setNodePtrFirst(NodePtr &ptr, const BaseNode *node) const
+{
+  ptr.assign(new SgmlDocumentNode(node->grove(), this));
+  return accessOK;
+}
+DocumentTypeNode::DocumentTypeNode(const GroveImpl *grove, const Dtd *dtd)
+: BaseNode(grove), dtd_(dtd)
+{
+}
+
+AccessResult DocumentTypeNode::nextChunkSibling(NodePtr &) const
+{
+  return accessNull;
+}
+
+AccessResult DocumentTypeNode::getName(GroveString &str) const
+{
+  setString(str, dtd_->name());
+  return accessOK;
+}
+
+AccessResult DocumentTypeNode::getGoverning(bool &governing) const
+{
+  governing = dtd_->isBase();
+  return accessOK;
+}
+
+AccessResult DocumentTypeNode::getGeneralEntities(NamedNodeListPtr &ptr) const
+{
+  ptr.assign(new GeneralEntitiesNamedNodeList(grove(), dtd_));
+  return accessOK;
+}
+
+AccessResult DocumentTypeNode::getParameterEntities(NamedNodeListPtr &ptr) const
+{
+  ptr.assign(new ParameterEntitiesNamedNodeList(grove(), dtd_));
+  return accessOK;
+}
+
+AccessResult DocumentTypeNode::getNotations(NamedNodeListPtr &ptr) const
+{
+  ptr.assign(new NotationsNamedNodeList(grove(), dtd_));
+  return accessOK;
+}
+
+AccessResult DocumentTypeNode::getElementTypes(NamedNodeListPtr &ptr) const
+{
+  ptr.assign(new ElementTypesNamedNodeList(grove(), dtd_));
+  return accessOK;
+}
+
+AccessResult DocumentTypeNode::getDefaultEntity(NodePtr &ptr) const 
+{
+  const Entity *entity = dtd_->defaultEntityTemp();
+  if (entity == 0)
+    return accessNull;
+  ptr.assign(new DefaultEntityNode(grove(), entity));
+  return accessOK;
+}
+
+AccessResult DocumentTypeNode::getOrigin(NodePtr &ptr) const
+{
+  ptr.assign(new SgmlDocumentNode(grove(), grove()->root()));
+  return accessOK;
+}
+
+void DocumentTypeNode::accept(NodeVisitor &visitor)
+{
+  visitor.documentType(*this);
+}
+
+bool DocumentTypeNode::same(const BaseNode &node) const
+{
+  return node.same2(this);
+}
+
+bool DocumentTypeNode::same2(const DocumentTypeNode *node) const
+{
+  return dtd_ == node->dtd_;
+}
+
+SgmlConstantsNode::SgmlConstantsNode(const GroveImpl *grove)
+: BaseNode(grove)
+{
+}
+
+AccessResult SgmlConstantsNode::getOrigin(NodePtr &ptr) const
+{
+  ptr.assign(new SgmlDocumentNode(grove(), grove()->root()));
+  return accessOK;
+}
+
+void SgmlConstantsNode::accept(NodeVisitor &visitor)
+{
+  visitor.sgmlConstants(*this);
+}
+
+bool SgmlConstantsNode::same(const BaseNode &node) const
+{
+  return node.same2(this);
+}
+
+bool SgmlConstantsNode::same2(const SgmlConstantsNode *) const
+{
+  return 1;
+}
+
+MessageNode::MessageNode(const GroveImpl *grove, const MessageItem *item)
+: BaseNode(grove), item_(item)
+{
+}
+
+AccessResult MessageNode::getOrigin(NodePtr &ptr) const
+{
+  ptr.assign(new SgmlDocumentNode(grove(), grove()->root()));
+  return accessOK;
+}
+
+AccessResult MessageNode::nextChunkSibling(NodePtr &ptr) const
+{
+  while (!item_->next()) {
+    if (grove()->complete()) {
+      if (item_->next())
+       break;
+      return accessNull;
+    }
+    if (!grove()->waitForMoreNodes())
+      return accessTimeout;
+  }
+  const MessageItem *p = item_->next();
+  if (!p)
+    return accessNull;
+  ptr.assign(new MessageNode(grove(), p));
+  return accessOK;
+}
+
+AccessResult MessageNode::firstSibling(NodePtr &ptr) const
+{
+  ptr.assign(new MessageNode(grove(), grove()->messageList()));
+  return accessOK;
+}
+
+AccessResult MessageNode::siblingsIndex(unsigned long &n) const
+{
+  n = 0;
+  for (const MessageItem *p = grove()->messageList(); p != item_; p = p->next())
+    n++;
+  return accessOK;
+}
+
+void MessageNode::accept(NodeVisitor &visitor)
+{
+  visitor.message(*this);
+}
+
+bool MessageNode::same(const BaseNode &node) const
+{
+  return node.same2(this);
+}
+
+bool MessageNode::same2(const MessageNode *node) const
+{
+  return item_ == node->item_;
+}
+
+AccessResult MessageNode::getLocation(Location &loc) const
+{
+  return grove()->proxifyLocation(item_->loc(), loc);
+}
+
+AccessResult MessageNode::getText(GroveString &str) const
+{
+  setString(str, item_->text());
+  return accessOK;
+}
+
+AccessResult MessageNode::getSeverity(Severity &severity) const
+{
+  severity = item_->severity();
+  return accessOK;
+}
+
+AccessResult ElementNode::nextChunkSibling(NodePtr &ptr) const
+{
+  while (!chunk()->nextSibling) {
+    if (!grove()->maybeMoreSiblings(chunk())) {
+      // Allow for the possibility of invalid documents with elements in the epilog.
+      if ((const Chunk *)chunk() == grove()->root()->documentElement)
+       return accessNotInClass;
+      else
+        return accessNull;
+    }
+    if (!grove()->waitForMoreNodes())
+      return accessTimeout;
+  }
+  return chunk()->nextSibling->setNodePtrFirst(ptr, this);
+}
+
+// This is a duplicate of ChunkNode::nextChunkAfter
+// to take advantage of overloaded setNodePtrFirst.
+
+AccessResult ElementNode::nextChunkAfter(NodePtr &nd) const
+{
+  const Chunk *p = chunk_->after();
+  while (p == grove()->completeLimit())
+    if (!grove()->waitForMoreNodes())
+      return accessTimeout;
+  return p->setNodePtrFirst(nd, this);
+}
+
+AccessResult ElementChunk::getFollowing(const GroveImpl *grove,
+                                       const Chunk *&f,
+                                       unsigned long &n) const
+{
+  while (!nextSibling) {
+    if (!grove->maybeMoreSiblings(this)) {
+      if ((const Chunk *)origin == grove->root())
+       return accessNotInClass;
+      else
+        return accessNull;
+    }
+    if (!grove->waitForMoreNodes())
+      return accessTimeout;
+  }
+  f = nextSibling;
+  n = 1;
+  return accessOK;
+}
+
+AccessResult ElementNode::firstChild(NodePtr &ptr) const
+{
+  const Chunk *p = chunk()->after();
+  while (p == grove()->completeLimit()) {
+    if (!grove()->waitForMoreNodes())
+      return accessTimeout;
+  }
+  if ((const Chunk *)(p->origin) == chunk())
+    return p->setNodePtrFirst(ptr, this);
+  return accessNull;
+}
+
+AccessResult ElementNode::attributeRef(unsigned long n, NodePtr &ptr) const
+{
+  const AttributeDefinitionList *defList = chunk()->attDefList();
+  if (!defList || n >= defList->size())
+    return accessNull;
+  ptr.assign(new ElementAttributeAsgnNode(grove(), size_t(n), chunk()));
+  return accessOK;
+}
+
+AccessResult ElementNode::getAttributes(NamedNodeListPtr &ptr) const
+{
+  ptr.assign(new ElementAttributesNamedNodeList(grove(), chunk()));
+  return accessOK;
+}
+
+AccessResult ElementNode::getGi(GroveString &str) const
+{
+  setString(str, chunk()->type->name());
+  return accessOK;
+}
+
+bool ElementNode::hasGi(GroveString str) const
+{
+  const StringC &gi = chunk()->type->name();
+  size_t len = gi.size();
+  if (len != str.size())
+    return 0;
+  const SubstTable *subst = grove()->generalSubstTable();
+  if (!subst)
+    return 0;
+  for (size_t i = 0; i < len; i++)
+    if ((*subst)[str[i]] != gi[i])
+      return 0;
+  return 1;
+}
+
+AccessResult ElementNode::getId(GroveString &str) const
+{
+  const StringC *id = chunk()->id();
+  if (!id)
+    return accessNull;
+  setString(str, *id);
+  return accessOK;
+}
+
+AccessResult ElementNode::elementIndex(unsigned long &i) const
+{
+  i = chunk()->elementIndex;
+  return accessOK;
+}
+
+AccessResult ElementNode::getElementType(NodePtr &ptr) const
+{
+  if (chunk()->elementType() == 0)
+    return accessNull;  
+  ptr.assign(new ElementTypeNode(grove(), *(chunk()->elementType())));
+  return accessOK;
+}
+
+AccessResult ElementNode::getContent(NodeListPtr &ptr) const
+{
+  return children(ptr);
+}
+
+AccessResult ElementNode::getMustOmitEndTag(bool &b) const
+{
+  b = chunk()->mustOmitEndTag();
+  return accessOK;
+}
+
+AccessResult ElementNode::getIncluded(bool &b) const
+{
+  b = chunk()->included();
+  return accessOK;
+}
+
+void ElementNode::accept(NodeVisitor &visitor)
+{
+  visitor.element(*this);
+}
+
+ElementChunk *
+ElementNode::makeAttElementChunk(GroveImpl &grove,
+                                const StartElementEvent &event,
+                                Boolean &hasId)
+{
+  const AttributeList &atts = event.attributes();
+  size_t nAtts = atts.size();
+  while (nAtts > 0 && !atts.specified(nAtts - 1) && !atts.current(nAtts - 1))
+    nAtts--;
+  ElementChunk *chunk;
+  void *mem
+    = grove.allocChunk(sizeof(AttElementChunk) + nAtts * sizeof(AttributeValue *));
+  if (event.included()) {
+    // Workaround VC++ 4.1 bug.
+    AttElementChunk *tem = new (mem) IncludedAttElementChunk(nAtts);
+    chunk = tem;
+  }
+  else
+    chunk = new (mem) AttElementChunk(nAtts);
+  const AttributeValue **values
+    = (const AttributeValue **)(((AttElementChunk *)chunk) + 1);
+  const AttributeDefinitionList *defList
+    = event.elementType()->attributeDef().pointer();
+  unsigned idIndex;
+  if (atts.idIndex(idIndex) && atts.specified(idIndex) && atts.value(idIndex))
+    hasId = 1;
+  else
+    hasId = 0;
+  for (size_t i = 0; i < nAtts; i++) {
+    if (atts.specified(i) || atts.current(i)) {
+      grove.storeAttributeValue(atts.valuePointer(i));
+      values[i] = atts.value(i);
+    }
+    else {
+      // If we stored a reference to the implied attribute value in the
+      // Dtd then it would be safe just to use atts.value(i) here.
+      // But that would mean we couldn't conveniently tell whether it
+      // was specified or implied.
+      values[i] = defList->def(i)->defaultValue(grove.impliedAttributeValue());
+    }
+  }
+  return chunk;
+}
+
+const Chunk *AttElementChunk::after() const
+{
+  return (const Chunk *)((char *)(this + 1)
+                        + (sizeof(const AttributeValue *) * nAtts));
+}
+
+const AttributeValue *
+AttElementChunk::attributeValue(size_t attIndex, const GroveImpl &grove) const
+{
+  if (attIndex < nAtts)
+    return ((const AttributeValue **)(this + 1))[attIndex];
+  else
+    return ElementChunk::attributeValue(attIndex, grove);
+}
+
+const StringC *AttElementChunk::id() const
+{
+  size_t i = ElementChunk::attDefList()->idIndex();
+  if (i == size_t(-1) || i >= nAtts)
+    return 0;
+  const AttributeValue *av = ((const AttributeValue **)(this + 1))[i];
+  if (!av)
+    return 0;
+  const Text *t = av->text();
+  if (!t)
+    return 0;
+  return &t->string();
+}
+
+Boolean AttElementChunk::mustOmitEndTag() const
+{
+  if (ElementChunk::mustOmitEndTag())
+    return 1;
+  const AttributeDefinitionList *adl = ElementChunk::attDefList();
+  size_t nAtts = adl->size();
+  const AttributeValue **atts = (const AttributeValue **)(this + 1);
+  for (size_t i = 0; i < nAtts; i++)
+    if (adl->def(i)->isConref() && atts[i] && atts[i]->text())
+      return 1;
+  return 0;
+}
+
+const Chunk *ElementChunk::after() const
+{
+  return this + 1;
+}
+
+const AttributeValue *
+ElementChunk::attributeValue(size_t attIndex, const GroveImpl &grove) const
+{
+  return attDefList()->def(attIndex)->defaultValue(grove.impliedAttributeValue());
+}
+
+Boolean ElementChunk::mustOmitEndTag() const
+{
+  return type->definition()->declaredContent() == ElementDefinition::empty;
+}
+
+Boolean IncludedElementChunk::included() const
+{
+  return 1;
+}
+
+Boolean IncludedAttElementChunk::included() const
+{
+  return 1;
+}
+
+Boolean ElementChunk::included() const
+{
+  return 0;
+}
+
+AccessResult
+ElementChunk::setNodePtrFirst(NodePtr &ptr, const BaseNode *node) const
+{
+  ptr.assign(new ElementNode(node->grove(), this));
+  return accessOK;
+}
+
+AccessResult
+ElementChunk::setNodePtrFirst(NodePtr &ptr, const ElementNode *node) const
+{
+  if (node->canReuse(ptr))
+    ((ElementNode *)node)->reuseFor(this);
+  else
+    ptr.assign(new ElementNode(node->grove(), this));
+  return accessOK;
+}
+
+AccessResult
+ElementChunk::setNodePtrFirst(NodePtr &ptr, const DataNode *node) const
+{
+  ptr.assign(new ElementNode(node->grove(), this));
+  return accessOK;
+}
+
+ElementAttributeOrigin::ElementAttributeOrigin(const ElementChunk *chunk)
+: chunk_(chunk)
+{
+}
+
+const AttributeDefinitionList *ElementAttributeOrigin::attDefList() const
+{
+  return chunk_->attDefList();
+}
+
+
+const AttributeValue *
+ElementAttributeOrigin::attributeValue(size_t attIndex, const GroveImpl &grove) const
+{
+  return chunk_->attributeValue(attIndex, grove);
+}
+
+
+AccessResult
+ElementAttributeOrigin::setNodePtrAttributeOrigin(NodePtr &ptr,
+                                                 const BaseNode *node) const
+{
+  return chunk_->setNodePtrFirst(ptr, node);
+}
+  
+
+Node *ElementAttributeOrigin
+::makeCdataAttributeValueNode(const GroveImpl *grove,
+                             const AttributeValue *value,
+                             size_t attIndex,
+                             const TextIter &iter,
+                             size_t charIndex) const
+{
+  return new ElementCdataAttributeValueNode(grove, value, attIndex, iter,
+                                           charIndex, chunk_);
+}
+
+
+Node *ElementAttributeOrigin
+::makeAttributeValueTokenNode(const GroveImpl *grove,
+                             const TokenizedAttributeValue *value,
+                             size_t attIndex,
+                             size_t tokenIndex) const
+{
+  return new ElementAttributeValueTokenNode(grove, value, attIndex,
+                                           tokenIndex, chunk_);
+}
+
+Node *ElementAttributeOrigin
+::makeAttributeAsgnNode(const GroveImpl *grove,
+                       size_t attIndex) const
+{
+  return new ElementAttributeAsgnNode(grove, attIndex, chunk_);
+}
+
+AccessResult ElementAttributeOrigin
+::makeAttributeDefNode(const GroveImpl *grove,
+                       NodePtr &ptr,
+                       size_t attributeDefIdx) const 
+{
+  if (chunk_->elementType() == 0)
+    return accessNull;  
+  ptr.assign(new ElementTypeAttributeDefNode(grove,
+                                             *(chunk_->elementType()),
+                                             attributeDefIdx)); 
+  return accessOK;
+}
+
+Node *ElementAttributeOrigin::makeOriginNode(const GroveImpl *grove, size_t attIndex) const 
+{
+  return makeAttributeAsgnNode(grove, attIndex);
+}
+
+const void *ElementAttributeOrigin::attributeOriginId() const
+{
+  return chunk_;
+}
+
+bool DataNode::same(const BaseNode &node) const
+{
+  return node.same2(this);
+}
+
+bool DataNode::same2(const DataNode *node) const
+{
+  return chunk_ == node->chunk_ && index_ == node->index_;
+}
+
+bool DataNode::chunkContains(const Node &node) const
+{
+  if (!sameGrove(node))
+    return 0;
+  return ((const BaseNode &)node).inChunk(this);
+}
+
+bool DataNode::inChunk(const DataNode *node) const
+{
+  return chunk_ == node->chunk_ && index_ >= node->index_;
+}
+
+AccessResult DataNode::charChunk(const SdataMapper &, GroveString &str) const
+{
+  str.assign(chunk()->data() + index_, chunk()->size - index_);
+  return accessOK;
+}
+
+void DataNode::accept(NodeVisitor &visitor)
+{
+  visitor.dataChar(*this);
+}
+
+unsigned long DataNode::hash() const
+{
+  return secondHash(ChunkNode::hash() + index_);
+}
+
+AccessResult DataNode::getNonSgml(unsigned long &) const
+{
+  return accessNull;
+}
+
+AccessResult DataNode::nextSibling(NodePtr &ptr) const
+{
+  if (index_ + 1 < chunk()->size) {
+    if (canReuse(ptr))
+      ((DataNode *)this)->index_ += 1;
+    else
+      ptr.assign(new DataNode(grove(), chunk(), index_ + 1));
+    return accessOK;
+  }
+  return DataNode::nextChunkSibling(ptr);
+}
+
+AccessResult DataNode::nextChunkAfter(NodePtr &nd) const
+{
+  const Chunk *p = chunk_->after();
+  while (p == grove()->completeLimit())
+    if (!grove()->waitForMoreNodes())
+      return accessTimeout;
+  return p->setNodePtrFirst(nd, this);
+}
+
+AccessResult DataNode::followSiblingRef(unsigned long i, NodePtr &ptr) const
+{
+  if (i < chunk()->size - index_ - 1) {
+    if (canReuse(ptr))
+      ((DataNode *)this)->index_ += 1 + size_t(i);
+    else
+      ptr.assign(new DataNode(grove(), chunk(), index_ + size_t(i) + 1));
+    return accessOK;
+  }
+  return ChunkNode::followSiblingRef(i - (chunk()->size - index_ - 1), ptr);
+}
+
+AccessResult DataNode::siblingsIndex(unsigned long &i) const
+{
+  AccessResult ret = ChunkNode::siblingsIndex(i);
+  if (ret == accessOK)
+    i += index_;
+  return ret;
+}
+
+AccessResult DataNode::getLocation(Location &loc) const
+{
+  AccessResult ret = ChunkNode::getLocation(loc);
+  if (ret == accessOK)
+    loc += index_;
+  return ret;
+}
+
+AccessResult DataChunk::getFollowing(const GroveImpl *grove,
+                                    const Chunk *&f,
+                                    unsigned long &i) const
+{
+  // We could call Chunk::getFollowing to do most of
+  // the work, but that would cost us a couple of extra
+  // virtual function calls.
+  const Chunk *p = CharsChunk::after();
+  while (p == grove->completeLimit())
+    if (!grove->waitForMoreNodes())
+      return accessTimeout;
+  if (p->origin != origin)
+    return accessNull;
+  i = size;
+  f = p;
+  return accessOK;
+}
+
+AccessResult DataChunk::setNodePtrFirst(NodePtr &ptr,
+                                       const BaseNode *node) const
+{
+  ptr.assign(new DataNode(node->grove(), this, 0));
+  return accessOK;
+}
+
+// This just saves us a virtual function call in a common case
+AccessResult DataChunk::setNodePtrFirst(NodePtr &ptr,
+                                       const ElementNode *node) const
+{
+  ptr.assign(new DataNode(node->grove(), this, 0));
+  return accessOK;
+}
+
+AccessResult DataChunk::setNodePtrFirst(NodePtr &ptr, const DataNode *node)
+     const
+{
+  if (node->canReuse(ptr))
+    ((DataNode *)node)->reuseFor(this, 0);
+  else
+    ptr.assign(new DataNode(node->grove(), this, 0));
+  return accessOK;
+}
+
+AccessResult PiNode::getSystemData(GroveString &str) const
+{
+  str.assign(chunk()->data(), chunk()->size);
+  return accessOK;
+}
+
+void PiNode::add(GroveImpl &grove, const PiEvent &event)
+{
+  const Entity *entity = event.entity();
+  if (entity)
+    PiEntityNode::add(grove, entity, event.location());
+  else {
+    grove.setLocOrigin(event.location().origin());
+    size_t dataLen = event.dataLength();
+    void *mem = grove.allocChunk(CharsChunk::allocSize(dataLen));
+    PiChunk *chunk;
+    if (grove.haveRootOrigin()) {
+      if (grove.root()->documentElement)
+       chunk = new (mem) EpilogPiChunk;
+      else
+       chunk = new (mem) PrologPiChunk;
+    }
+    else
+      chunk = new (mem) PiChunk;
+    chunk->size = dataLen;
+    chunk->locIndex = event.location().index();
+    memcpy(chunk + 1, event.data(), dataLen * sizeof(Char));
+    grove.appendSibling(chunk);
+  }
+}
+
+AccessResult PiChunk::setNodePtrFirst(NodePtr &ptr, const BaseNode *node) const
+{
+  ptr.assign(new PiNode(node->grove(), this));
+  return accessOK;
+}
+
+AccessResult PrologPiChunk::getFirstSibling(const GroveImpl *grove, const struct Chunk *&p) const
+{
+  p = grove->root()->prolog;
+  return accessOK;
+}
+
+AccessResult EpilogPiChunk::getFirstSibling(const GroveImpl *grove, const struct Chunk *&p) const
+{
+  p = grove->root()->epilog;
+  return accessOK;
+}
+
+AccessResult SdataNode::charChunk(const SdataMapper &mapper, GroveString &str) const
+{
+  const StringC &name = chunk()->entity->name();
+  const StringC &text = chunk()->entity->asInternalEntity()->string();
+  Char *cp = (Char *)&c_;
+  if (mapper.sdataMap(GroveString(name.data(), name.size()), GroveString(text.data(), text.size()), *cp)) {
+    str.assign(&c_, 1);
+    return accessOK;
+  }
+  else
+    return accessNull;
+}
+
+AccessResult SdataNode::getSystemData(GroveString &str) const
+{
+  setString(str, chunk()->entity->asInternalEntity()->string());
+  return accessOK;
+}
+
+void SdataNode::add(GroveImpl &grove, const SdataEntityEvent &event)
+{
+  const Location &loc = event.location().origin()->parent();
+  grove.setLocOrigin(loc.origin());
+  SdataChunk *chunk = new (grove.allocChunk(sizeof(SdataChunk))) SdataChunk;
+  chunk->entity = event.entity();
+  chunk->locIndex = loc.index();
+  grove.appendSibling(chunk);
+}
+
+AccessResult SdataChunk::setNodePtrFirst(NodePtr &ptr, const BaseNode *node)
+     const
+{
+  ptr.assign(new SdataNode(node->grove(), this));
+  return accessOK;
+}
+
+AccessResult NonSgmlChunk::setNodePtrFirst(NodePtr &ptr, const BaseNode *node)
+     const
+{
+  ptr.assign(new NonSgmlNode(node->grove(), this));
+  return accessOK;
+}
+
+AccessResult NonSgmlNode::getNonSgml(unsigned long &n) const
+{
+  n = chunk()->c;
+  return accessOK;
+}
+
+AccessResult NonSgmlNode::charChunk(const SdataMapper &, GroveString &) const
+{
+  return accessNull;
+}
+
+void NonSgmlNode::add(GroveImpl &grove, const NonSgmlCharEvent &event)
+{
+  grove.setLocOrigin(event.location().origin());
+  NonSgmlChunk *chunk = new (grove.allocChunk(sizeof(NonSgmlChunk))) NonSgmlChunk;
+  chunk->c = event.character();
+  chunk->locIndex = event.location().index();
+  grove.appendSibling(chunk);
+}
+
+void ExternalDataNode::add(GroveImpl &grove, const ExternalDataEntityEvent &event)
+{
+  grove.setLocOrigin(event.location().origin());
+  ExternalDataChunk *chunk = new (grove.allocChunk(sizeof(ExternalDataChunk))) ExternalDataChunk;
+  chunk->entity = event.entity();
+  chunk->locIndex = event.location().index();
+  grove.appendSibling(chunk);
+}
+
+AccessResult ExternalDataChunk::setNodePtrFirst(NodePtr &ptr, const BaseNode *node)
+     const
+{
+  ptr.assign(new ExternalDataNode(node->grove(), this));
+  return accessOK;
+}
+
+void SubdocNode::add(GroveImpl &grove, const SubdocEntityEvent &event)
+{
+  grove.setLocOrigin(event.location().origin());
+  SubdocChunk *chunk = new (grove.allocChunk(sizeof(SubdocChunk))) SubdocChunk;
+  chunk->entity = event.entity();
+  chunk->locIndex = event.location().index();
+  grove.appendSibling(chunk);
+}
+
+AccessResult SubdocChunk::setNodePtrFirst(NodePtr &ptr, const BaseNode *node)
+     const
+{
+  ptr.assign(new SubdocNode(node->grove(), this));
+  return accessOK;
+}
+
+AccessResult PiEntityNode::getSystemData(GroveString &str) const
+{
+  setString(str, chunk()->entity->asInternalEntity()->string());
+  return accessOK;
+}
+
+void PiEntityNode::add(GroveImpl &grove, const Entity *entity,
+                      const Location &loc)
+{
+  // FIXME use parent?
+  grove.setLocOrigin(loc.origin());
+  PiEntityChunk *chunk = new (grove.allocChunk(sizeof(PiEntityChunk))) PiEntityChunk;
+  chunk->entity = entity;
+  chunk->locIndex = loc.index();
+  grove.appendSibling(chunk);
+}
+
+AccessResult PiEntityChunk::setNodePtrFirst(NodePtr &ptr, const BaseNode *node)
+ const
+{
+  ptr.assign(new PiEntityNode(node->grove(), this));
+  return accessOK;
+}
+
+AccessResult EntityRefNode::getEntity(NodePtr &ptr) const
+{
+  ptr.assign(new EntityNode(grove(), chunk()->entity));
+  return accessOK;
+}
+
+AccessResult EntityRefNode::getEntityName(GroveString &str) const
+{
+  setString(str, chunk()->entity->name());
+  return accessOK;
+}
+
+AttributeAsgnNode::AttributeAsgnNode(const GroveImpl *grove,
+                                    size_t attIndex)
+: BaseNode(grove), AttributeDefOrigin(attIndex)
+{
+}
+
+AccessResult ChunkNode::nextChunkSibling(NodePtr &ptr) const
+{
+  // The forwarding chunk has origin = 0, so it will stop
+  // the iteration before after() can return 0.
+  const Chunk *p = chunk_->after();
+  while (p == grove()->completeLimit())
+    if (!grove()->waitForMoreNodes())
+      return accessTimeout;
+  if (p->origin != chunk_->origin)
+    return accessNull;
+  return p->setNodePtrFirst(ptr, this);
+}
+
+AccessResult ChunkNode::nextChunkAfter(NodePtr &nd) const
+{
+  const Chunk *p = chunk_->after();
+  while (p == grove()->completeLimit())
+    if (!grove()->waitForMoreNodes())
+      return accessTimeout;
+  return p->setNodePtrFirst(nd, this);
+}
+
+AccessResult ChunkNode::firstSibling(NodePtr &ptr) const
+{
+  const Chunk *first;
+  AccessResult ret = chunk_->getFirstSibling(grove(), first);
+  if (ret != accessOK)
+    return ret;
+  return first->setNodePtrFirst(ptr, this);
+}
+
+AccessResult ChunkNode::siblingsIndex(unsigned long &i) const
+{
+  const Chunk *p;
+  AccessResult ret = chunk_->getFirstSibling(grove(), p);
+  if (ret != accessOK)
+    return ret;
+  i = 0;
+  while (p != chunk_) {
+    unsigned long tem;
+    if (p->getFollowing(grove(), p, tem) != accessOK)
+      CANNOT_HAPPEN();
+    i += tem;
+  }
+  return accessOK;
+}
+
+AccessResult ChunkNode::followSiblingRef(unsigned long i, NodePtr &ptr) const
+{
+  const Chunk *p;
+  unsigned long count;
+  AccessResult ret = chunk()->getFollowing(grove(), p, count);
+  if (ret != accessOK)
+    return ret;
+  while (i > 0) {
+    const Chunk *lastP = p;
+    ret = p->getFollowing(grove(), p, count);
+    if (ret == accessOK && count <= i)
+      i -= count;
+    else if (ret == accessOK || ret == accessNull) {
+      lastP->setNodePtrFirst(ptr, this);
+      return ptr->followSiblingRef(i - 1, ptr);
+    }
+    else
+      return ret;
+  }
+  return p->setNodePtrFirst(ptr, this);
+}
+
+AccessResult AttributeAsgnNode::getOrigin(NodePtr &ptr) const
+{
+  return setNodePtrAttributeOrigin(ptr, this);
+}
+
+AccessResult AttributeAsgnNode::getName(GroveString &str) const
+{
+  setString(str, attDefList()->def(attIndex_)->name());
+  return accessOK;
+}
+
+AccessResult AttributeAsgnNode::getImplied(bool &implied) const
+{
+  const AttributeValue *value = attributeValue(attIndex_, *grove());
+  implied = (value != 0 && value->text() == 0);
+  return accessOK;
+}
+
+AccessResult AttributeAsgnNode::getValue(NodeListPtr &ptr) const
+{
+  return children(ptr);
+}
+
+AccessResult AttributeAsgnNode::nextChunkSibling(NodePtr &ptr) const
+{
+  return followSiblingRef(0, ptr);
+}
+AccessResult AttributeAsgnNode::followSiblingRef(unsigned long i, NodePtr &ptr) const
+{
+  // Do it like this to avoid overflow.
+  if (i >= attDefList()->size() - attIndex_ - 1)
+    return accessNull;
+  if (canReuse(ptr))
+    ((AttributeAsgnNode *)this)->attIndex_ += size_t(i) + 1;
+  else
+    ptr.assign(makeAttributeAsgnNode(grove(), attIndex_ + 1 + size_t(i)));
+  return accessOK;
+}
+
+AccessResult AttributeAsgnNode::firstSibling(NodePtr &ptr) const
+{
+  if (canReuse(ptr))
+    ((AttributeAsgnNode *)this)->attIndex_ = 0;
+  else
+    ptr.assign(makeAttributeAsgnNode(grove(), 0));
+  return accessOK;
+}
+
+AccessResult AttributeAsgnNode::siblingsIndex(unsigned long &i) const
+{
+  i = attIndex_;
+  return accessOK;
+}
+void AttributeAsgnNode::accept(NodeVisitor &visitor)
+{
+  visitor.attributeAssignment(*this);
+}
+
+AccessResult AttributeAsgnNode::firstChild(NodePtr &ptr) const
+{
+  const AttributeValue *value = attributeValue(attIndex_, *grove());
+  return makeAttributeValueNode(grove(), ptr, value);
+}
+
+AccessResult AttributeAsgnNode::children(NodeListPtr &ptr) const
+{
+  const AttributeValue *value = attributeValue(attIndex_, *grove());
+  return makeAttributeValueNodeList(grove(), ptr, value);
+}
+
+AccessResult AttributeAsgnNode::getTokenSep(Char &ch) const
+{
+  const AttributeValue *value = attributeValue(attIndex_, *grove());
+  if (!value)
+    return accessNull;
+  const Text *text;
+  const StringC *str;
+  if (value->info(text, str) != AttributeValue::tokenized)
+    return accessNull;
+  const TokenizedAttributeValue *tValue =
+    (const TokenizedAttributeValue *)value;
+  if (tValue->nTokens() <= 1)
+    return accessNull;
+  const Char *ptr;
+  size_t len;
+  tValue->token(0, ptr, len);
+  // the character following the token is a space
+  ch = ptr[len];
+  return accessOK;
+}
+
+AccessResult AttributeAsgnNode::tokens(GroveString &s) const
+{
+  const AttributeValue *value = attributeValue(attIndex_, *grove());
+  if (!value)
+    return accessNull;
+  const Text *text;
+  const StringC *str;
+  if (value->info(text, str) != AttributeValue::tokenized)
+    return accessNull;
+  setString(s, *str);
+  return accessOK;
+}
+
+AccessResult AttributeAsgnNode::getAttributeDef(NodePtr &ptr) const
+{
+  return makeAttributeDefNode(grove(), ptr, attIndex_);
+}
+
+bool AttributeAsgnNode::same(const BaseNode &node) const
+{
+  return node.same2(this);
+}
+
+bool AttributeAsgnNode::same2(const AttributeAsgnNode *node)
+ const
+{
+  return (attributeOriginId() == node->attributeOriginId()
+         && attIndex_ == node->attIndex_);
+}
+
+unsigned long AttributeAsgnNode::hash() const
+{
+  unsigned long n = (unsigned long)attributeOriginId();
+  return secondHash(n + attIndex_);
+}
+
+ElementAttributeAsgnNode
+::ElementAttributeAsgnNode(const GroveImpl *grove, size_t attIndex,
+                          const ElementChunk *chunk)
+: AttributeAsgnNode(grove, attIndex),
+  ElementAttributeOrigin(chunk),
+  AttributeDefOrigin(attIndex)
+{
+}
+
+EntityAttributeAsgnNode
+::EntityAttributeAsgnNode(const GroveImpl *grove, size_t attIndex,
+                         const ExternalDataEntity *entity)
+: AttributeAsgnNode(grove, attIndex),
+  EntityAttributeOrigin(entity),
+  AttributeDefOrigin(attIndex)
+{
+}
+
+CdataAttributeValueNode
+::CdataAttributeValueNode(const GroveImpl *grove,
+                         const AttributeValue *value,
+                         size_t attIndex,
+                         const TextIter &iter,
+                         size_t charIndex)
+: BaseNode(grove),
+  AttributeDefOrigin(attIndex),
+  value_(value),
+  iter_(iter),
+  charIndex_(charIndex)
+{
+}
+
+bool CdataAttributeValueNode::skipBoring(TextIter &iter)
+{
+  while (iter.valid()) {
+    switch (iter.type()) {
+    case TextItem::data:
+    case TextItem::cdata:
+    case TextItem::sdata:
+      {
+       size_t length;
+       iter.chars(length);
+       if (length > 0)
+         return 1;
+      }
+      // fall through
+    default:
+      iter.advance();
+      break;
+    }
+  }
+  return 0;
+}
+
+AccessResult CdataAttributeValueNode::getParent(NodePtr &ptr) const
+{
+  ptr.assign(makeOriginNode(grove(), attIndex_));
+  return accessOK;
+}
+
+AccessResult CdataAttributeValueNode::charChunk(const SdataMapper &mapper, GroveString &str) const
+{
+  if (iter_.type() == TextItem::sdata) {
+    const Entity *entity = iter_.location().origin()->asEntityOrigin()->entity();
+    const StringC &name = entity->name();
+    const StringC &text = entity->asInternalEntity()->string();
+    Char *cp = (Char *)&c_;
+    if (mapper.sdataMap(GroveString(name.data(), name.size()), GroveString(text.data(), text.size()), *cp)) {
+      str.assign(&c_, 1);
+      return accessOK;
+    }
+    else
+      return accessNull;
+  }
+  size_t len;
+  const Char *s = iter_.chars(len);
+  str.assign(s + charIndex_, len - charIndex_);
+  return accessOK;
+}
+
+AccessResult CdataAttributeValueNode::siblingsIndex(unsigned long &n) const
+{
+  TextIter copy(iter_);
+  size_t tem;
+  const Char *iterChars = iter_.chars(tem);
+  copy.rewind();
+  skipBoring(copy);
+  n = 0;
+  while (copy.chars(tem) != iterChars) {
+    if (copy.type() == TextItem::sdata)
+      n += 1;
+    else
+      n += tem;
+    copy.advance();
+    skipBoring(copy);
+  }
+  n += charIndex_;
+  return accessOK;
+}
+
+AccessResult CdataAttributeValueNode::getEntity(NodePtr &ptr) const
+{
+  if (iter_.type() != TextItem::sdata)
+    return accessNotInClass;
+  const Entity *entity
+    = iter_.location().origin()->asEntityOrigin()->entity();
+  ptr.assign(new EntityNode(grove(), entity));
+  return accessOK;
+}
+
+AccessResult CdataAttributeValueNode::getEntityName(GroveString &str) const
+{
+  if (iter_.type() != TextItem::sdata)
+    return accessNotInClass;
+  const Entity *entity
+    = iter_.location().origin()->asEntityOrigin()->entity();
+  setString(str, entity->name());
+  return accessOK;
+}
+
+AccessResult CdataAttributeValueNode::getSystemData(GroveString &str) const
+{
+  if (iter_.type() != TextItem::sdata)
+    return accessNotInClass;
+  size_t len;
+  const Char *ptr = iter_.chars(len);
+  str.assign(ptr, len);
+  return accessOK;
+}
+
+AccessResult CdataAttributeValueNode::firstSibling(NodePtr &ptr) const
+{
+  TextIter copy(iter_);
+  copy.rewind();
+  skipBoring(copy);
+  if (canReuse(ptr)) {
+    CdataAttributeValueNode *node = (CdataAttributeValueNode *)this;
+    node->iter_ = copy;
+    node->charIndex_ = 0;
+  }
+  else
+    ptr.assign(makeCdataAttributeValueNode(grove(), value_, attIndex_, copy));
+  return accessOK;
+}
+
+AccessResult CdataAttributeValueNode::nextChunkSibling(NodePtr &ptr) const
+{
+  TextIter copy(iter_);
+  copy.advance();
+  if (!skipBoring(copy))
+    return accessNull;
+  if (canReuse(ptr)) {
+    CdataAttributeValueNode *node = (CdataAttributeValueNode *)this;
+    node->iter_ = copy;
+    node->charIndex_ = 0;
+  }
+  else
+    ptr.assign(makeCdataAttributeValueNode(grove(), value_, attIndex_, copy));
+  return accessOK;
+}
+
+AccessResult CdataAttributeValueNode::nextSibling(NodePtr &ptr) const
+{
+  if (iter_.type() != TextItem::sdata) {
+    size_t length;
+    iter_.chars(length);
+    if (charIndex_ + 1 < length) {
+      if (canReuse(ptr))
+       ((CdataAttributeValueNode *)this)->charIndex_ += 1;
+      else
+       ptr.assign(makeCdataAttributeValueNode(grove(), value_,
+                                              attIndex_, iter_,
+                                              charIndex_ + 1));
+      return accessOK;
+    }
+  }
+  return CdataAttributeValueNode::nextChunkSibling(ptr);
+}
+
+AccessResult CdataAttributeValueNode::getLocation(Location &loc) const
+{
+  if (iter_.type() == TextItem::sdata)
+    return grove()->proxifyLocation(iter_.location().origin()->parent(), loc);
+  else
+    return grove()->proxifyLocation(iter_.location(), loc);
+}
+
+void CdataAttributeValueNode::accept(NodeVisitor &visitor)
+{
+  if (iter_.type() == TextItem::sdata)
+    visitor.sdata(*this);
+  else
+    visitor.dataChar(*this);
+}
+
+unsigned long CdataAttributeValueNode::hash() const
+{
+  unsigned long n;
+  CdataAttributeValueNode::siblingsIndex(n);
+  return secondHash(secondHash((unsigned long)attributeOriginId() + attIndex_) + n);
+}
+
+const ClassDef &CdataAttributeValueNode::classDef() const
+{
+  if (iter_.type() == TextItem::sdata)
+    return ClassDef::sdata;
+  else
+    return ClassDef::dataChar;
+}
+
+bool CdataAttributeValueNode::same(const BaseNode &node) const
+{
+  return node.same2(this);
+}
+
+bool CdataAttributeValueNode::same2(const CdataAttributeValueNode *node)
+     const
+{
+  size_t tem;
+  return (attributeOriginId() == node->attributeOriginId()
+         && attIndex_ == node->attIndex_
+         && charIndex_ == node->charIndex_
+         && iter_.chars(tem) == node->iter_.chars(tem));
+}
+
+bool CdataAttributeValueNode::chunkContains(const Node &node) const
+{
+  if (!sameGrove(node))
+    return 0;
+  return ((const BaseNode &)node).inChunk(this);
+}
+
+bool CdataAttributeValueNode::inChunk(const CdataAttributeValueNode *node) const
+{
+  size_t tem;
+  return (attributeOriginId() == node->attributeOriginId()
+          && attIndex_ == node->attIndex_
+         && iter_.chars(tem) == node->iter_.chars(tem)
+         && charIndex_ >= node->charIndex_);
+}
+
+ElementCdataAttributeValueNode
+::ElementCdataAttributeValueNode(const GroveImpl *grove,
+                                const AttributeValue *value,
+                                size_t attIndex,
+                                const TextIter &iter,
+                                size_t charIndex,
+                                const ElementChunk *chunk)
+: CdataAttributeValueNode(grove, value, attIndex, iter, charIndex),
+  ElementAttributeOrigin(chunk), AttributeDefOrigin(attIndex)
+{
+}
+
+EntityCdataAttributeValueNode
+::EntityCdataAttributeValueNode(const GroveImpl *grove,
+                               const AttributeValue *value,
+                               size_t attIndex,
+                               const TextIter &iter,
+                               size_t charIndex,
+                               const ExternalDataEntity *entity)
+: CdataAttributeValueNode(grove, value, attIndex, iter, charIndex),
+  EntityAttributeOrigin(entity), AttributeDefOrigin(attIndex)
+{
+}
+
+ElementTypeCdataAttributeValueNode
+::ElementTypeCdataAttributeValueNode(const GroveImpl *grove,
+                                    const AttributeValue *value,
+                                    size_t attIndex,
+                                    const TextIter &iter,
+                                    size_t charIndex,
+                                    const ElementType *elementType)
+: CdataAttributeValueNode(grove, value, attIndex, iter, charIndex),
+  ElementTypeAttributeDefOrigin(elementType), AttributeDefOrigin(attIndex)
+{
+}
+
+NotationCdataAttributeValueNode
+::NotationCdataAttributeValueNode(const GroveImpl *grove,
+                                 const AttributeValue *value,
+                                 size_t attIndex,
+                                 const TextIter &iter,
+                                 size_t charIndex,
+                                 const Notation *notation)
+: CdataAttributeValueNode(grove, value, attIndex, iter, charIndex),
+  NotationAttributeDefOrigin(notation), AttributeDefOrigin(attIndex)
+{
+}
+
+AttributeValueTokenNode
+::AttributeValueTokenNode(const GroveImpl *grove,
+                         const TokenizedAttributeValue *value,
+                         size_t attIndex, size_t tokenIndex)
+: BaseNode(grove),
+  AttributeDefOrigin(attIndex),
+  value_(value),
+  tokenIndex_(tokenIndex)
+{
+}
+
+AccessResult AttributeValueTokenNode::getParent(NodePtr &ptr) const
+{
+  ptr.assign(makeOriginNode(grove(), attIndex_));
+  return accessOK;
+}
+
+AccessResult AttributeValueTokenNode::nextChunkSibling(NodePtr &ptr) const
+{
+  return followSiblingRef(0, ptr);
+}
+
+AccessResult AttributeValueTokenNode::followSiblingRef(unsigned long i, NodePtr &ptr) const
+{
+  // Do it like this to avoid possibility of overflow
+  if (i >= value_->nTokens() - tokenIndex_ - 1)
+    return accessNull;
+  if (canReuse(ptr)) {
+    AttributeValueTokenNode *node = (AttributeValueTokenNode *)this;
+    node->tokenIndex_ += size_t(i) + 1;
+  }
+  else
+    ptr.assign(makeAttributeValueTokenNode(grove(), value_, attIndex_,
+                                          tokenIndex_ + size_t(i) + 1));
+  return accessOK;
+}
+
+AccessResult AttributeValueTokenNode::firstSibling(NodePtr &ptr) const
+{
+  if (canReuse(ptr))
+    ((AttributeValueTokenNode *)this)->tokenIndex_ = 0;
+  else
+    ptr.assign(makeAttributeValueTokenNode(grove(), value_, attIndex_, 0));
+  return accessOK;
+}
+
+AccessResult AttributeValueTokenNode::siblingsIndex(unsigned long &i) const
+{
+  i = tokenIndex_;
+  return accessOK;
+}
+
+AccessResult AttributeValueTokenNode::getToken(GroveString &str) const
+{
+  const Char *ptr;
+  size_t len;
+  value_->token(tokenIndex_, ptr, len);
+  str.assign(ptr, len);
+  return accessOK;
+}
+
+AccessResult AttributeValueTokenNode::getEntity(NodePtr &ptr) const
+{
+   if (!attDefList()->def(attIndex_)->isEntity())
+    return accessNull;
+  StringC token(value_->token(tokenIndex_));
+  const Entity *entity = grove()->governingDtd()->lookupEntityTemp(0, token);
+  if (!entity) {
+    entity = grove()->lookupDefaultedEntity(token);
+    if (!entity)
+      return accessNull;
+  }
+  ptr.assign(new EntityNode(grove(), entity));
+  return accessOK;
+}
+
+AccessResult AttributeValueTokenNode::getNotation(NodePtr &ptr) const
+{
+  if (!attDefList()->def(attIndex_)->isNotation())
+    return accessNull;
+  StringC token(value_->token(tokenIndex_));
+  const Notation *notation = grove()->governingDtd()->lookupNotationTemp(token);
+  if (!notation)
+    return accessNull;
+  ptr.assign(new NotationNode(grove(), notation));
+  return accessOK;
+}
+
+AccessResult AttributeValueTokenNode::getReferent(NodePtr &ptr) const
+{
+  if (!attDefList()->def(attIndex_)->isIdref())
+    return accessNull;
+  StringC token(value_->token(tokenIndex_));
+  for (;;) {
+    Boolean complete = grove()->complete();
+    const ElementChunk *element = grove()->lookupElement(token);
+    if (element) {
+      ptr.assign(new ElementNode(grove(), element));
+      break;
+    }
+    if (complete)
+      return accessNull;
+    if (!grove()->waitForMoreNodes())
+      return accessTimeout;
+  }
+  return accessOK;
+}
+
+void AttributeValueTokenNode::accept(NodeVisitor &visitor)
+{
+  visitor.attributeValueToken(*this);
+}
+
+unsigned long AttributeValueTokenNode::hash() const
+{
+  return secondHash(secondHash((unsigned long)attributeOriginId() + attIndex_) + tokenIndex_);
+}
+
+bool AttributeValueTokenNode::same(const BaseNode &node) const
+{
+  return node.same2(this);
+}
+
+bool AttributeValueTokenNode::same2(const AttributeValueTokenNode *node) const
+{
+  return (attributeOriginId() == node->attributeOriginId()
+         && attIndex_ == node->attIndex_
+         && tokenIndex_ == node->tokenIndex_);
+}
+
+AccessResult AttributeValueTokenNode::getLocation(Location &loc) const
+{
+  const ConstPtr<Origin> *originP;
+  Index index;
+  if (!value_->tokenLocation(tokenIndex_, originP, index)
+      && originP->pointer()) {
+    loc = Location(new GroveImplProxyOrigin(grove(), originP->pointer()), index);
+    return accessOK;
+  }
+  return accessNull;
+}
+
+ElementAttributeValueTokenNode
+::ElementAttributeValueTokenNode(const GroveImpl *grove,
+                                const TokenizedAttributeValue *value,
+                                size_t attIndex,
+                                size_t tokenIndex,
+                                const ElementChunk *chunk)
+: AttributeValueTokenNode(grove, value, attIndex, tokenIndex),
+  ElementAttributeOrigin(chunk), AttributeDefOrigin(attIndex)
+{
+}
+
+EntityAttributeValueTokenNode
+::EntityAttributeValueTokenNode(const GroveImpl *grove,
+                               const TokenizedAttributeValue *value,
+                               size_t attIndex,
+                               size_t tokenIndex,
+                               const ExternalDataEntity *entity)
+: AttributeValueTokenNode(grove, value, attIndex, tokenIndex),
+  EntityAttributeOrigin(entity), AttributeDefOrigin(attIndex)
+{
+}
+
+ElementTypeAttributeValueTokenNode
+::ElementTypeAttributeValueTokenNode(const GroveImpl *grove,
+                                    const TokenizedAttributeValue *value,
+                                    size_t attIndex,
+                                    size_t tokenIndex,
+                                    const ElementType *elementType)
+: AttributeValueTokenNode(grove, value, attIndex, tokenIndex),
+  ElementTypeAttributeDefOrigin(elementType), AttributeDefOrigin(attIndex)
+{
+}
+
+NotationAttributeValueTokenNode
+::NotationAttributeValueTokenNode(const GroveImpl *grove,
+                                 const TokenizedAttributeValue *value,
+                                 size_t attIndex,
+                                 size_t tokenIndex,
+                                 const Notation *notation)
+: AttributeValueTokenNode(grove, value, attIndex, tokenIndex),
+  NotationAttributeDefOrigin(notation), AttributeDefOrigin(attIndex)
+{
+}
+
+EntityNode::EntityNode(const GroveImpl *grove, const Entity *entity)
+: EntityNodeBase(grove, entity)
+{
+}
+
+DefaultEntityNode::DefaultEntityNode(const GroveImpl *grove, const Entity *entity)
+: EntityNodeBase(grove, entity)
+{
+}
+
+AccessResult EntityNode::getOrigin(NodePtr &ptr) const
+{
+  if (entity_->defaulted() && grove()->lookupDefaultedEntity(entity_->name()))
+    ptr.assign(new SgmlDocumentNode(grove(), grove()->root()));
+  else
+    ptr.assign(new DocumentTypeNode(grove(), grove()->governingDtd()));
+  return accessOK;
+}
+
+AccessResult DefaultEntityNode::getOrigin(NodePtr &ptr) const
+{
+  ptr.assign(new DocumentTypeNode(grove(), grove()->governingDtd()));
+  return accessOK;
+}
+
+AccessResult EntityNode::getOriginToSubnodeRelPropertyName(ComponentName::Id &name) const
+{
+  if (entity_->defaulted() && grove()->lookupDefaultedEntity(entity_->name()))
+    name = ComponentName::idDefaultedEntities;
+  else
+    name = ComponentName::idGeneralEntities;
+  return accessOK;
+}
+
+AccessResult DefaultEntityNode::getOriginToSubnodeRelPropertyName(ComponentName::Id &name) const
+{
+  name = ComponentName::idDefaultEntity;
+  return accessOK;
+}
+
+AccessResult EntityNodeBase::getName(GroveString &str) const
+{
+  setString(str, entity_->name());
+  return accessOK;
+}
+
+AccessResult EntityNodeBase::getExternalId(NodePtr &ptr) const
+{
+  const ExternalEntity *x = entity_->asExternalEntity();
+  if (!x)
+    return accessNull;
+  ptr.assign(new EntityExternalIdNode(grove(), x));
+  return accessOK;
+}
+
+AccessResult EntityNodeBase::getNotation(NodePtr &ptr) const
+{
+  const ExternalDataEntity *x = entity_->asExternalDataEntity();
+  if (!x || !x->notation())
+    return accessNull;
+  ptr.assign(new NotationNode(grove(), x->notation()));
+  return accessOK;
+}
+
+AccessResult EntityNodeBase::getNotationName(GroveString &str) const
+{
+  const ExternalDataEntity *x = entity_->asExternalDataEntity();
+  if (!x || !x->notation())
+    return accessNull;
+  setString(str, x->notation()->name());
+  return accessOK;
+}
+
+AccessResult EntityNodeBase::getText(GroveString &str) const
+{
+  const InternalEntity *i = entity_->asInternalEntity();
+  if (!i)
+    return accessNull;
+  setString(str, i->string());
+  return accessOK;
+}
+
+AccessResult EntityNodeBase::getEntityType(Node::EntityType::Enum &entityType) const
+{
+  switch (entity_->dataType()) {
+  case EntityDecl::sgmlText:
+    entityType = EntityType::text;
+    break;
+  case EntityDecl::pi:
+    entityType = EntityType::pi;
+    break;
+  case EntityDecl::cdata:
+    entityType = EntityType::cdata;
+    break;
+  case EntityDecl::sdata:
+    entityType = EntityType::sdata;
+    break;
+  case EntityDecl::ndata:
+    entityType = EntityType::ndata;
+    break;
+  case EntityDecl::subdoc:
+    entityType = EntityType::subdocument;
+    break;
+  default:
+    CANNOT_HAPPEN();
+  }
+  return accessOK;
+}
+
+AccessResult EntityNode::getDefaulted(bool &dflted) const
+{
+  dflted = entity_->defaulted();
+  return accessOK;
+}
+
+AccessResult EntityNodeBase::getAttributes(NamedNodeListPtr &ptr) const
+{
+  const ExternalDataEntity *x = entity_->asExternalDataEntity();
+  if (!x)
+    return accessNull;
+  ptr.assign(new EntityAttributesNamedNodeList(grove(), x));
+  return accessOK;
+}
+
+AccessResult EntityNodeBase::attributeRef(unsigned long i, NodePtr &ptr) const
+{
+  const ExternalDataEntity *x = entity_->asExternalDataEntity();
+  if (!x || i >= x->attributes().size())
+    return accessNull;
+  ptr.assign(new EntityAttributeAsgnNode(grove(), size_t(i), x));
+  return accessOK;
+}
+
+AccessResult EntityNodeBase::getLocation(Location &loc) const
+{
+  return grove()->proxifyLocation(entity_->defLocation(), loc);
+}
+
+bool EntityNode::same(const BaseNode &node) const
+{
+  return node.same2(this);
+}
+
+bool DefaultEntityNode::same(const BaseNode &node) const
+{
+  return node.same2(this);
+}
+
+bool EntityNode::same2(const EntityNode *node) const
+{
+  return entity_ == node->entity_;
+}
+
+bool DefaultEntityNode::same2(const DefaultEntityNode *node) const
+{
+  return entity_ == node->entity_;
+}
+
+void EntityNode::accept(NodeVisitor &visitor)
+{
+  visitor.entity(*this);
+}
+
+void DefaultEntityNode::accept(NodeVisitor &visitor)
+{
+  visitor.defaultEntity(*this);
+}
+
+unsigned long EntityNodeBase::hash() const
+{
+  return (unsigned long)entity_;
+}
+
+EntityAttributeOrigin
+::EntityAttributeOrigin(const ExternalDataEntity *entity)
+: entity_(entity)
+{
+}
+
+const AttributeDefinitionList *
+EntityAttributeOrigin::attDefList() const
+{
+  return entity_->notation()->attributeDefTemp();
+}
+
+
+const AttributeValue *
+EntityAttributeOrigin::attributeValue(size_t attIndex, const GroveImpl &) const
+{
+  return entity_->attributes().value(attIndex);
+}
+
+AccessResult
+EntityAttributeOrigin::setNodePtrAttributeOrigin(NodePtr &ptr,
+                                                const BaseNode *node) const
+{
+  ptr.assign(new EntityNode(node->grove(), entity_));
+  return accessOK;
+}
+
+Node *EntityAttributeOrigin
+::makeCdataAttributeValueNode(const GroveImpl *grove,
+                             const AttributeValue *value,
+                             size_t attIndex,
+                             const TextIter &iter,
+                             size_t charIndex) const
+{
+  return new EntityCdataAttributeValueNode(grove, value, attIndex, iter,
+                                          charIndex, entity_);
+}
+
+
+Node *EntityAttributeOrigin
+::makeAttributeValueTokenNode(const GroveImpl *grove,
+                             const TokenizedAttributeValue *value,
+                             size_t attIndex,
+                             size_t tokenIndex) const
+{
+  return new EntityAttributeValueTokenNode(grove, value, attIndex,
+                                          tokenIndex, entity_);
+}
+
+Node *EntityAttributeOrigin
+::makeAttributeAsgnNode(const GroveImpl *grove,
+                       size_t attIndex) const
+{
+  return new EntityAttributeAsgnNode(grove, attIndex, entity_);
+}
+
+AccessResult EntityAttributeOrigin
+::makeAttributeDefNode(const GroveImpl *grove,
+                       NodePtr &ptr,
+                       size_t attributeDefIdx) const 
+{
+  if (entity_->notation() == 0)
+    return accessNull;  
+  ptr.assign(new NotationAttributeDefNode(grove,
+                                          *(entity_->notation()),
+                                          attributeDefIdx)); 
+  return accessOK;
+}
+
+Node *EntityAttributeOrigin::makeOriginNode(const GroveImpl *grove, size_t attIndex) const 
+{
+  return makeAttributeAsgnNode(grove, attIndex);
+}
+
+const void *EntityAttributeOrigin::attributeOriginId() const
+{
+  return entity_;
+}
+
+DoctypesAndLinktypesNamedNodeList
+::DoctypesAndLinktypesNamedNodeList(const GroveImpl *grove)
+: BaseNamedNodeList(grove, grove->generalSubstTable())
+{
+}
+
+NodeListPtr DoctypesAndLinktypesNamedNodeList::nodeList() const
+{
+  NodePtr tem(new DocumentTypeNode(grove(), grove()->governingDtd()));
+  return new SiblingNodeList(tem);
+}
+
+AccessResult
+DoctypesAndLinktypesNamedNodeList
+::namedNodeU(const StringC &str, NodePtr &ptr) const
+{
+  if (grove()->governingDtd()->name() != str)
+    return accessNull;
+  ptr.assign(new DocumentTypeNode(grove(), grove()->governingDtd()));
+  return accessOK;
+}
+
+GeneralEntitiesNamedNodeList
+::GeneralEntitiesNamedNodeList(const GroveImpl *grove, const Dtd *dtd)
+: BaseNamedNodeList(grove, grove->entitySubstTable()), dtd_(dtd)
+{
+}
+
+NodeListPtr GeneralEntitiesNamedNodeList::nodeList() const
+{
+  return new EntitiesNodeList(grove(),
+                             dtd_->generalEntityIter());
+}
+
+AccessResult
+GeneralEntitiesNamedNodeList::namedNodeU(const StringC &str, NodePtr &ptr) const
+{
+  const Entity *entity
+   = dtd_->lookupEntityTemp(0, str);
+  if (!entity)
+    return accessNull;
+  ptr.assign(new EntityNode(grove(), entity));
+  return accessOK;
+}
+
+ParameterEntitiesNamedNodeList
+::ParameterEntitiesNamedNodeList(const GroveImpl *grove, const Dtd *dtd)
+: BaseNamedNodeList(grove, grove->entitySubstTable()), dtd_(dtd)
+{
+}
+
+NodeListPtr ParameterEntitiesNamedNodeList::nodeList() const
+{
+  return new EntitiesNodeList(grove(),
+                             dtd_->parameterEntityIter());
+}
+
+AccessResult
+ParameterEntitiesNamedNodeList::namedNodeU(const StringC &str, NodePtr &ptr) const
+{
+  const Entity *entity
+   = dtd_->lookupEntityTemp(1, str);
+  if (!entity)
+    return accessNull;
+  ptr.assign(new EntityNode(grove(), entity));
+  return accessOK;
+}
+
+AccessResult
+DefaultedEntitiesNamedNodeList::namedNodeU(const StringC &str, NodePtr &ptr) const
+{
+  const Entity *entity
+   = grove()->lookupDefaultedEntity(str);
+  if (!entity)
+    return accessNull;
+  ptr.assign(new EntityNode(grove(), entity));
+  return accessOK;
+}
+
+NodeListPtr
+DefaultedEntitiesNamedNodeList::nodeList() const
+{
+  return new EntitiesNodeList(grove(), grove()->defaultedEntityIter());
+}
+
+NodeListPtr DocEntitiesNamedNodeList::nodeList() const
+{
+  return new DocEntitiesNodeList(grove());
+}
+
+AccessResult
+DocEntitiesNamedNodeList::namedNodeU(const StringC &str, NodePtr &ptr) const
+{
+  const Entity *entity
+   = grove()->governingDtd()->lookupEntityTemp(0, str);
+  // How I hate the default entity.
+  while (!entity) {
+    if (!grove()->hasDefaultEntity())
+      return accessNull;
+    // Make sure that the value of complete
+    // we look at is that before we looked up
+    // the entity.
+    Boolean complete = grove()->complete();
+    entity = grove()->lookupDefaultedEntity(str);
+    if (entity)
+      break;
+    if (complete)
+      return accessNull;
+    if (!grove()->waitForMoreNodes())
+      return accessTimeout;
+  }
+  ptr.assign(new EntityNode(grove(), entity));
+  return accessOK;
+}
+
+AccessResult
+ElementsNamedNodeList::namedNodeU(const StringC &str, NodePtr &ptr) const
+{
+  for (;;) {
+    Boolean complete = grove()->complete();
+    const ElementChunk *element = grove()->lookupElement(str);
+    if (element) {
+      ptr.assign(new ElementNode(grove(), element));
+      break;
+    }
+    if (complete)
+      return accessNull;
+    if (!grove()->waitForMoreNodes())
+      return accessTimeout;
+  }
+  return accessOK;
+}
+
+NodeListPtr ElementsNamedNodeList::nodeList() const
+{
+  return new ElementsNodeList(grove(), grove()->root()->documentElement);
+}
+
+ElementsNodeList::ElementsNodeList(const GroveImpl *grove,
+                                  const Chunk *first)
+: grove_(grove), first_(first)
+{
+}
+
+AccessResult ElementsNodeList::first(NodePtr &ptr) const
+{
+  const Chunk *p = first_;
+  while (p) {
+    while (p == grove_->completeLimit()) {
+      if (!grove_->waitForMoreNodes())
+       return accessTimeout;
+    }
+    if (p->id()) {
+      ((ElementsNodeList *)this)->first_ = p;
+      ptr.assign(new ElementNode(grove_, (const ElementChunk *)p));
+      return accessOK;
+    }
+    p = p->after();
+  }
+  return accessNull;
+}
+
+AccessResult ElementsNodeList::chunkRest(NodeListPtr &ptr) const
+{
+  const Chunk *p = first_;
+  while (p) {
+    while (p == grove_->completeLimit()) {
+      if (!grove_->waitForMoreNodes())
+       return accessTimeout;
+    }
+    if (p->id()) {
+      if (canReuse(ptr))
+       ((ElementsNodeList *)this)->first_ = p->after();
+      else
+       ptr.assign(new ElementsNodeList(grove_, p->after()));
+      return accessOK;
+    }
+    p = p->after();
+ }
+ return accessNull;
+}
+
+// iter.next() gives first member of list that this represents
+
+EntitiesNodeList::EntitiesNodeList(const GroveImpl *grove,
+                                  const Dtd::ConstEntityIter &iter)
+: grove_(grove), iter_(iter)
+{
+}
+
+AccessResult EntitiesNodeList::first(NodePtr &ptr) const
+{
+  Dtd::ConstEntityIter tem(iter_);
+  const Entity *entity = tem.nextTemp();
+  if (!entity)
+    return accessNull;
+  ptr.assign(new EntityNode(grove_, entity));
+  return accessOK;
+}
+
+AccessResult EntitiesNodeList::chunkRest(NodeListPtr &ptr) const
+{
+  if (canReuse(ptr)) {
+    EntitiesNodeList *list = (EntitiesNodeList *)this;
+    if (list->iter_.nextTemp() == 0)
+      return accessNull;
+    return accessOK;
+  }
+  Dtd::ConstEntityIter tem(iter_);
+  if (tem.nextTemp() == 0)
+    return accessNull;
+  ptr.assign(new EntitiesNodeList(grove_, tem));
+  return accessOK;
+}
+
+DocEntitiesNodeList::DocEntitiesNodeList(const GroveImpl *grove)
+: EntitiesNodeList(grove, grove->governingDtd()->generalEntityIter())
+{
+}
+
+AccessResult DocEntitiesNodeList::first(NodePtr &ptr) const
+{
+  AccessResult ret = EntitiesNodeList::first(ptr);
+  if (ret != accessNull || !grove()->hasDefaultEntity())
+    return ret;
+  while (!grove()->complete())
+    if (!grove()->waitForMoreNodes())
+      return accessTimeout;
+  Dtd::ConstEntityIter tem(grove()->defaultedEntityIter());
+  const Entity *entity = tem.nextTemp();
+  if (!entity)
+    return accessNull;
+  ptr.assign(new EntityNode(grove(), entity));
+  return accessOK;
+}
+
+AccessResult DocEntitiesNodeList::chunkRest(NodeListPtr &ptr) const
+{
+  AccessResult ret = EntitiesNodeList::chunkRest(ptr);
+  if (ret != accessNull || !grove()->hasDefaultEntity())
+    return ret;
+  while (!grove()->complete())
+    if (!grove()->waitForMoreNodes())
+      return accessTimeout;
+  Dtd::ConstEntityIter tem(grove()->defaultedEntityIter());
+  const Entity *entity = tem.nextTemp();
+  if (!entity)
+    return accessNull;
+  ptr.assign(new EntitiesNodeList(grove(), tem));
+  return accessOK;
+}
+
+NotationsNamedNodeList
+::NotationsNamedNodeList(const GroveImpl *grove, const Dtd *dtd)
+: BaseNamedNodeList(grove, grove->generalSubstTable()), dtd_(dtd)
+{
+}
+
+NodeListPtr NotationsNamedNodeList::nodeList() const
+{
+  return new NotationsNodeList(grove(),
+                              dtd_->notationIter());
+}
+
+AccessResult
+NotationsNamedNodeList::namedNodeU(const StringC &str, NodePtr &ptr) const
+{
+  const Notation *notation
+   = dtd_->lookupNotationTemp(str);
+  if (!notation)
+    return accessNull;
+  ptr.assign(new NotationNode(grove(), notation));
+  return accessOK;
+}
+
+
+// iter.next() gives first member of list that this represents
+
+NotationsNodeList::NotationsNodeList(const GroveImpl *grove,
+                                    const Dtd::ConstNotationIter &iter)
+: grove_(grove), iter_(iter)
+{
+}
+
+AccessResult NotationsNodeList::first(NodePtr &ptr) const
+{
+  Dtd::ConstNotationIter tem(iter_);
+  const Notation *notation = tem.nextTemp();
+  if (!notation)
+    return accessNull;
+  ptr.assign(new NotationNode(grove_, notation));
+  return accessOK;
+}
+
+AccessResult NotationsNodeList::chunkRest(NodeListPtr &ptr) const
+{
+  if (canReuse(ptr)) {
+    NotationsNodeList *list = (NotationsNodeList *)this;
+    if (list->iter_.next().isNull())
+      return accessNull;
+    return accessOK;
+  }
+  Dtd::ConstNotationIter tem(iter_);
+  if (tem.nextTemp() == 0)
+    return accessNull;
+  ptr.assign(new NotationsNodeList(grove_, tem));
+  return accessOK;
+}
+
+NotationNode::NotationNode(const GroveImpl *grove,
+                          const Notation *notation)
+: BaseNode(grove), notation_(notation)
+{
+}
+
+AccessResult NotationNode::getOrigin(NodePtr &ptr) const
+{
+  ptr.assign(new DocumentTypeNode(grove(), grove()->governingDtd()));
+  return accessOK;
+}
+
+AccessResult NotationNode::getName(GroveString &str) const
+{
+  setString(str, notation_->name());
+  return accessOK;
+}
+
+AccessResult NotationNode::getExternalId(NodePtr &ptr) const
+{
+  ptr.assign(new NotationExternalIdNode(grove(), notation_));
+  return accessOK;
+}
+
+AccessResult NotationNode::getAttributeDefs(NamedNodeListPtr &ptr) const
+{
+  ptr.assign(new NotationAttributeDefsNamedNodeList(grove(), *notation_));
+  return accessOK;
+}
+
+AccessResult NotationNode::getLocation(Location &loc) const
+{
+  return grove()->proxifyLocation(notation_->defLocation(), loc);
+}
+
+bool NotationNode::same(const BaseNode &node) const
+{
+  return node.same2(this);
+}
+
+bool NotationNode::same2(const NotationNode *node) const
+{
+  return notation_ == node->notation_;
+}
+
+void NotationNode::accept(NodeVisitor &visitor)
+{
+  visitor.notation(*this);
+}
+
+unsigned long NotationNode::hash() const
+{
+  return (unsigned long)notation_;
+}
+
+ExternalIdNode::ExternalIdNode(const GroveImpl *grove)
+: BaseNode(grove)
+{
+}
+
+AccessResult ExternalIdNode::getPublicId(GroveString &str) const
+{
+  const StringC *s = externalId().publicIdString();
+  if (!s)
+    return accessNull;
+  setString(str, *s);
+  return accessOK;
+}
+
+AccessResult ExternalIdNode::getSystemId(GroveString &str) const
+{
+  const StringC *s = externalId().systemIdString();
+  if (!s)
+    return accessNull;
+  setString(str, *s);
+  return accessOK;
+}
+
+AccessResult ExternalIdNode::getGeneratedSystemId(GroveString &str) const
+{
+  const StringC &s = externalId().effectiveSystemId();
+  if (!s.size())
+    return accessNull;
+  setString(str, s);
+  return accessOK;
+}
+
+void ExternalIdNode::accept(NodeVisitor &visitor)
+{
+  visitor.externalId(*this);
+}
+
+bool ExternalIdNode::same(const BaseNode &node) const
+{
+  return node.same2(this);
+}
+
+bool ExternalIdNode::same2(const ExternalIdNode *node) const
+{
+  return &externalId() == &node->externalId();
+}
+
+EntityExternalIdNode::EntityExternalIdNode(const GroveImpl *grove,
+                                          const ExternalEntity *entity)
+: ExternalIdNode(grove), entity_(entity)
+{
+}
+
+const ExternalId &EntityExternalIdNode::externalId() const
+{
+  return entity_->externalId();
+}
+
+AccessResult EntityExternalIdNode::getOrigin(NodePtr &ptr) const
+{
+  ptr.assign(new EntityNode(grove(), entity_));
+  return accessOK;
+}
+
+unsigned long EntityExternalIdNode::hash() const
+{
+  return secondHash((unsigned long)entity_);
+}
+
+NotationExternalIdNode::NotationExternalIdNode(const GroveImpl *grove,
+                                              const Notation *notation)
+: ExternalIdNode(grove), notation_(notation)
+{
+}
+
+const ExternalId &NotationExternalIdNode::externalId() const
+{
+  return notation_->externalId();
+}
+
+AccessResult NotationExternalIdNode::getOrigin(NodePtr &ptr) const
+{
+  ptr.assign(new NotationNode(grove(), notation_));
+  return accessOK;
+}
+
+unsigned long NotationExternalIdNode::hash() const
+{
+  return secondHash((unsigned long)notation_);
+}
+
+AccessResult ChunkNode::getParent(NodePtr &ptr) const
+{
+  if (!chunk_->origin)
+    return accessNull;
+  // This is needed because PiNodes in the prolog and
+  // epilog don't have a parent but do have an origin.
+  // Also for the document element.
+  if ((const Chunk *)chunk()->origin == grove()->root())
+    return accessNull;
+  chunk_->origin->setNodePtrFirst(ptr, this);
+  return accessOK;
+}
+
+AccessResult ChunkNode::getTreeRoot(NodePtr &ptr) const
+{
+  if (chunk()->origin
+      && (const Chunk *)chunk()->origin != grove()->root()
+      // With invalid documents we might have elements in the epilog
+      && !grove()->root()->epilog
+      && grove()->root()->documentElement)
+    return grove()->root()->documentElement->setNodePtrFirst(ptr, this);
+  return Node::getTreeRoot(ptr);
+}
+
+AccessResult ChunkNode::getOrigin(NodePtr &ptr) const
+{
+  if (!chunk_->origin)
+    return accessNull;
+  chunk_->origin->setNodePtrFirst(ptr, this);
+  return accessOK;
+}
+
+AccessResult ChunkNode::getOriginToSubnodeRelPropertyName(ComponentName::Id &name) const
+{
+  if ((const Chunk *)chunk()->origin != grove()->root())
+    name = ComponentName::idContent;
+  else if ((const Chunk *)chunk() == grove()->root()->documentElement)
+    name = ComponentName::idDocumentElement;
+  else {
+    const Chunk *tem;
+    if (chunk()->getFirstSibling(grove(), tem) == accessOK && tem == grove()->root()->prolog)
+      name = ComponentName::idProlog;
+    else
+      name = ComponentName::idEpilog;
+  }
+  return accessOK;
+}
+
+unsigned long ChunkNode::hash() const
+{
+  return (unsigned long)chunk_;
+}
+
+bool ChunkNode::same(const BaseNode &node) const
+{
+  return node.same2(this);
+}
+
+bool ChunkNode::same2(const ChunkNode *node) const
+{
+  return chunk_ == node->chunk_;
+}
+
+BaseNode::~BaseNode()
+{
+}
+
+void BaseNode::addRef()
+{
+  ++refCount_;
+}
+
+void BaseNode::release()
+{
+  ASSERT(refCount_ != 0);
+  if (--refCount_ == 0)
+    delete this;
+}
+
+unsigned BaseNode::groveIndex() const
+{
+  return grove_->groveIndex();
+}
+
+bool BaseNode::operator==(const Node &node) const
+{
+  if (!sameGrove(node))
+    return 0;
+  return same((const BaseNode &)node);
+}
+
+bool BaseNode::chunkContains(const Node &node) const
+{
+  if (!sameGrove(node))
+    return 0;
+  return same((const BaseNode &)node);
+}
+
+bool BaseNode::inChunk(const DataNode *) const
+{
+  return 0;
+}
+
+bool BaseNode::inChunk(const CdataAttributeValueNode *) const
+{
+  return 0;
+}
+
+bool BaseNode::same2(const ChunkNode *) const
+{
+  return 0;
+}
+
+bool BaseNode::same2(const DataNode *) const
+{
+  return 0;
+}
+
+bool BaseNode::same2(const AttributeAsgnNode *) const
+{
+  return 0;
+}
+
+bool BaseNode::same2(const AttributeValueTokenNode *) const
+{
+  return 0;
+}
+
+bool BaseNode::same2(const CdataAttributeValueNode *) const
+{
+  return 0;
+}
+
+bool BaseNode::same2(const EntityNode *) const
+{
+  return 0;
+}
+
+bool BaseNode::same2(const NotationNode *) const
+{
+  return 0;
+}
+
+bool BaseNode::same2(const ExternalIdNode *) const
+{
+  return 0;
+}
+
+bool BaseNode::same2(const DocumentTypeNode *) const
+{
+  return 0;
+}
+
+bool BaseNode::same2(const SgmlConstantsNode *) const
+{
+  return 0;
+}
+
+bool BaseNode::same2(const MessageNode *) const
+{
+  return 0;
+}
+
+bool BaseNode::same2(const ElementTypeNode *) const
+{
+  return 0;
+}
+
+bool BaseNode::same2(const ModelGroupNode *) const
+{
+  return 0;
+}
+
+bool BaseNode::same2(const ElementTokenNode *) const
+{
+  return 0;
+}
+
+bool BaseNode::same2(const PcdataTokenNode *) const
+{
+  return 0;
+}
+
+bool BaseNode::same2(const AttributeDefNode *) const
+{
+  return 0;
+}
+
+bool BaseNode::same2(const DefaultEntityNode *) const
+{
+  return 0;
+}
+
+AccessResult BaseNode::nextSibling(NodePtr &ptr) const
+{
+  return nextChunkSibling(ptr);
+}
+
+AccessResult BaseNode::follow(NodeListPtr &ptr) const
+{
+  NodePtr nd;
+  AccessResult ret = nextSibling(nd);
+  switch (ret) {
+  case accessOK:
+    ptr.assign(new SiblingNodeList(nd));
+    break;
+  case accessNull:
+    ptr.assign(new BaseNodeList);
+    ret = accessOK;
+    break;
+  default:
+    break;
+  }
+  return ret;
+}
+
+AccessResult BaseNode::children(NodeListPtr &ptr) const
+{
+  NodePtr head;
+  AccessResult ret = firstChild(head);
+  switch (ret) {
+  case accessOK:
+    ptr.assign(new SiblingNodeList(head));
+    break;
+  case accessNull:
+    ptr.assign(new BaseNodeList);
+    ret = accessOK;
+    break;
+  default:
+    break;
+  }
+  return ret;
+}
+
+AccessResult BaseNode::getOrigin(NodePtr &ptr) const
+{
+  return getParent(ptr);
+}
+
+AccessResult BaseNode::getGroveRoot(NodePtr &ptr) const
+{
+  ptr.assign(new SgmlDocumentNode(grove(), grove()->root()));
+  return accessOK;
+}
+
+AccessResult BaseNode::getLocation(Location &) const
+{
+  return accessNull;
+}
+
+bool BaseNode::queryInterface(IID iid, const void *&p) const
+{
+  if (iid == LocNode::iid) {
+    const LocNode *ip = this;
+    p = ip;
+    return 1;
+  }
+  return 0;
+}
+
+AccessResult
+ForwardingChunk::setNodePtrFirst(NodePtr &ptr, const BaseNode *node) const
+{
+  if (forwardTo == 0)
+    return accessNull;
+  ASSERT(origin == forwardTo->origin);
+  return forwardTo->setNodePtrFirst(ptr, node);
+}
+
+AccessResult
+ForwardingChunk::getFollowing(const GroveImpl *grove,
+                              const Chunk *&p, unsigned long &nNodes)
+    const
+{
+  AccessResult ret = Chunk::getFollowing(grove, p, nNodes);
+  if (ret == accessOK)
+    nNodes = 0;
+  return ret;
+}
+
+AccessResult
+LocOriginChunk::getFollowing(const GroveImpl *grove,
+                             const Chunk *&p, unsigned long &nNodes)
+    const
+{
+  AccessResult ret = Chunk::getFollowing(grove, p, nNodes);
+  if (ret == accessOK)
+    nNodes = 0;
+  return ret;
+}
+
+AccessResult LocOriginChunk::setNodePtrFirst(NodePtr &ptr, const BaseNode *node) const
+{
+  return ((const Chunk *)(this + 1))->setNodePtrFirst(ptr, node);
+}
+
+AccessResult LocOriginChunk::setNodePtrFirst(NodePtr &ptr, const ElementNode *node) const
+{
+  return ((const Chunk *)(this + 1))->setNodePtrFirst(ptr, node);
+}
+
+AccessResult LocOriginChunk::setNodePtrFirst(NodePtr &ptr, const DataNode *node) const
+{
+  return ((const Chunk *)(this + 1))->setNodePtrFirst(ptr, node);
+}
+
+const Chunk *LocOriginChunk::after() const
+{
+  return this + 1;
+}
+
+Boolean LocOriginChunk::getLocOrigin(const Origin *&ret) const
+{
+  ret = locOrigin;
+  return 1;
+}
+
+AccessResult
+Chunk::setNodePtrFirst(NodePtr &ptr, const ElementNode *node) const
+{
+  return setNodePtrFirst(ptr, (const BaseNode *)node);
+}
+
+AccessResult
+Chunk::setNodePtrFirst(NodePtr &ptr, const DataNode *node) const
+{
+  return setNodePtrFirst(ptr, (const BaseNode *)node);
+}
+
+const StringC *Chunk::id() const
+{
+  return 0;
+}
+
+AccessResult Chunk::getFollowing(const GroveImpl *grove,
+                                const Chunk *&f, unsigned long &n) const
+{
+  const Chunk *p = after();
+  while (p == grove->completeLimit())
+    if (!grove->waitForMoreNodes())
+      return accessTimeout;
+  if (p->origin != origin)
+    return accessNull;
+  n = 1;
+  f = p;
+  return accessOK;
+}
+
+AccessResult Chunk::getFirstSibling(const GroveImpl *grove,
+                                   const Chunk *&p) const
+{
+  if ((const Chunk *)origin == grove->root())
+    return accessNotInClass;
+  p = origin->after();
+  return accessOK;
+}
+
+Boolean Chunk::getLocOrigin(const Origin *&) const
+{
+  return 0;
+}
+
+// ------------------------------ dev --------------------------------
+
+// -- CLASS IMP: ElementTypeNode
+
+AccessResult ElementTypeNode::getOrigin(NodePtr &ptr) const
+{
+  ptr.assign(new DocumentTypeNode(grove(), grove()->governingDtd()));
+  return accessOK;
+}
+
+AccessResult ElementTypeNode::getLocation(Location &loc) const
+{
+  const ElementDefinition *def = elementType_.definition();
+  if (def == 0)
+    return accessNull;
+  return grove()->proxifyLocation(def->location(), loc);
+}
+
+AccessResult ElementTypeNode::getGi(GroveString &str) const
+{
+  setString(str, elementType_.name());
+  return accessOK;
+}
+
+AccessResult ElementTypeNode::getModelGroup(NodePtr &ptr) const
+{
+  const ElementDefinition *def = elementType_.definition();
+  if (def == 0 || def->declaredContent() != ElementDefinition::modelGroup)
+    return accessNull;
+  ptr.assign(new ModelGroupNode(grove(),
+                                elementType_, 
+                                *(def->compiledModelGroup()->modelGroup())));  
+  return accessOK;
+}
+
+AccessResult ElementTypeNode::getContentType(Node::ContentType::Enum &enumId) const
+{
+  const ElementDefinition *def = elementType_.definition();
+  if (def == 0)
+    return accessNull;
+  switch (def->declaredContent() ) {
+    case ElementDefinition::modelGroup:
+      enumId = ContentType::modelgrp;
+      break;
+    case ElementDefinition::any:
+      enumId = ContentType::any;
+      break;
+    case ElementDefinition::cdata:
+      enumId = ContentType::cdata;
+      break;
+    case ElementDefinition::rcdata:
+      enumId = ContentType::rcdata;
+      break;
+    case ElementDefinition::empty:
+      enumId = ContentType::empty;
+      break;
+    default:
+      CANNOT_HAPPEN();
+  }
+  return accessOK;
+}
+
+AccessResult ElementTypeNode::getExclusions(GroveStringListPtr &sl) const
+{
+  const ElementDefinition *def = elementType_.definition();
+  if (def == 0
+      || (def->declaredContent() != ElementDefinition::modelGroup
+          && def->declaredContent() != ElementDefinition::any))
+    return accessNull;
+  sl.assign(new GroveStringList);
+  GroveString str;
+  for (size_t i = 0; i < def->nExclusions(); i++ ) {
+    setString(str, def->exclusion(i)->name());
+    sl->append(str);
+  }
+  return accessOK;
+}
+
+AccessResult ElementTypeNode::getInclusions(GroveStringListPtr &sl) const
+{
+  const ElementDefinition *def = elementType_.definition();
+  if (def == 0
+      || (def->declaredContent() != ElementDefinition::modelGroup
+          && def->declaredContent() != ElementDefinition::any))
+    return accessNull;
+  sl.assign(new GroveStringList);
+  GroveString str;
+  for (size_t i = 0; i < def->nInclusions(); i++ ) {
+    setString(str, def->inclusion(i)->name());
+    sl->append(str);
+  }
+  return accessOK;
+}
+
+AccessResult ElementTypeNode::getOmitEndTag(bool &f) const
+{
+  const ElementDefinition *def = elementType_.definition();
+  if (def == 0 || !def->omittedTagSpec())
+    return accessNull;
+  f = def->canOmitEndTag();
+  return accessOK;
+}
+
+AccessResult ElementTypeNode::getOmitStartTag(bool &f) const
+{
+  const ElementDefinition *def = elementType_.definition();
+  if (def == 0  || !def->omittedTagSpec())
+    return accessNull;
+  f = def->canOmitStartTag();
+  return accessOK;
+}
+
+AccessResult ElementTypeNode::getAttributeDefs(NamedNodeListPtr &ptr) const
+{
+  ptr.assign(new ElementTypeAttributeDefsNamedNodeList(grove(), elementType_));
+  return accessOK;
+}
+
+bool ElementTypeNode::same(const BaseNode &node) const
+{
+  return node.same2(this);
+}
+
+bool ElementTypeNode::same2(const ElementTypeNode *node) const
+{
+  return &elementType_ == &(node->elementType());
+}
+
+void ElementTypeNode::accept(NodeVisitor &visitor)
+{
+  visitor.elementType(*this);
+}
+
+unsigned long ElementTypeNode::hash() const
+{
+  return (unsigned long)&elementType_;
+}
+
+// -- CLASS IMP: ElementTypesNodeList
+
+ElementTypesNodeList::ElementTypesNodeList( const GroveImpl *grove,
+                                           const Dtd::ConstElementTypeIter &iter )
+ : grove_(grove), iter_(iter)
+{
+}
+
+AccessResult ElementTypesNodeList::first(NodePtr &ptr) const
+{
+  Dtd::ConstElementTypeIter tem(iter_);
+  const ElementType *elementType = tem.next();
+  if (!elementType)
+    return accessNull;
+  ptr.assign(new ElementTypeNode(grove_, *elementType));
+  return accessOK;
+}
+
+AccessResult ElementTypesNodeList::chunkRest(NodeListPtr &ptr) const
+{
+  if (canReuse(ptr)) {
+    ElementTypesNodeList *list = (ElementTypesNodeList *)this;
+    if (list->iter_.next() == 0)
+      return accessNull;
+    return accessOK;
+  }
+  Dtd::ConstElementTypeIter tem(iter_);
+  if (tem.next() == 0)
+    return accessNull;
+  ptr.assign(new ElementTypesNodeList(grove_, tem));
+  return accessOK;
+}
+
+// -- CLASS IMP: ElementTypesNamedNodeList
+
+ElementTypesNamedNodeList::ElementTypesNamedNodeList(const GroveImpl *grove, const Dtd *dtd)
+ : BaseNamedNodeList( grove, grove->generalSubstTable() ), dtd_(dtd)
+{
+}
+
+NodeListPtr ElementTypesNamedNodeList::nodeList() const
+{
+  return new ElementTypesNodeList(grove(), dtd_->elementTypeIter());
+}
+
+AccessResult ElementTypesNamedNodeList::namedNodeU(const StringC &str, NodePtr &ptr) const
+{
+  const ElementType *elementType = dtd_->lookupElementType(str); // ? Temp
+  if (!elementType)
+    return accessNull;
+  ptr.assign(new ElementTypeNode(grove(), *elementType));
+  return accessOK;
+}
+
+// -- CLASS IMP: ContentTokenNodeBase
+
+ContentTokenNodeBase::ContentTokenNodeBase(const GroveImpl *grove,
+                                           const ElementType &elementType,
+                                           ModelGroupNode *parentModelGroupNode)
+ : BaseNode(grove), elementType_(elementType), parentModelGroupNode_(parentModelGroupNode)
+{
+  if (parentModelGroupNode_ != 0)
+    parentModelGroupNode_->addRef();
+}
+
+ContentTokenNodeBase::~ContentTokenNodeBase()
+{
+  if (parentModelGroupNode_ != 0)
+    parentModelGroupNode_->release();
+}
+
+AccessResult ContentTokenNodeBase::getOrigin(NodePtr &ptr) const
+{
+  if (parentModelGroupNode_ != 0)
+    ptr.assign(parentModelGroupNode_);
+  else
+    ptr.assign(new ElementTypeNode(grove(), elementType_));
+  return accessOK;
+}
+
+AccessResult ContentTokenNodeBase::getLocation(Location &loc) const
+{
+  const ElementDefinition *def = elementType_.definition();
+  if (def == 0)
+    return accessNull;
+  return grove()->proxifyLocation(def->location(), loc);
+}
+
+// -- CLASS IMP: ElementTokenNode
+
+AccessResult ElementTokenNode::getGi(GroveString &str) const
+{
+  assert(elementToken_.elementType() != 0);
+  setString(str, elementToken_.elementType()->name());
+  return accessOK;
+}
+
+AccessResult ElementTokenNode::getOccurIndicator(Node::OccurIndicator::Enum &occur) const
+{
+  switch (elementToken_.occurrenceIndicator())
+  {
+    case ContentToken::opt:
+      occur = OccurIndicator::opt;
+      break;      
+    case ContentToken::plus:
+      occur = OccurIndicator::plus;
+      break;
+    case ContentToken::rep:
+      occur = OccurIndicator::rep;
+      break;
+    case ContentToken::none:
+      return accessNull;
+    default:
+      CANNOT_HAPPEN();
+  }
+  return accessOK;
+}
+
+bool ElementTokenNode::same(const BaseNode &node) const
+{
+  return node.same2(this);
+}
+
+bool ElementTokenNode::same2(const ElementTokenNode *node) const
+{
+  return &elementToken_ == &(node->elementToken());
+}
+
+void ElementTokenNode::accept(NodeVisitor &visitor)
+{
+  visitor.elementToken(*this);
+}
+
+unsigned long ElementTokenNode::hash() const
+{
+  return (unsigned long)&elementToken_;
+}
+
+// -- CLASS IMP: PcdataTokenNode
+
+bool PcdataTokenNode::same(const BaseNode &node) const
+{
+  return node.same2(this);
+}
+
+bool PcdataTokenNode::same2(const PcdataTokenNode *node) const
+{
+  return &pcdataToken_ == &(node->pcdataToken());
+}
+
+void PcdataTokenNode::accept(NodeVisitor &visitor)
+{
+  visitor.pcdataToken(*this);
+}
+
+unsigned long PcdataTokenNode::hash() const
+{
+  return (unsigned long)&pcdataToken_;
+}
+
+// -- CLASS IMP: ModelGroupNode
+
+AccessResult ModelGroupNode::getOriginToSubnodeRelPropertyName(ComponentName::Id &name) const
+{
+  name = parentModelGroupNode_ == 0
+          ? ComponentName::idModelGroup
+          : ComponentName::idContentTokens;
+  return accessOK;
+}
+
+AccessResult ModelGroupNode::getConnector(Node::Connector::Enum &conn) const
+{
+  switch (modelGroup_.connector())
+  {
+    case ModelGroup::andConnector:
+      conn = Connector::and_;
+      break;      
+    case ModelGroup::orConnector:
+      conn = Connector::or_;
+      break;
+    case ModelGroup::seqConnector:
+      conn = Connector::seq;
+      break;
+    default:
+      CANNOT_HAPPEN();
+  }
+  return accessOK;
+}
+
+AccessResult ModelGroupNode::getOccurIndicator(Node::OccurIndicator::Enum &occur) const
+{
+  switch (modelGroup_.occurrenceIndicator()) {
+    case ContentToken::opt:
+      occur = OccurIndicator::opt;
+      break;      
+    case ContentToken::plus:
+      occur = OccurIndicator::plus;
+      break;
+    case ContentToken::rep:
+      occur = OccurIndicator::rep;
+      break;
+    case ContentToken::none:
+      return accessNull;
+    default:
+      CANNOT_HAPPEN();
+  }
+  return accessOK;
+}
+
+AccessResult ModelGroupNode::getContentTokens(NodeListPtr &ptr) const
+{
+  ptr.assign(new ContentTokenNodeList(grove(), *(ModelGroupNode *)this));
+  return accessOK;
+}
+
+void ModelGroupNode::makeNode(NodePtr &ptr, unsigned contentTokenIdx)
+{
+  assert( contentTokenIdx < modelGroup_.nMembers());
+  const ContentToken &contentToken = modelGroup_.member(contentTokenIdx);
+  const ModelGroup *asModelGroup = contentToken.asModelGroup();
+  if (asModelGroup != 0)
+    ptr.assign(new ModelGroupNode(grove(),
+                                  elementType_,
+                                  *asModelGroup,
+                                  this));
+  else
+  {
+    const LeafContentToken *asLeafContentToken = contentToken.asLeafContentToken();
+    if (asLeafContentToken != 0)
+      if (asLeafContentToken->elementType() != 0)
+        ptr.assign(new ElementTokenNode(grove(),
+                                        elementType_,
+                                        *(const ElementToken*)asLeafContentToken,
+                                        this));
+      else if (asLeafContentToken->occurrenceIndicator() == ContentToken::rep)
+        ptr.assign(new PcdataTokenNode(grove(),
+                                       elementType_,
+                                       *(const PcdataToken*)asLeafContentToken,
+                                       this));
+      else
+        CANNOT_HAPPEN();
+  }
+}
+
+bool ModelGroupNode::same(const BaseNode &node) const
+{
+  return node.same2(this);
+}
+
+bool ModelGroupNode::same2(const ModelGroupNode *node) const
+{
+  return &modelGroup_ == &(node->modelGroup());
+}
+
+void ModelGroupNode::accept(NodeVisitor &visitor)
+{
+  visitor.modelGroup(*this);
+}
+
+unsigned long ModelGroupNode::hash() const
+{
+  return (unsigned long)&modelGroup_;
+}
+
+// -- CLASS IMP: ContentTokenNodeList
+
+ContentTokenNodeList::ContentTokenNodeList(const GroveImpl *grove,
+                                          ModelGroupNode &modelGroupNode,
+                                           unsigned firstTokenIdx)
+ : grove_(grove), modelGroupNode_(modelGroupNode), firstTokenIdx_(firstTokenIdx)
+{
+}
+
+AccessResult ContentTokenNodeList::next()
+{
+  if (++firstTokenIdx_ >= modelGroupNode_.modelGroup().nMembers())
+    return accessNull;
+  return accessOK;
+}
+
+AccessResult ContentTokenNodeList::first(NodePtr &ptr) const
+{
+  if (firstTokenIdx_ < modelGroupNode_.modelGroup().nMembers()) 
+    modelGroupNode_.makeNode(ptr, firstTokenIdx_);
+  else
+    return accessNull;
+  return accessOK;
+}
+
+AccessResult ContentTokenNodeList::chunkRest(NodeListPtr &ptr) const
+{
+  if (canReuse(ptr)) {
+    ContentTokenNodeList *list = (ContentTokenNodeList *)this;
+    return list->next();
+  }
+  unsigned firstTokenIdx = firstTokenIdx_;
+  if (++firstTokenIdx >= modelGroupNode_.modelGroup().nMembers())
+    return accessNull;
+  ptr.assign(new ContentTokenNodeList(grove_, modelGroupNode_, firstTokenIdx));
+  return accessOK;
+}
+
+// class IMP: AttributeDefOrigin
+
+AccessResult
+AttributeDefOrigin::makeAttributeValueNode(const GroveImpl *grove,
+                                           NodePtr &ptr,
+                                           const AttributeValue *value) const
+{
+  if (value) {
+    const Text *text;
+    const StringC *str;
+    switch (value->info(text, str)) {
+    case AttributeValue::tokenized:
+        ptr.assign(makeAttributeValueTokenNode(grove,
+                                               (const TokenizedAttributeValue *)value,
+                                              attIndex_, 0));
+      return accessOK;
+    case AttributeValue::cdata:
+      {
+       TextIter iter(*text);
+       if (!CdataAttributeValueNode::skipBoring(iter)) {
+          ptr.assign(0);
+         return accessNull;
+        }
+       else {
+         ptr.assign(makeCdataAttributeValueNode(grove, value,
+                                                attIndex_, iter));
+         return accessOK;
+        }
+      }
+    default:
+      break;
+    }
+  }
+  return accessNull;
+}
+
+AccessResult
+AttributeDefOrigin::makeAttributeValueNodeList(const GroveImpl *grove,
+                                               NodeListPtr &ptr,
+                                               const AttributeValue *value = 0) const
+{
+  NodePtr nodePtr;
+  AccessResult result;
+  result = makeAttributeValueNode(grove, nodePtr, value);
+  if (result == accessOK)
+    ptr.assign(nodePtr.operator->() == 0 ? new BaseNodeList : new SiblingNodeList(nodePtr));
+  return result;
+}
+
+AccessResult AttributeDefOrigin::makeAttributeDefNode(const GroveImpl *grove,
+                                                      NodePtr &ptr,
+                                                      const StringC &name) const
+{
+  if (attDefList() == 0)
+    return accessNull;
+  for (size_t i = 0; i < attDefList()->size(); i++)
+    if (attDefList()->def(i)->name() == name)
+    {
+      return makeAttributeDefNode(grove, ptr, i);
+      break;
+    }
+  return accessNull;
+}
+
+// class IMP: ElementTypeAttributeDefOrigin
+
+ElementTypeAttributeDefOrigin::ElementTypeAttributeDefOrigin(const ElementType *elementType)
+: elementType_(elementType)
+{
+}
+
+const AttributeDefinitionList *ElementTypeAttributeDefOrigin::attDefList() const
+{
+  return elementType_->attributeDefTemp();
+}
+
+AccessResult ElementTypeAttributeDefOrigin::makeAttributeDefNode(const GroveImpl *grove,
+                                                                 NodePtr &ptr,
+                                                                 size_t attributeDefIdx) const
+{
+  ptr.assign(new ElementTypeAttributeDefNode(grove, *elementType_, attributeDefIdx));
+  return accessOK;
+}
+
+AccessResult ElementTypeAttributeDefOrigin::makeAttributeDefList(const GroveImpl *grove,
+                                                                 NodeListPtr &ptr,
+                                                                 size_t firstAttDefIdx) const
+{
+  ptr.assign(new ElementTypeAttributeDefsNodeList(grove,
+                                                  *elementType_,
+                                                  firstAttDefIdx));
+  return accessOK;
+}
+
+Node *ElementTypeAttributeDefOrigin
+::makeCdataAttributeValueNode(const GroveImpl *grove,
+                             const AttributeValue *value,
+                             size_t attIndex,
+                             const TextIter &iter,
+                             size_t charIndex) const
+{
+  return new ElementTypeCdataAttributeValueNode(grove, value, attIndex, iter,
+                                               charIndex, elementType_);
+}
+
+
+Node *ElementTypeAttributeDefOrigin
+::makeAttributeValueTokenNode(const GroveImpl *grove,
+                             const TokenizedAttributeValue *value,
+                             size_t attIndex,
+                             size_t tokenIndex) const
+{
+  return new ElementTypeAttributeValueTokenNode(grove, value, attIndex,
+                                               tokenIndex, elementType_);
+}
+
+Node *ElementTypeAttributeDefOrigin::makeOriginNode(const GroveImpl *grove, size_t) const 
+{
+  return new ElementTypeAttributeDefNode(grove, *elementType_, attIndex_);
+}
+
+const void *ElementTypeAttributeDefOrigin::attributeOriginId() const
+{
+  return elementType_;
+}
+
+// class IMP: NotationAttributeDefOrigin
+
+NotationAttributeDefOrigin::NotationAttributeDefOrigin(const Notation *notation)
+: notation_(notation)
+{
+}
+
+const AttributeDefinitionList *NotationAttributeDefOrigin::attDefList() const
+{
+  return notation_->attributeDefTemp();
+}
+
+AccessResult NotationAttributeDefOrigin::makeAttributeDefNode(const GroveImpl *grove, 
+                                                              NodePtr &ptr,
+                                                              size_t attributeDefIdx) const
+{
+  ptr.assign(new NotationAttributeDefNode(grove, *notation_, attributeDefIdx));
+  return accessOK;
+}
+
+AccessResult NotationAttributeDefOrigin::makeAttributeDefList(const GroveImpl *grove,
+                                                              NodeListPtr &ptr,
+                                                              size_t firstAttDefIdx) const
+{
+  ptr.assign(new NotationAttributeDefsNodeList(grove,
+                                               *notation_,
+                                               firstAttDefIdx));
+  return accessOK;
+}
+
+Node *NotationAttributeDefOrigin
+::makeCdataAttributeValueNode(const GroveImpl *grove,
+                             const AttributeValue *value,
+                             size_t attIndex,
+                             const TextIter &iter,
+                             size_t charIndex) const
+{
+  return new NotationCdataAttributeValueNode(grove, value, attIndex, iter,
+                                            charIndex, notation_);
+}
+
+
+Node *NotationAttributeDefOrigin
+::makeAttributeValueTokenNode(const GroveImpl *grove,
+                             const TokenizedAttributeValue *value,
+                             size_t attIndex,
+                             size_t tokenIndex) const
+{
+  return new NotationAttributeValueTokenNode(grove, value, attIndex,
+                                            tokenIndex, notation_);
+}
+
+Node *NotationAttributeDefOrigin::makeOriginNode(const GroveImpl *grove, size_t) const 
+{
+  return new NotationAttributeDefNode(grove, *notation_, attIndex_);
+}
+
+const void *NotationAttributeDefOrigin::attributeOriginId() const
+{
+  return notation_;
+}
+
+// class IMP: AttributeDefNode
+
+AccessResult AttributeDefNode::getOrigin(NodePtr &ptr) const
+{
+  ptr.assign(makeOriginNode(grove(), attIndex_));
+  return accessOK;
+}
+
+AccessResult AttributeDefNode::getName(GroveString &str) const
+{
+  setString(str, attDefList()->def(attIndex_)->name());
+  return accessOK;
+}
+
+AccessResult AttributeDefNode::getDeclValueType(Node::DeclValueType::Enum &dvt) const
+{
+  AttributeDefinitionDesc desc;
+  attDefList()->def(attIndex_)->getDesc(desc);
+  switch (desc.declaredValue)  
+  {
+    case AttributeDefinitionDesc::cdata:
+      dvt = DeclValueType::cdata;
+      break;
+    case AttributeDefinitionDesc::name:
+      dvt = DeclValueType::name;
+      break;
+    case AttributeDefinitionDesc::number:
+      dvt = DeclValueType::number;
+      break;
+    case AttributeDefinitionDesc::nmtoken:
+      dvt = DeclValueType::nmtoken;
+      break;
+    case AttributeDefinitionDesc::nutoken:
+      dvt = DeclValueType::nutoken;
+      break;
+    case AttributeDefinitionDesc::entity:
+      dvt = DeclValueType::entity;
+      break;
+    case AttributeDefinitionDesc::idref:
+      dvt = DeclValueType::idref;
+      break;
+    case AttributeDefinitionDesc::names:
+      dvt = DeclValueType::names;
+      break;
+    case AttributeDefinitionDesc::numbers:
+      dvt = DeclValueType::numbers;
+      break;
+    case AttributeDefinitionDesc::nmtokens:
+      dvt = DeclValueType::nmtokens;
+      break;
+    case AttributeDefinitionDesc::nutokens:
+      dvt = DeclValueType::nutokens;
+      break;
+    case AttributeDefinitionDesc::entities:
+      dvt = DeclValueType::entities;
+      break;
+    case AttributeDefinitionDesc::idrefs:
+      dvt = DeclValueType::idrefs;
+      break;
+    case AttributeDefinitionDesc::id:
+      dvt = DeclValueType::id;
+      break;
+    case AttributeDefinitionDesc::notation:
+      dvt = DeclValueType::notation;
+      break;
+    case AttributeDefinitionDesc::nameTokenGroup:
+      dvt = DeclValueType::nmtkgrp;
+      break;
+    default:
+      CANNOT_HAPPEN();
+  }
+  return accessOK;
+}
+
+AccessResult AttributeDefNode::getDefaultValueType(Node::DefaultValueType::Enum &dvt) const
+{
+  AttributeDefinitionDesc desc;
+  attDefList()->def(attIndex_)->getDesc(desc);
+  switch (desc.defaultValueType)  
+  {
+    case AttributeDefinitionDesc::required:
+      dvt = DefaultValueType::required;
+      break;
+    case AttributeDefinitionDesc::current:
+      dvt = DefaultValueType::current;
+      break;
+    case AttributeDefinitionDesc::implied:
+      dvt = DefaultValueType::implied;
+      break;
+    case AttributeDefinitionDesc::conref:
+      dvt = DefaultValueType::conref;
+      break;
+    case AttributeDefinitionDesc::defaulted:
+      dvt = DefaultValueType::value;
+      break;
+    case AttributeDefinitionDesc::fixed:
+      dvt = DefaultValueType::fixed;
+      break;
+    default:
+      CANNOT_HAPPEN();
+  }
+  return accessOK;
+}
+
+AccessResult AttributeDefNode::getTokens(GroveStringListPtr &tokens) const
+{
+  AttributeDefinitionDesc desc;
+  attDefList()->def(attIndex_)->getDesc(desc);
+  if (desc.declaredValue != AttributeDefinitionDesc::notation
+       && desc.declaredValue != AttributeDefinitionDesc::nameTokenGroup)
+    return accessNull;
+  tokens.assign(new GroveStringList);
+  GroveString str;
+  for (size_t i = 0; i < desc.allowedValues.size(); i++)
+  {
+    setString(str, desc.allowedValues[i]);
+    tokens->append(str);
+  }
+  return accessOK;
+}
+
+AccessResult AttributeDefNode::getCurrentAttributeIndex(long &index) const 
+{
+  AttributeDefinitionDesc desc;
+  attDefList()->def(attIndex_)->getDesc(desc);
+  if (desc.defaultValueType != AttributeDefinitionDesc::current)
+    return accessNull;
+  index = desc.currentIndex;  
+  return accessOK;
+}
+
+void AttributeDefNode::accept(NodeVisitor &visitor)
+{
+  visitor.attributeDef(*this);
+}
+
+bool AttributeDefNode::same(const BaseNode &node) const
+{
+  return node.same2(this);
+}
+
+bool AttributeDefNode::same2(const AttributeDefNode *node) const
+{
+  return (attributeOriginId() == node->attributeOriginId()
+          && attIndex_ == node->attIndex());
+}
+
+unsigned long AttributeDefNode::hash() const
+{
+  unsigned long n = (unsigned long)attributeOriginId();
+  return secondHash(n + attIndex_);
+}
+
+// class IMP: ElementTypeAttributeDefNode
+
+AccessResult ElementTypeAttributeDefNode::getCurrentGroup(NodeListPtr &ptr) const 
+{
+  AttributeDefinitionDesc desc;
+  attDefList()->def(attIndex_)->getDesc(desc);
+  if (desc.defaultValueType != AttributeDefinitionDesc::current)
+    return accessNull;
+  ptr.assign(
+   new ElementTypeCurrentGroupAttributeDefsNodeList(grove(),
+                                                    grove()->governingDtd()->elementTypeIter(),
+                                                    desc.currentIndex));
+  return accessOK;
+}
+
+AccessResult ElementTypeAttributeDefNode::getLocation(Location &loc) const
+{
+  const ElementDefinition *def = elementType_->definition();
+  if (def == 0)
+    return accessNull;
+  return grove()->proxifyLocation(def->location(), loc);
+}
+
+AccessResult ElementTypeAttributeDefNode::getDefaultValue(NodeListPtr &ptr) const
+{
+  AttributeDefinitionDesc desc;
+  attDefList()->def(attIndex_)->getDesc(desc);
+  const AttributeValue *value = desc.defaultValue.pointer();
+  return makeAttributeValueNodeList(grove(), ptr, value);
+}
+
+// class IMP: NotationAttributeDefNode
+
+AccessResult NotationAttributeDefNode::getCurrentGroup(NodeListPtr &ptr) const 
+{
+  AttributeDefinitionDesc desc;
+  attDefList()->def(attIndex_)->getDesc(desc);
+  if (desc.defaultValueType != AttributeDefinitionDesc::current)
+    return accessNull;
+  NodePtr nodePtr;
+  nodePtr.assign(new NotationAttributeDefNode(grove(), *notation_, attIndex_));
+  ptr.assign(new SiblingNodeList(nodePtr));
+  return accessOK;
+}
+
+AccessResult NotationAttributeDefNode::getLocation(Location &loc) const
+{
+  return grove()->proxifyLocation(notation_->defLocation(), loc);
+}
+
+// -- CLASS IMP: AttributeDefsNodeList
+
+bool AttributeDefsNodeList::inList(size_t attIndex) const
+{
+  if (attDefList() == 0 || attIndex >= attDefList()->size())
+    return false;
+  return true;
+}
+
+AccessResult AttributeDefsNodeList::first(NodePtr &ptr) const
+{
+  return inList(attIndex_)
+          ? makeAttributeDefNode(grove_, ptr, attIndex_)
+          : accessNull;
+}
+
+AccessResult AttributeDefsNodeList::chunkRest(NodeListPtr &ptr) const
+{
+  if (canReuse(ptr)) {
+    AttributeDefsNodeList *list = (AttributeDefsNodeList *)this;
+    if (list->inList(list->attIndex_)) {
+      ++(list->attIndex_);
+      return accessOK;
+    }
+    return accessNull;
+  }
+  return inList(attIndex_)
+          ? makeAttributeDefList(grove_, ptr, attIndex_+1)
+          : accessNull;
+}
+
+// -- CLASS IMP: AttributeDefsNamedNodeList
+
+NodeListPtr AttributeDefsNamedNodeList::nodeList() const
+{
+  NodeListPtr ptr;
+  makeAttributeDefList(grove(), ptr, 0);
+  return ptr;
+}
+
+AccessResult AttributeDefsNamedNodeList::namedNodeU(const StringC &str, NodePtr &ptr) const
+{
+  return makeAttributeDefNode(grove(), ptr, str);
+}
+
+// -- CLASS IMP: ElementTypeCurrentGroupAttributeDefsNodeList
+
+ElementTypeCurrentGroupAttributeDefsNodeList
+ ::ElementTypeCurrentGroupAttributeDefsNodeList(const GroveImpl *grove,
+                                                const Dtd::ConstElementTypeIter &iter,
+                                                size_t currentGroupIndex) 
+   : grove_(grove), iter_(iter), currentGroupIndex_(currentGroupIndex), attIndex_(0)
+{
+  elementType_ = iter_.next();
+  next(false);
+}
+
+bool ElementTypeCurrentGroupAttributeDefsNodeList::next(Dtd::ConstElementTypeIter &iter,
+                                                        const ElementType *&elementType,
+                                                        size_t &attIndex,
+                                                        bool incrementFirst) const
+{
+  if (incrementFirst)
+    attIndex++;
+  while (elementType != 0) {
+    if (attIndex >= elementType->attributeDefTemp()->size() ) {
+      do {
+        elementType = iter.next();
+      } while(elementType != 0 && !elementType->attributeDefTemp()->anyCurrent());
+      attIndex = 0;
+    }
+    else {
+      if (elementType->attributeDefTemp()->def(attIndex)->isCurrent()) {
+        AttributeDefinitionDesc desc;
+        elementType->attributeDefTemp()->def(attIndex)->getDesc(desc);  
+        if (desc.currentIndex == currentGroupIndex_)
+          break;
+      }
+      attIndex++;
+    }
+  }
+  return elementType != 0 ? true : false;
+}
+
+AccessResult ElementTypeCurrentGroupAttributeDefsNodeList::first(NodePtr &ptr) const
+{
+  if (elementType_ == 0)
+    return accessNull;
+  ptr.assign(new ElementTypeAttributeDefNode(grove_,
+                                             *elementType_,
+                                             attIndex_));
+  return accessOK;
+}
+
+AccessResult ElementTypeCurrentGroupAttributeDefsNodeList::chunkRest(NodeListPtr &ptr) const
+{
+  if (elementType_ == 0)
+    return accessNull;
+  if (canReuse(ptr)) {
+    ElementTypeCurrentGroupAttributeDefsNodeList *list
+     = (ElementTypeCurrentGroupAttributeDefsNodeList *)this;
+    list->next();
+    return accessOK;
+  } else {
+    Dtd::ConstElementTypeIter iter(iter_);
+    const ElementType *elementType = elementType_;
+    size_t attIndex = attIndex_;
+    next(iter, elementType, attIndex);
+    ptr.assign(new ElementTypeCurrentGroupAttributeDefsNodeList(grove_,
+                                                                iter,
+                                                                elementType,
+                                                                attIndex,
+                                                                currentGroupIndex_));
+  }
+  return accessOK;
+}
+
+// ------------------------------ dev end --------------------------------
+
+#ifdef SP_NAMESPACE
+}
+#endif
+
+#include "grove_inst.cxx"
diff --git a/spgrove/GroveBuilder.h b/spgrove/GroveBuilder.h
new file mode 100644 (file)
index 0000000..6b8a0f9
--- /dev/null
@@ -0,0 +1,52 @@
+// Copyright (c) 1996 James Clark
+// See the file COPYING for copying permission.
+
+#ifndef GroveBuilder_INCLUDED
+#define GroveBuilder_INCLUDED 1
+
+#include "Boolean.h"
+#include "Node.h"
+
+#ifdef SP_USE_DLL
+#ifdef BUILD_LIBSPGROVE
+#define SPGROVE_API SP_DLLEXPORT
+#else
+#define SPGROVE_API SP_DLLIMPORT
+#endif
+#else /* not SP_USE_DLL */
+#define SPGROVE_API /* as nothing */
+#endif /* not SP_USE_DLL */
+
+#ifdef SP_NAMESPACE
+namespace SP_NAMESPACE {
+#endif
+
+class Messenger;
+class ErrorCountEventHandler;
+class MessageFormatter;
+
+class SPGROVE_API GroveBuilder {
+public:
+  static bool setBlocking(bool);
+  static ErrorCountEventHandler *make(unsigned index,
+                                     Messenger *,
+                                     MessageFormatter *,
+                                     bool validateOnly,
+                                     GROVE_NAMESPACE_SCOPE NodePtr &root);
+  static ErrorCountEventHandler *make(unsigned index,
+                                     Messenger *,
+                                     MessageFormatter *,
+                                     bool validateOnly,
+                                     const ConstPtr<Sd> &sd,
+                                     const ConstPtr<Syntax> &prologSyntax,
+                                     const ConstPtr<Syntax> &instanceSyntax,
+                                     GROVE_NAMESPACE_SCOPE NodePtr &root);
+private:
+  GroveBuilder();
+};
+
+#ifdef SP_NAMESPACE
+}
+#endif
+
+#endif /* not GroveBuilder_INCLUDED */
diff --git a/spgrove/Makefile.sub b/spgrove/Makefile.sub
new file mode 100644 (file)
index 0000000..0e4f135
--- /dev/null
@@ -0,0 +1,12 @@
+LTVERSION=0:1:0
+LIB=ospgrove
+INCLUDE=-I$(srcdir)/../grove
+DEPLIBS=-lm -L$(TOP)/grove -L$(TOP)/grove/.libs \
+       -L$(TOP)/lib -L$(TOP)/lib/.libs \
+       $(LIB_THREADS)
+OBJS=GroveApp.o GroveBuilder.o SdNode.o
+GENSRCS=grove_inst.cxx
+
+GroveBuilder.o: grove_inst.cxx
+GroveBuilder.lo: grove_inst.cxx
+
diff --git a/spgrove/SdNode.cxx b/spgrove/SdNode.cxx
new file mode 100644 (file)
index 0000000..28232e0
--- /dev/null
@@ -0,0 +1,20 @@
+// Copyright (c) 1997 James Clark
+// See the file COPYING for copying permission.
+
+
+#include "config.h"
+#include "SdNode.h"
+
+#ifdef SP_NAMESPACE
+namespace SP_NAMESPACE {
+#endif
+
+#ifdef GROVE_NAMESPACE
+using namespace GROVE_NAMESPACE;
+#endif
+
+const Node::IID SdNode::iid = "SdNode";
+
+#ifdef SP_NAMESPACE
+}
+#endif
diff --git a/spgrove/SdNode.h b/spgrove/SdNode.h
new file mode 100644 (file)
index 0000000..350712a
--- /dev/null
@@ -0,0 +1,45 @@
+// Copyright (c) 1997 James Clark
+// See the file COPYING for copying permission.
+
+#ifndef SdNode_INCLUDED
+#define SdNode_INCLUDED 1
+
+#include "Boolean.h"
+#include "Node.h"
+#include "Sd.h"
+#include "Syntax.h"
+#include "GroveBuilder.h"
+
+#ifdef SP_NAMESPACE
+namespace SP_NAMESPACE {
+#endif
+
+#ifdef GROVE_NAMESPACE
+#define GROVE_NAMESPACE_SCOPE GROVE_NAMESPACE::
+#else
+#define GROVE_NAMESPACE_SCOPE
+#endif
+
+class SPGROVE_API SdNode {
+public:
+  virtual GROVE_NAMESPACE_SCOPE AccessResult
+    getSd(ConstPtr<Sd> &sd,
+          ConstPtr<Syntax> &prologSyntax,
+        ConstPtr<Syntax> &instanceSyntax) const = 0;
+  static const GROVE_NAMESPACE_SCOPE Node::IID iid;
+  static const SdNode *convert(const GROVE_NAMESPACE_SCOPE NodePtr &nd) {
+    const void *p;
+    if (nd && nd->queryInterface(iid, p))
+      return (const SdNode *)p;
+    else
+      return 0;
+  }
+};
+
+#undef GROVE_NAMESPACE_SCOPE
+
+#ifdef SP_NAMESPACE
+}
+#endif
+
+#endif /* not SdNode_INCLUDED */
diff --git a/spgrove/grove_inst.m4 b/spgrove/grove_inst.m4
new file mode 100644 (file)
index 0000000..9f8c033
--- /dev/null
@@ -0,0 +1,31 @@
+// Copyright (c) 1996, 1997 James Clark
+// See the file copying.txt for copying permission.
+
+#include "config.h"
+
+#ifdef SP_MANUAL_INST
+
+#define SP_DEFINE_TEMPLATES
+#include "PointerTable.h"
+#include "Vector.h"
+#undef SP_DEFINE_TEMPLATES
+
+#include "Hash.h"
+#include "StringC.h"
+#include "Node.h"
+
+#ifdef SP_NAMESPACE
+namespace SP_NAMESPACE {
+#endif
+
+class ElementChunk;
+
+__instantiate(`PointerTable<ElementChunk *,StringC,Hash,ElementChunk>')
+__instantiate(`Vector<ElementChunk *>')
+__instantiate(Vector<ConstPtr<Origin> >)
+
+#ifdef SP_NAMESPACE
+}
+#endif
+
+#endif /* SP_MANUAL_INST */
diff --git a/spgrove/spgrove.dsp b/spgrove/spgrove.dsp
new file mode 100644 (file)
index 0000000..a4171e3
--- /dev/null
@@ -0,0 +1,174 @@
+# Microsoft Developer Studio Project File - Name="spgrove" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=spgrove - Win32 Release
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "spgrove.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "spgrove.mak" CFG="spgrove - Win32 Release"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "spgrove - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "spgrove - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "spgrove - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir ".\Release"
+# PROP BASE Intermediate_Dir ".\Release"
+# PROP BASE Target_Dir "."
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir ".\Release"
+# PROP Intermediate_Dir ".\Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir "."
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\include" /I "..\grove" /D "BUILD_LIBSPGROVE" /D "NDEBUG" /D "_WINDOWS" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D "SP_MULTI_BYTE" /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x20100000" /subsystem:windows /dll /machine:I386 /out:"..\bin\ospgrove13.dll"
+# SUBTRACT LINK32 /profile /map
+
+!ELSEIF  "$(CFG)" == "spgrove - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir ".\Debug"
+# PROP BASE Intermediate_Dir ".\Debug"
+# PROP BASE Target_Dir "."
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir ".\Debug"
+# PROP Intermediate_Dir ".\Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir "."
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\include" /I "..\grove" /D "BUILD_LIBSPGROVE" /D "_DEBUG" /D "_WINDOWS" /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D "SP_MULTI_BYTE" /YX /FD /c
+# ADD BASE MTL /nologo /D "_DEBUG" /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x20100000" /subsystem:windows /dll /debug /machine:I386 /out:"..\dbgbin\ospgrove13d.dll"
+# SUBTRACT LINK32 /incremental:no
+
+!ENDIF 
+
+# Begin Target
+
+# Name "spgrove - Win32 Release"
+# Name "spgrove - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat;for;f90"
+# Begin Source File
+
+SOURCE=.\grove_inst.m4
+
+!IF  "$(CFG)" == "spgrove - Win32 Release"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\grove_inst.m4
+InputName=grove_inst
+
+"$(InputDir)\$(InputName).cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       del /f $(InputDir)\$(InputName).cxx 
+       perl ..\lib\instmac.pl $(InputPath) >$(InputDir)\$(InputName).cxx 
+       attrib +r $(InputDir)\$(InputName).cxx 
+       
+# End Custom Build
+
+!ELSEIF  "$(CFG)" == "spgrove - Win32 Debug"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\grove_inst.m4
+InputName=grove_inst
+
+"$(InputDir)\$(InputName).cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       del /f $(InputDir)\$(InputName).cxx 
+       perl ..\lib\instmac.pl $(InputPath) >$(InputDir)\$(InputName).cxx 
+       attrib +r $(InputDir)\$(InputName).cxx 
+       
+# End Custom Build
+
+!ENDIF 
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\GroveApp.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\GroveBuilder.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\SdNode.cxx
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd"
+# Begin Source File
+
+SOURCE=.\GroveApp.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\GroveBuilder.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\SdNode.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\threads.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"
+# End Group
+# Begin Source File
+
+SOURCE=.\grove_inst.cxx
+# PROP BASE Exclude_From_Build 1
+# PROP Exclude_From_Build 1
+# End Source File
+# End Target
+# End Project
diff --git a/spgrove/threads.h b/spgrove/threads.h
new file mode 100644 (file)
index 0000000..9873420
--- /dev/null
@@ -0,0 +1,481 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef threads_INCLUDED
+#define threads_INCLUDED 1
+
+// Thread primitives.
+
+#if defined(_MSC_VER) && defined(_MT)
+
+// WIN32
+
+#define SP_THREAD
+
+#define STRICT 1
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <process.h>
+// <windows.h> appears to turn these warnings back on
+#ifdef _MSC_VER
+#pragma warning ( disable : 4237 )
+#endif
+
+class Thread {
+public:
+  Thread(int (*func)(void *), void *arg) {
+    unsigned threadId;
+    arg_ = new Arg;
+    arg_->func = func;
+    arg_->arg = arg;
+    arg_->exited = 0;
+    handle_ = HANDLE(_beginthreadex(NULL, 0, start, arg_, 0, &threadId));
+  }
+  int wait() {
+    if (WaitForSingleObject(handle_, INFINITE) != WAIT_OBJECT_0)
+      abort();
+    if (!CloseHandle(handle_))
+      abort();
+    if (arg_->exited) {
+      int ret = arg_->ret;
+      delete arg_;
+      return ret;
+    }
+    // Something's gone wrong.  We'll get a leak.
+    return 0;
+  }
+private:
+  struct Arg {
+    int (*func)(void *);
+    void *arg;
+    int ret;
+    int exited;
+  };
+  static unsigned __stdcall start(void *p) {
+    Arg *arg = (Arg *)p;
+    arg->ret = (*arg->func)(arg->arg);
+    arg->exited = 1;
+    return 0;
+  }
+  HANDLE handle_;
+  Arg *arg_;
+};
+
+class Mutex {
+public:
+  class Lock {
+  public:
+    Lock(Mutex *mp) : mp_(mp) {
+      if (mp) EnterCriticalSection(&mp->cs_);
+    }
+    ~Lock() {
+      if (mp_) LeaveCriticalSection(&mp_->cs_);
+    }
+  private:
+    Mutex *mp_;
+  };
+  Mutex() {
+    InitializeCriticalSection(&cs_);
+  }
+  ~Mutex() {
+    DeleteCriticalSection(&cs_);
+  }
+  friend class Lock;
+private:
+  CRITICAL_SECTION cs_;
+};
+
+// Thread-safe reference counts.
+
+class RefCount {
+public:
+  RefCount() : count_(0) { }
+  void operator++() { InterlockedIncrement(&count_); }
+  bool operator--() { return InterlockedDecrement(&count_) != 0; }
+  operator unsigned long() const { return count_; }
+private:
+  long count_;
+};
+
+#ifndef SP_NO_BLOCK
+
+#define SP_CONDITION
+
+class Condition {
+public:
+  // Manual reset event, initially non-signalled
+  Condition() : handle_(CreateEvent(NULL, 1, 0, NULL)), nWaiters_(0) { }
+  ~Condition() { CloseHandle(handle_); }
+  // Set the event to signalled, releasing all threads waiting on it,
+  // then set it back to non-signalled.
+  // For performance reasons, we want to avoid calling PulseEvent unless we have
+  // some thread waiting on this condition.
+  // The obvious solution of a boolean variable that's set by wait() and
+  // cleared by pulse() fails in the following scenario:
+  // reader: needPulse_ = 1;
+  // writer: needPulse_ = 0;
+  // writer: PulseEvent()
+  // reader: WaitForSingleObject()
+  void pulse() {
+    if (nWaiters_) {
+      PulseEvent(handle_);
+    }
+  }
+  // Wait for the event to become signalled.
+  bool wait() const {
+    InterlockedIncrement((long *)&nWaiters_);
+    bool ret = (WaitForSingleObject(handle_, INFINITE) == WAIT_OBJECT_0);
+    InterlockedDecrement((long *)&nWaiters_);
+    return ret;
+  }
+  // Set the event to signalled, releasing all threads waiting on it.
+  // Don't set it back to non-signalled.  Any thread that subsequently
+  // waits will return immediately.
+  void set() { SetEvent(handle_); }
+private:
+  long nWaiters_;
+  HANDLE handle_;
+};
+
+#endif /* not SP_NO_BLOCK */
+
+#endif /* _MSC_VER && _MT */
+
+#if ((defined __MACH__) && !(defined __APPLE__)) || (defined __GNU__)
+
+// For Mach, using C Threads. May or may not work as-is on your Mach-based OS.
+// Written by Raf Schietekat <RfSchtkt@maze.ruca.ua.ac.be> on 1996-11-10.
+// Platform used: NEXTSTEP_(Dev_)3.2 with sp-1.1.1 and jade-0.1.
+// Maturity: only dsssl/demo.sgm tested (successfully).
+
+#define SP_THREAD
+
+extern "C" {
+#ifdef __NeXT__
+// catch is a reserved word in C++, it's only used to declare a struct member
+#define catch catch22
+#include <mach/cthreads.h>
+#undef catch
+// don't want ASSERT to clash with ASSERT in SP's macros.h
+#undef ASSERT
+#elif defined __GNU__
+// catch is a reserved word in C++, it's only used to declare a struct member
+#define catch catch22
+#include <cthreads.h>
+#undef catch
+// don't want ASSERT to clash with ASSERT in SP's macros.h
+#undef ASSERT
+#else
+// Change to whatever works for you, and tell James Clark (or me).
+// catch is a reserved word in C++, it's only used to declare a struct member
+#define catch catch22
+#include <mach/cthreads.h>
+#undef catch
+// don't want ASSERT to clash with ASSERT in SP's macros.h
+#undef ASSERT
+#endif
+}
+
+class Thread {
+public:
+  Thread(int (*func)(void *), void *arg) {
+    arg_ = new Arg;
+    arg_->func = func;
+    arg_->arg = arg;
+    arg_->exited = 0;
+    handle_ = cthread_fork((cthread_fn_t)start, (any_t)arg_);
+    // will be cthread_join()'ed in wait()
+  }
+  int wait() {
+    cthread_join(handle_);
+    if (arg_ && arg_->exited) {
+      int ret = arg_->ret;
+      delete arg_;
+      arg_ = 0;
+      return ret;
+    }
+    // Something's gone wrong.  We'll get a leak.
+    return 0;
+  }
+private:
+  struct Arg {
+    int (*func)(void *);
+    void *arg;
+    int ret;
+    int exited;
+  };
+  static void *start(void *p) {
+    Arg *arg = (Arg *)p;
+    arg->ret = (*arg->func)(arg->arg);
+    arg->exited = 1;
+    return 0;
+  }
+  cthread_t handle_;
+  Arg *arg_;
+};
+
+class Mutex {
+public:
+  class Lock {
+  // Lock serves to automatically unlock Mutex, however control leaves
+  // a block. Don't let any "warning: unused variable `class Mutex::Lock lock'"
+  // mislead you; hopefully your compiler won't optimise this away...
+  public:
+    Lock(Mutex *mp) : mp_(mp) { if (mp_) mutex_lock  (&mp_->cs_); }
+    ~Lock()                   { if (mp_) mutex_unlock(&mp_->cs_); }
+  private:
+    Mutex *mp_;
+  };
+  Mutex()  { mutex_init (&cs_); }
+  ~Mutex() { mutex_clear(&cs_); }
+  friend class Lock;
+private:
+  struct mutex cs_;
+};
+
+// Thread-safe reference counts.
+
+class RefCount {
+public:
+  RefCount() : count_(0) { mutex_init (&cs_); }
+  ~RefCount()            { mutex_clear(&cs_); }
+  void operator++() { mutex_lock(&cs_); ++count_; mutex_unlock(&cs_); }
+  bool operator--() {
+    bool ret;
+    mutex_lock(&cs_); ret=(0!=--count_); mutex_unlock(&cs_);
+    return ret; // safe iff reference-count semantics are observed
+  }
+  operator unsigned long() const { return count_; }
+    // safe iff reference-count semantics are observed
+private:
+  long count_; // hmm, () returns unsigned long...
+  struct mutex cs_; // don't build on top of Mutex class, for efficiency
+};
+
+#ifndef SP_NO_BLOCK
+
+#define SP_CONDITION
+
+class Condition { // doesn't trivially map to a condition_t!
+public:
+  Condition() : set_(0) {
+    /**/mutex_=    mutex_alloc();
+    condition_=condition_alloc();
+  }
+  ~Condition() {
+    /**/mutex_free(    mutex_);
+    condition_free(condition_);
+  }
+  void pulse() { condition_broadcast(condition_); }
+  bool wait() const {
+    mutex_lock  (                        mutex_);
+    if(!set_) condition_wait(condition_, mutex_);
+    mutex_unlock(                        mutex_);
+    return 1;
+      // 0 would be interpreted as timeout, which is not supported directly
+      // do we need that? would require some more coding, with another thread
+  }
+  void set() {
+    mutex_lock  (mutex_);
+    set_=1;
+    mutex_unlock(mutex_);
+    condition_broadcast(condition_);
+  }
+private:
+  // nWaiters_ functionality already in Mach C Threads
+  mutex_t mutex_;
+    // every C Threads condition_t needs a mutex_t
+    // but also see set_ below
+  condition_t condition_;
+    // can't have struct and struct mutex because of the const in wait()
+    // (can/should this const-ness be revised?)
+  bool set_;
+    // born as false, does a single transition to true, then dies
+    // therefore, no mutex (with its overhead) seems required, right?
+    // wrong:
+    //   consumer reads set_ as false
+    //   producer sets set_ to true
+    //   producer signals condition for the last time
+    //   consumer waits, and waits forever
+    //     (consumer didn't get last condition because it was not yet waiting)
+};
+
+#endif /* SP_NO_BLOCK */
+
+#endif /* __MACH__ || __GNU__ */
+
+#ifdef SP_USE_PTHREADS
+
+// Support for pthreads on Linux.
+// Written by Matthias Clasen <clasen@mathematik.uni-freiburg.de>
+
+extern "C" {
+// for some reason sigset_t is missing here (with glibc 2.0.7);
+// so we define it manually.
+  // Except for MacOS X, which has introduced it.
+#if !((defined __APPLE__) && (defined __MACH__))
+typedef __sigset_t sigset_t;
+#endif
+#include <pthread.h>
+}
+
+#define SP_THREAD
+
+class Thread {
+public:
+  Thread(int (*func)(void *), void *arg) {
+    arg_ = new Arg;
+    arg_->func = func;
+    arg_->arg = arg;
+    arg_->exited = 0;
+    pthread_create (&handle_, NULL, start, (void *)arg_);
+  }
+  int wait() {
+    pthread_join(handle_, NULL);
+    if (arg_ && arg_->exited) {
+      int ret = arg_->ret;
+      delete arg_;
+      arg_ = 0;
+      return ret;
+    }
+    // Something's gone wrong.  We'll get a leak.
+    return 0;
+  }
+private:
+  struct Arg {
+    int (*func)(void *);
+    void *arg;
+    int ret;
+    int exited;
+  };
+  static void *start(void *p) {
+    Arg *arg = (Arg *)p;
+    arg->ret = (*arg->func)(arg->arg);
+    arg->exited = 1;
+    return 0;
+  }
+  pthread_t handle_;
+  Arg *arg_;
+};
+
+class Mutex {
+public:
+  class Lock {
+  // Lock serves to automatically unlock Mutex, however control leaves
+  // a block. Don't let any "warning: unused variable `class Mutex::Lock lock'"
+  // mislead you; hopefully your compiler won't optimise this away...
+  public:
+    Lock(Mutex *mp) : mp_(mp) { if (mp_) pthread_mutex_lock  (&mp_->cs_); }
+    ~Lock()                   { if (mp_) pthread_mutex_unlock(&mp_->cs_); }
+  private:
+    Mutex *mp_;
+  };
+  Mutex()  { pthread_mutex_init (&cs_, NULL); }
+  ~Mutex() { pthread_mutex_destroy (&cs_); }
+  friend class Lock;
+private:
+  pthread_mutex_t cs_;
+};
+
+// Thread-safe reference counts.
+
+class RefCount {
+public:
+  RefCount() : count_(0) { pthread_mutex_init (&cs_, NULL); }
+  ~RefCount()            { pthread_mutex_destroy (&cs_); }
+  void operator++() { pthread_mutex_lock(&cs_); ++count_; pthread_mutex_unlock(&cs_); }
+  bool operator--() {
+    bool ret;
+    pthread_mutex_lock(&cs_); ret=(0!=--count_); pthread_mutex_unlock(&cs_);
+    return ret; // safe iff reference-count semantics are observed
+  }
+  operator unsigned long() const { return count_; }
+    // safe iff reference-count semantics are observed
+private:
+  long count_; // hmm, () returns unsigned long...
+  pthread_mutex_t cs_; // don't build on top of Mutex class, for efficiency
+};
+
+#ifndef SP_NO_BLOCK
+
+#define SP_CONDITION
+
+class Condition { // doesn't trivially map to a condition_t!
+public:
+  Condition() : set_(0) {
+    pthread_mutex_init(&mutex_, NULL);
+    pthread_cond_init(&condition_, NULL);
+  }
+  ~Condition() {
+    pthread_mutex_destroy(&mutex_);
+    pthread_cond_destroy(&condition_);
+  }
+  void pulse() { pthread_cond_broadcast(&condition_); }
+  bool wait() {
+    pthread_mutex_lock(&mutex_);
+    if (!set_) pthread_cond_wait(&condition_, &mutex_);
+    pthread_mutex_unlock(&mutex_);
+    return 1;
+      // 0 would be interpreted as timeout, which is not supported directly
+      // do we need that? would require some more coding, with another thread
+  }
+  void set() {
+    pthread_mutex_lock(&mutex_);
+    set_=1;
+    pthread_mutex_unlock(&mutex_);
+    pthread_cond_broadcast(&condition_);
+  }
+private:
+  pthread_mutex_t mutex_;
+  pthread_cond_t condition_;
+  bool set_;
+};
+
+#endif /* SP_NO_BLOCK */
+
+#endif /* SP_USE_PTHREADS */
+
+#ifndef SP_THREAD
+
+class Thread {
+public:
+  Thread(int (*func)(void *), void *args) : ret_((*func)(args)) { }
+  int wait() { return ret_; }
+private:
+  int ret_;
+};
+
+class RefCount {
+public:
+  RefCount() : count_(0) { }
+  void operator++() { ++count_; }
+  bool operator--() { return --count_ != 0; }
+  operator unsigned long() const { return count_; }
+private:
+  unsigned long count_;
+};
+
+class Mutex {
+public:
+  class Lock {
+  public:
+    Lock(Mutex *) { }
+  };
+  Mutex() { }
+};
+
+#endif /* not SP_THREAD */
+
+#ifndef SP_CONDITION
+
+class Condition {
+public:
+  Condition() { }
+  void pulse() { }
+  void set() { }
+  bool wait() const { return 0; }
+};
+
+#endif /* not SP_CONDITION */
+
+#endif /* not threads_INCLUDED */
diff --git a/style/Collector.cxx b/style/Collector.cxx
new file mode 100644 (file)
index 0000000..0f0416a
--- /dev/null
@@ -0,0 +1,282 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#include "config.h"
+#include "Collector.h"
+#include "macros.h"
+#include <stdlib.h>
+
+#if 0
+#define DEBUG
+#endif
+
+Collector::Collector(size_t maxSize)
+: freePtr_(&allObjectsList_), currentColor_(Object::someColor),
+  blocks_(0), lastTraced_(0), totalObjects_(0), maxSize_(maxSize)
+{
+  allObjectsList_.makeHead();
+  permanentFinalizersList_.makeHead();
+}
+
+Collector::~Collector()
+{
+  if (freePtr_ != &allObjectsList_) {
+    for (Object *p = allObjectsList_.next(); p != freePtr_; p = p->next()) {
+      if (!p->hasFinalizer_)
+       break;
+      p->finalize();
+    }
+  }
+  {
+    for (Object *p = permanentFinalizersList_.next();
+        p != &permanentFinalizersList_;
+        p = p->next()) {
+      ASSERT(p->hasFinalizer_);
+      p->finalize();
+    }
+  }
+  while (blocks_) {
+    Block *tem = blocks_;
+    blocks_ = blocks_->next;
+    delete tem;
+  }
+}
+
+void Collector::makeSpace()
+{
+  unsigned long nLive = collect();
+  // Ensure that at least one-quarter of the heap is free, but don't allocate fewer
+  // than 512 objects.
+  if (freePtr_ == &allObjectsList_  || totalObjects_ - nLive < (totalObjects_ >> 2)
+      || totalObjects_ < 128) {
+    size_t allocObjs;
+    if (totalObjects_ < 128)
+      allocObjs = 512;
+    else {
+      allocObjs = (totalObjects_ >> 2) - (totalObjects_ - nLive);
+      if (allocObjs < 512)
+       allocObjs = 512;
+    }
+    if (freePtr_ == &allObjectsList_) {
+      blocks_ = new Block(blocks_, allocObjs, maxSize_, freePtr_->prev());
+      freePtr_ = blocks_->firstObj;
+    }
+    else
+      blocks_ = new Block(blocks_, allocObjs, maxSize_, freePtr_);
+    totalObjects_ += allocObjs;
+  }
+#ifdef DEBUG
+  check();
+#endif
+}
+
+void Collector::check()
+{
+  size_t n = 0;
+
+  bool allocated = 1;
+  bool allowFinalizer = 1;
+  for (Object *p = allObjectsList_.next();
+       p != &allObjectsList_;
+       p = p->next()) {
+    if (p == freePtr_)
+      allocated = 0;
+    else if (allocated) {
+      if (p->color() != currentColor_)
+       abort();
+      if (allowFinalizer) {
+       if (!p->hasFinalizer_)
+         allowFinalizer = 0;
+      }
+      else if (p->hasFinalizer_)
+       abort();
+    }
+    if (p->next()->prev() != p)
+      abort();
+    if (p->prev()->next() != p)
+      abort();
+    n++;
+  }
+  if (n != totalObjects_)
+    abort();
+  
+}
+
+// Link block in after follow.
+
+Collector::Block::Block(Block *p, size_t n, size_t sz, Object *follow)
+: next(p)
+{
+  Object *next = follow->next_;
+  Object *prev = follow;
+  Object *cur = (Object *)::operator new(n * sz);
+  firstObj = follow->next_ = cur;
+  for (size_t i = 0; i < n; i++) {
+    Object *tem = (i == n - 1 ? next : (Object *)((char *)cur + sz));
+    cur->next_ = tem;
+    cur->prev_ = prev;
+    prev = cur;
+    cur = tem;
+  }
+  next->prev_ = prev;
+}
+
+unsigned long Collector::collect()
+{
+  Object *oldFreePtr = freePtr_;
+  unsigned long nLive = 0;
+  currentColor_ = (currentColor_ == Object::someColor 
+                  ? Object::anotherColor
+                  : Object::someColor);
+  lastTraced_ = &allObjectsList_;
+  traceStaticRoots();
+  traceDynamicRoots();
+  if (lastTraced_ != &allObjectsList_) {
+    Object *scanPtr = allObjectsList_.next();
+    for (;;) {
+      if (scanPtr->hasSubObjects())
+       scanPtr->traceSubObjects(*this);
+      nLive++;
+      Object *next = scanPtr->next();
+      if (scanPtr->hasFinalizer_)
+       scanPtr->moveAfter(&allObjectsList_);
+      if (scanPtr == lastTraced_) {
+       freePtr_ = next;
+       break;
+      }
+      scanPtr = next;
+    }
+  }
+  else
+    freePtr_ = allObjectsList_.next();
+  lastTraced_ = 0;
+  for (Object *p = freePtr_; p != oldFreePtr; p = p->next()) {
+    if (!p->hasFinalizer_)
+      break;
+    p->finalize();
+  }
+#ifdef DEBUG
+    check();
+#endif
+  return nLive;
+}
+
+void Collector::makePermanent(Object *obj)
+{
+  if (!obj->hasSubObjects()) {
+    // Handle the simple case quickly.
+    if (obj->color() != Object::permanentColor) {
+      totalObjects_--;
+      obj->setColor(Object::permanentColor);
+      obj->readOnly_ = 1;
+      if (obj->hasFinalizer_)
+       obj->moveAfter(&permanentFinalizersList_);
+      else {
+       obj->next_->prev_ = obj->prev_;
+       obj->prev_->next_ = obj->next_;
+      }
+    }
+  }
+  else {
+    Object::Color saveColor = currentColor_;
+    currentColor_ = Object::permanentColor;
+    lastTraced_ = &allObjectsList_;
+    trace(obj);
+    if (lastTraced_ != &allObjectsList_) {
+      Object *scanPtr = allObjectsList_.next();
+      for (;;) {
+       scanPtr->readOnly_ = 1;
+       if (scanPtr->hasSubObjects())
+         scanPtr->traceSubObjects(*this);
+       totalObjects_--;
+       Object *next = scanPtr->next();
+       if (scanPtr->hasFinalizer_)
+         scanPtr->moveAfter(&permanentFinalizersList_);
+       else {
+         // unlink from allObjectsList_
+         scanPtr->next_->prev_ = scanPtr->prev_;
+         scanPtr->prev_->next_ = scanPtr->next_;
+       }
+       if (scanPtr == lastTraced_)
+         break;
+       scanPtr = next;
+      }
+    }
+    lastTraced_ = 0;
+    currentColor_ = saveColor;
+  }
+}
+
+void Collector::makeReadOnly1(Object *obj)
+{
+  Object::Color saveColor = currentColor_;
+  currentColor_ = (currentColor_ == Object::someColor 
+                  ? Object::anotherColor
+                  : Object::someColor);
+  lastTraced_ = &allObjectsList_;
+  trace(obj);
+  if (lastTraced_ != &allObjectsList_) {
+    Object *scanPtr = allObjectsList_.next();
+    Object *firstNonFinal = 0;
+    Object *lim;
+    for (;;) {
+      if (scanPtr->hasSubObjects())
+       scanPtr->traceSubObjects(*this);
+      Object *next = scanPtr->next();
+      if (scanPtr->hasFinalizer_)
+       scanPtr->moveAfter(&allObjectsList_);
+      else if (!firstNonFinal)
+       firstNonFinal = scanPtr;
+      if (scanPtr == lastTraced_) {
+       lim = next;
+       break;
+      }
+      scanPtr = next;
+    }
+    // We have 1 or more objects to be made read-only in currentColor
+    // Followed by 0 or more objects with finalizers in saveColor
+    // Followed by 0 or more objects without finalizers in saveColor
+    for (scanPtr = allObjectsList_.next(); scanPtr != lim; scanPtr = scanPtr->next()) {
+      scanPtr->readOnly_ = 1;
+      scanPtr->setColor(saveColor);
+    }
+    if (firstNonFinal) {
+      for (;
+           scanPtr != freePtr_ && scanPtr->hasFinalizer_;
+          scanPtr = scanPtr->next())
+       ;
+      if (scanPtr != lim) {
+       Object *last = lim->prev();
+       // Move section of list from firstNonFinal up to lastTraced but not including
+       // lim to before scanPtr
+       firstNonFinal->prev()->next_ = last->next();
+       last->next()->prev_ = firstNonFinal->prev();
+       firstNonFinal->prev_ = scanPtr->prev();
+       last->next_ = scanPtr->prev()->next();
+       firstNonFinal->prev()->next_ = firstNonFinal;
+       last->next()->prev_ = last;
+      }
+    }
+  }
+  lastTraced_ = 0;
+  currentColor_ = saveColor;
+#ifdef DEBUG
+  check();
+#endif
+} 
+
+void Collector::traceDynamicRoots()
+{
+  for (DynamicRoot *p = dynRootList_.next_; p != &dynRootList_; p = p->next_)
+    p->trace(*this);
+}
+
+Collector::DynamicRoot::~DynamicRoot()
+{
+  unlink();
+}
+
+void Collector::unallocateObject(void *obj)
+{
+  ((Object *)obj)->moveAfter(freePtr_);
+}
diff --git a/style/Collector.h b/style/Collector.h
new file mode 100644 (file)
index 0000000..3328da0
--- /dev/null
@@ -0,0 +1,247 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef Collector_INCLUDED
+#define Collector_INCLUDED 1
+
+#include <stddef.h>
+#include "Boolean.h"
+
+// A garbage collector.
+
+class Collector {
+public:
+  struct Block;
+
+  class Object {
+    friend struct Block;
+    friend class Collector;
+  public:
+    bool readOnly() const { return readOnly_; }
+    bool permanent() const { return color_ == permanentColor; }
+  protected:
+    Object() : readOnly_(0) { }
+    virtual ~Object() { }
+    // If we copy an object, don't copy inappropriate info.
+    Object(const Object &obj) { hasSubObjects_ = obj.hasSubObjects_; }
+    // For objects with subobjects, this must be overriden
+    // to call Collector::trace for each direct subobject.
+    virtual void traceSubObjects(Collector &) const { }
+  private:
+    enum Color {
+      someColor,
+      anotherColor,
+      permanentColor
+    };
+    Object *next() const { return next_; }
+    Object *prev() const { return prev_; }
+    void makeHead() { prev_ = next_ = this; }
+    Color color() const { return Color(color_); }
+    void setColor(Color color) { color_ = color; }
+    void moveAfter(Object *tail);
+    bool hasSubObjects() const { return hasSubObjects_; }
+    void finalize() { this->~Object(); }
+  private:
+    Object *prev_;
+    Object *next_;
+    char color_;
+    char hasFinalizer_;
+  protected:
+    char hasSubObjects_;
+    char readOnly_;
+  };
+
+  class DynamicRoot {
+  public:
+    DynamicRoot(Collector &);
+    virtual ~DynamicRoot();
+    virtual void trace(Collector &) const { }
+    DynamicRoot(const DynamicRoot &);
+    void operator=(const DynamicRoot &);
+  private:
+    DynamicRoot();
+    void link(const DynamicRoot *);
+    void unlink();
+
+    DynamicRoot *next_;
+    DynamicRoot *prev_;
+  friend class Collector;
+  };
+
+  class ObjectDynamicRoot : public DynamicRoot {
+  public:
+    ObjectDynamicRoot(Collector &, Object * = 0);
+    ObjectDynamicRoot &operator=(Object *obj);
+    void trace(Collector &) const;
+    operator Object *() const { return obj_; }
+  private:
+    Object *obj_;
+  };
+
+  struct Block {
+    Block(Block *, size_t, size_t, Object *);
+    ~Block();
+    Block *next;
+    Object *firstObj;
+  };
+
+  Collector(size_t maxSize);
+  virtual ~Collector();
+  void *allocateObject(bool hasFinalizer);
+  // This is called only when the constructor throws an exception.
+  void unallocateObject(void *);
+  void trace(const Object *obj);
+  // Permanent objects must not be altered in such a way that
+  // they contain pointers to non-permanent objects.
+  void makePermanent(Object *);
+  // Returns the number of live objects.
+  unsigned long collect();
+  void makeReadOnly(Object *);
+  bool objectMaybeLive(Object *);
+protected:
+  virtual void traceStaticRoots() const { }
+private:
+  Collector(const Collector &);        // undefined
+  void operator=(const Collector &); // undefined
+  Object *freePtr_;
+  Object allObjectsList_;      // doubly-linked circular list of all objects
+  Object permanentFinalizersList_;
+  Object *lastTraced_;
+  DynamicRoot dynRootList_;    // doubly-linked circular list
+  Object::Color currentColor_;
+  Block *blocks_;
+  unsigned long totalObjects_;
+  size_t maxSize_;
+
+  void makeSpace();
+  void traceDynamicRoots();
+  void check();
+  void makeReadOnly1(Object *);
+  friend class DynamicRoot;
+  friend class Object;
+};
+
+
+inline
+void Collector::Object::moveAfter(Object *tail)
+{
+  // unlink from old position
+    next_->prev_ = prev_;
+  prev_->next_ = next_;
+  // link in following tail
+    next_ = tail->next_;
+  tail->next_->prev_ = this;
+  prev_ = tail;
+  tail->next_ = this;
+}
+
+inline
+void *Collector::allocateObject(bool hasFinalizer)
+{
+  if (freePtr_ == &allObjectsList_)
+    makeSpace();
+  Object *tem = freePtr_;
+  freePtr_ = freePtr_->next();
+  tem->setColor(currentColor_);
+  tem->hasFinalizer_ = hasFinalizer;
+  if (hasFinalizer)
+    tem->moveAfter(&allObjectsList_);
+  return tem;
+}
+
+inline
+void Collector::trace(const Object *obj)
+{
+  if (obj && obj->color() != currentColor_
+      && obj->color() != Object::permanentColor) {
+    ((Object *)obj)->setColor(currentColor_);
+    ((Object *)obj)->moveAfter(lastTraced_);
+    lastTraced_ = (Object *)obj;
+  }
+}
+
+inline
+void Collector::DynamicRoot::link(const DynamicRoot *root)
+{
+  DynamicRoot *list = (DynamicRoot *)root;
+  // link in just after list
+  prev_ = list;
+  next_ = list->next_;
+  list->next_->prev_ = this;
+  list->next_ = this;
+}
+
+inline
+void Collector::DynamicRoot::unlink()
+{
+  next_->prev_ = prev_;
+  prev_->next_ = next_;
+}
+
+inline
+Collector::DynamicRoot::DynamicRoot(Collector &c)
+{
+  link(&c.dynRootList_);
+}
+
+inline
+Collector::DynamicRoot::DynamicRoot()
+: next_(this), prev_(this)
+{
+}
+
+inline
+Collector::DynamicRoot::DynamicRoot(const DynamicRoot &root)
+{
+  link(&root);
+}
+
+inline
+void Collector::DynamicRoot::operator=(const DynamicRoot &root)
+{
+  unlink();
+  link(&root);
+}
+
+inline
+Collector::ObjectDynamicRoot::ObjectDynamicRoot(Collector &c, Object *obj)
+: Collector::DynamicRoot(c), obj_(obj)
+{
+}
+
+inline
+Collector::ObjectDynamicRoot &
+Collector::ObjectDynamicRoot::operator=(Object *obj)
+{
+  obj_ = obj;
+  return *this;
+}
+
+inline
+void Collector::ObjectDynamicRoot::trace(Collector &c) const
+{
+  c.trace(obj_);
+}
+
+inline
+Collector::Block::~Block()
+{
+  ::operator delete(firstObj);
+}
+
+inline
+bool Collector::objectMaybeLive(Object *obj)
+{
+  return obj->color() == currentColor_ || obj->color() == Object::permanentColor;
+}
+
+inline
+void Collector::makeReadOnly(Object *obj)
+{
+  if (!obj->hasSubObjects())
+    obj->readOnly_ = 1;
+  else if (!obj->readOnly())
+    makeReadOnly1(obj);
+}
+
+#endif /* not Collector_INCLUDED */
diff --git a/style/DssslApp.cxx b/style/DssslApp.cxx
new file mode 100644 (file)
index 0000000..b4a45d9
--- /dev/null
@@ -0,0 +1,437 @@
+// Copyright (c) 1996, 1997 James Clark
+// See the file copying.txt for copying permission.
+
+#include "stylelib.h"
+#include "DssslApp.h"
+#include "StorageManager.h"
+#include "DssslAppMessages.h"
+#include "StyleEngine.h"
+#include "sptchar.h"
+#include "macros.h"
+#include "LocNode.h"
+#include "SdNode.h"
+#include "InputSource.h"
+#include "jade_version.h"
+#include "ArcEngine.h"
+#include "Entity.h"
+#include "MessageTable.h"
+
+#include <ctype.h>
+#include <string.h>
+
+#ifdef SP_HAVE_LOCALE
+#ifdef SP_HAVE_WCHAR
+#include <locale.h>
+#endif
+#endif
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+DssslApp::DssslApp(int unitsPerInch)
+: GroveApp("unicode"), unitsPerInch_(unitsPerInch),
+  dssslSpecOption_(0), debugMode_(0), dsssl2_(0),
+  strictMode_(0)
+{
+  registerOption('G');
+  registerOption('2');
+  registerOption('d', SP_T("dsssl_spec"));
+  registerOption('V', SP_T("variable[=value]"));
+  registerOption('s');
+}
+
+int DssslApp::init(int argc, AppChar **argv)
+{
+  int ret = GroveApp::init(argc, argv);
+#ifdef SP_HAVE_LOCALE
+#ifdef SP_HAVE_WCHAR
+  // Since we use strtod(), must have C numeric
+  setlocale(LC_NUMERIC, "C");
+#endif
+#endif
+  MessageTable::instance()->registerMessageDomain(jstyleModule,
+                                               OPENJADE_MESSAGE_DOMAIN,
+                                               OPENJADE_LOCALE_DIR);
+  return ret;
+}
+
+int DssslApp::processSysid(const StringC &sysid)
+{
+  rootSystemId_ = sysid;
+  ParsedSystemId v;
+  if (!entityManager()->parseSystemId(sysid, systemCharset(), 0, 0,
+                                     *this, v))
+    return 0;
+  for (size_t i = v.size(); i > 0; i--)
+    if (v[i - 1].storageManager->inheritable()) {
+      ParsedSystemId specId;
+      specId.resize(1);
+      StorageObjectSpec &spec = specId[0];
+      spec = v[i - 1];
+      StringC &s = spec.specId;
+      // replace an up to 5 character extension with .dsl
+      for (size_t j = 0; j < 5; j++) {
+       if (s.size() < j + 1)
+         break;
+       if (s[s.size() - j - 1] == '.') {
+         s.resize(s.size() - j - 1);
+         break;
+       }
+      }
+      if (strcmp(v[i - 1].storageManager->type(), "OSFILE") == 0)
+       defaultOutputBasename_ = s;
+      if (!dssslSpecOption_) {
+       static const Char ext[] = { '.', 'd', 's', 'l' };
+        s.append(ext, SIZEOF(ext));
+       specId.unparse(systemCharset(), 0, dssslSpecSysid_);
+      }
+      break;
+    }
+  return GroveApp::processSysid(sysid);
+}
+
+void DssslApp::processOption(AppChar opt, const AppChar *arg)
+{
+  switch (opt) {
+  case 'G':
+    debugMode_ = 1;
+    break;
+  case '2':
+    dsssl2_ = 1;
+    break;
+  case 'd':
+    dssslSpecId_.resize(0);
+    dssslSpecSysid_ = convertInput(arg);
+    dssslSpecOption_ = 1;
+    splitOffId(dssslSpecSysid_, dssslSpecId_);
+    break;
+  case 'V':
+    defineVars_.push_back(convertInput(arg));
+    break;
+  case 's':
+    strictMode_ = 1;
+    break;
+  case 'v':
+    message(DssslAppMessages::versionInfo,
+           StringMessageArg(convertInput(SP_T(OPENJADE_PACKAGE))),
+           StringMessageArg(convertInput(SP_T(OPENJADE_VERSION))));
+    // fall through
+  default:
+    GroveApp::processOption(opt, arg);
+  }
+}
+
+void DssslApp::splitOffId(StringC &sysid, StringC &id)
+{
+  id.resize(0);
+  for (size_t i = sysid.size(); i > 0; i--) {
+    if (sysid[i - 1] == '#') {
+      id.assign(sysid.data() + i,
+               sysid.size() - i);
+      sysid.resize(i - 1);
+      break;
+    }
+  }
+}
+
+int DssslApp::generateEvents(ErrorCountEventHandler *eceh)
+{
+  groveTable_.insert(rootSystemId_, rootNode_);
+  // Since the thread parsing the DSSSL spec is a different thread
+  // from the thread parsing the document, we can't share an
+  // entity manager.
+  // The document parser has already been inited and so will
+  // use the current entity manager.
+  // The spec parser hasn't yet been inited and so will use
+  // a new entity manager.
+  // The parser thread is started in GroveApp::generateEvents
+  // which hasn't happened yet.
+  clearEntityManager();
+  return GroveApp::generateEvents(eceh);
+}
+
+Boolean DssslApp::getDssslSpecFromGrove()
+{
+  NodeListPtr nl;
+  if (rootNode_->getProlog(nl) != accessOK)
+    return 0;
+  for (;;) {
+    NodePtr nd;
+    if (nl->first(nd) != accessOK)
+      break;
+    GroveString pi;
+    if (nd->getSystemData(pi) == accessOK) {
+      Location loc;
+      const LocNode *lnd = LocNode::convert(nd);
+      if (lnd)
+       lnd->getLocation(loc);
+      if (getDssslSpecFromPi(pi.data(), pi.size(), loc))
+       return 1;
+    }
+    if (nl.assignRest() != accessOK)
+      break;
+  }
+  return 0;
+}
+
+Boolean DssslApp::getDssslSpecFromPi(const Char *s, size_t n,
+                                    const Location &loc)
+{
+  static struct {
+    const char *key;
+    Boolean (DssslApp::*handler)(const Char *s, size_t, const Location &);
+  } pis[] = {
+    { "xml-stylesheet", &DssslApp::handleAttlistPi },
+    { "xml:stylesheet", &DssslApp::handleAttlistPi },
+    { "stylesheet", &DssslApp::handleAttlistPi },
+    { "dsssl", &DssslApp::handleSimplePi },
+  };
+  for (size_t i = 0; i < SIZEOF(pis); i++) {
+    size_t len = strlen(pis[i].key);
+    if (n >= len
+        && matchCi(s, len, pis[i].key)
+       && (n == len || isS(s[len]))) {
+      s += len;
+      n -= len;
+      return (this->*pis[i].handler)(s, n, loc);
+    }
+  }
+  return 0;
+}
+
+Boolean DssslApp::handleSimplePi(const Char *s, size_t n,
+                                const Location &loc)
+{
+  skipS(s, n);
+  if (n == 0)
+    return 0;
+  StringC sysid(s, n);
+  splitOffId(sysid, dssslSpecId_);
+  return entityManager()->expandSystemId(sysid, loc, 0, systemCharset(), 0, *this,
+                                        dssslSpecSysid_);
+}
+
+Boolean DssslApp::handleAttlistPi(const Char *s, size_t n,
+                                 const Location &loc)
+{
+  // FIXME maybe give warnings if syntax is wrong
+  Boolean hadHref = 0;
+  StringC href;
+  Boolean isDsssl = 0;
+  StringC name;
+  StringC value;
+  while (getAttribute(s, n, name, value)) {
+    if (matchCi(name, "type")) {
+      static const char *types[] = {
+       "text/dsssl",
+       "text/x-dsssl",
+       "application/dsssl",
+       "application/x-dsssl"
+      };
+      for (size_t i = 0; i < SIZEOF(types); i++)
+       if (matchCi(value, types[i])) {
+         isDsssl = 1;
+         break;
+       }
+      if (!isDsssl)
+       return 0;
+    }
+    else if (matchCi(name, "href")) {
+      hadHref = 1;
+      value.swap(href);
+    }
+  }
+  if (!isDsssl || !hadHref)
+    return 0;
+  splitOffId(href, dssslSpecId_);
+  // FIXME should use location of attribute value rather than location of PI
+  return entityManager()->expandSystemId(href, loc, 0, systemCharset(), 0, *this,
+                                        dssslSpecSysid_);
+}
+
+void DssslApp::skipS(const Char *&s, size_t &n)
+{
+  while (n > 0 && isS(*s))
+    s++, n--;
+}
+
+Boolean DssslApp::isS(Char c)
+{
+  return c <= CHAR_MAX && isspace((unsigned char)c);
+}
+
+Boolean DssslApp::matchCi(const StringC &s, const char *key)
+{
+  return matchCi(s.data(), s.size(), key);
+}
+
+Boolean DssslApp::matchCi(const Char *s, size_t n, const char *key)
+{
+  for (; *key; key++, s++, n--) {
+    if (!n)
+      return 0;
+    if (*s != tolower(*key) && *s != toupper(*key))
+      return 0;
+  }
+  return n == 0;
+}
+
+Boolean DssslApp::getAttribute(const Char *&s, size_t &n,
+                              StringC &name, StringC &value)
+{
+  name.resize(0);
+  value.resize(0);
+  skipS(s, n);
+  for (;;) {
+    if (n == 0)
+      return 0;
+    if (*s == '=' || isS(*s))
+      break;
+    name += *s;
+    s++, n--;
+  }
+  skipS(s, n);
+  if (n == 0 || *s != '=')
+    return 0;
+  s++, n--;
+  skipS(s, n);
+  Char quote = 0;
+  if (n > 0 && (*s == '"' || *s == '\'')) {
+    quote = *s;
+    s++, n--;
+  }
+  for (;;) {
+    if (n == 0) {
+      if (quote)
+       return 0;
+      break;
+    }
+    if (quote) {
+      if (*s == quote) {
+       s++, n--;
+       break;
+      }
+    }
+    else if (isS(*s))
+      break;
+    value += *s;
+    s++, n--;
+  }
+  // FIXME resolve numeric character references
+  return 1;
+}
+
+Boolean DssslApp::initSpecParser()
+{
+  if (!dssslSpecOption_ && !getDssslSpecFromGrove() && dssslSpecSysid_.size() == 0) {
+    message(DssslAppMessages::noSpec);
+    return 0;
+  }
+  SgmlParser::Params params;
+  params.sysid = dssslSpecSysid_;
+  params.entityManager = entityManager().pointer();
+  params.options = &options_;
+  specParser_.init(params);
+  specParser_.allLinkTypesActivated();
+  return 1;
+}
+
+void DssslApp::processGrove()
+{
+  if (!initSpecParser())
+    return;
+  const FOTBuilder::Extension *extensions = 0;
+  Owner<FOTBuilder> fotb(makeFOTBuilder(extensions));
+  if (!fotb)
+    return;
+  StyleEngine se(*this, *this, unitsPerInch_, debugMode_, 
+                 dsssl2_, strictMode_, extensions);
+  for (size_t i = 0; i < defineVars_.size(); i++)
+    se.defineVariable(defineVars_[i]);
+  se.parseSpec(specParser_, systemCharset(), dssslSpecId_, *this);
+  se.process(rootNode_, *fotb);
+}
+
+bool DssslApp::load(const StringC &sysid, const Vector<StringC> &active,
+                   const NodePtr &parent, NodePtr &rootNode, const Vector<StringC> &architecture)
+{
+  SgmlParser::Params params;
+  params.sysid = sysid;
+  const NodePtr *ndp = groveTable_.lookup(params.sysid);
+  if (ndp) {
+    rootNode = *ndp;
+    return 1;
+  }
+  ErrorCountEventHandler *eceh;
+  const SdNode *sdNode;
+  NodePtr parentRoot;
+  if (parent
+      && parent->getGroveRoot(parentRoot) == accessOK
+      && (sdNode = SdNode::convert(parentRoot)) != 0
+      && sdNode->getSd(params.sd, params.prologSyntax, params.instanceSyntax) == accessOK) {
+    params.entityType = SgmlParser::Params::subdoc;
+    eceh = GroveBuilder::make(groveTable_.count() + 1, this, this, 0,
+                             params.sd, params.prologSyntax, params.instanceSyntax,
+                             rootNode);
+  }
+  else
+    eceh = GroveBuilder::make(groveTable_.count() + 1, this, this, 0, rootNode);
+  Owner<EventHandler> eh(eceh);
+  groveTable_.insert(params.sysid, rootNode);
+  params.entityManager = entityManager().pointer();
+  params.options = &options_;
+  SgmlParser parser;
+  parser.init(params);
+
+  for (size_t i = 0; i < active.size(); i++)
+    parser.activateLinkType(active[i]);
+  parser.allLinkTypesActivated();
+
+  if (architecture.size() > 0) {
+    SelectOneArcDirector director(architecture, *eh);
+    ArcEngine::parseAll(parser, director, director, eceh->cancelPtr());
+  }
+  else
+    parser.parseAll(*eh, eceh->cancelPtr());
+  return 1;
+}
+
+void DssslApp::mapSysid(StringC &sysid)
+{
+ // map a sysid according to SYSTEM catalog entries. 
+  ConstPtr<EntityCatalog> 
+     catalog(entityManager()->makeCatalog(sysid, systemCharset(), *this));
+  Text txt;
+  Location loc;
+  txt.addChars(sysid, loc);
+  ExternalId extid;
+  extid.setSystem(txt);
+  StringC name;
+  ExternalTextEntity ent(name, EntityDecl::generalEntity, loc, extid);
+  catalog->lookup(ent, *(parser().instanceSyntax()), systemCharset(), 
+                  *this, sysid); 
+}
+
+bool DssslApp::readEntity(const StringC &sysid, StringC &contents) 
+{
+  Owner<InputSource> in(entityManager()->open(sysid,
+                                             systemCharset(),
+                                             InputSourceOrigin::make(),
+                                             0,
+                                             *this));
+  if (!in)
+    return 0;
+  for (;;) {
+    Xchar c = in->get(*this);
+    if (c == InputSource::eE)
+      break;
+    in->extendToBufferEnd();
+    contents.append(in->currentTokenStart(), in->currentTokenLength());
+  }
+  return !in->accessError();
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
diff --git a/style/DssslApp.h b/style/DssslApp.h
new file mode 100644 (file)
index 0000000..5ef56b5
--- /dev/null
@@ -0,0 +1,65 @@
+// Copyright (c) 1996, 1997 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef DssslApp_INCLUDED
+#define DssslApp_INCLUDED 1
+
+#include "GroveApp.h"
+#include "FOTBuilder.h"
+#include "GroveManager.h"
+#include "dsssl_ns.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class STYLE_API DssslApp : public GroveApp, public GroveManager {
+public:
+  DssslApp(int unitsPerInch);
+  virtual FOTBuilder *makeFOTBuilder(const FOTBuilder::Extension *&) = 0;
+  int processSysid(const StringC &);
+  bool load(const StringC &sysid, const Vector<StringC> &active,
+           const NodePtr &parent, NodePtr &rootNode,
+           const Vector<StringC> &architecture);
+  bool readEntity(const StringC &, StringC &);
+  void mapSysid(StringC &);
+protected:
+  void processOption(AppChar opt, const AppChar *arg);
+  int init(int argc, AppChar **argv);
+  int unitsPerInch_;
+  StringC defaultOutputBasename_;
+private:
+  void processGrove();
+  int generateEvents(ErrorCountEventHandler *eceh);
+  Boolean getDssslSpecFromGrove();
+  Boolean getDssslSpecFromPi(const Char *s, size_t n,
+                            const Location &loc);
+  static void splitOffId(StringC &, StringC &);
+  Boolean handleSimplePi(const Char *, size_t, const Location &);
+  Boolean handleAttlistPi(const Char *, size_t, const Location &);
+  static void skipS(const Char *&s, size_t &n);
+  static Boolean isS(Char c);
+  static Boolean matchCi(const StringC &s, const char *key);
+  static Boolean matchCi(const Char *s, size_t n, const char *key);
+  static Boolean getAttribute(const Char *&s, size_t &n,
+                             StringC &name, StringC &value);
+  Boolean initSpecParser();
+
+  Boolean dssslSpecOption_;
+  StringC dssslSpecSysid_; // system ID of doc
+  StringC dssslSpecId_; // unique ID in doc
+  // Variables to be defined as true
+  Vector<StringC> defineVars_;
+  SgmlParser specParser_;
+  HashTable<StringC,NodePtr> groveTable_;
+  StringC rootSystemId_;
+  bool debugMode_;
+  bool dsssl2_;
+  bool strictMode_;
+};
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not DssslApp_INCLUDED */
diff --git a/style/DssslAppMessages.msg b/style/DssslAppMessages.msg
new file mode 100644 (file)
index 0000000..066a40e
--- /dev/null
@@ -0,0 +1,7 @@
+# Copyright (c) 1996 James Clark
+# See the file COPYING for copying permission
+
+=2000
+
+I2+versionInfo++%1 version %2
+E0+noSpec++no DSSSL specification: use -d to specify
diff --git a/style/DssslSpecEventHandler.cxx b/style/DssslSpecEventHandler.cxx
new file mode 100644 (file)
index 0000000..79041b8
--- /dev/null
@@ -0,0 +1,635 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#include "stylelib.h"
+#include "DssslSpecEventHandler.h"
+#include "InterpreterMessages.h"
+#include "InternalInputSource.h"
+#include "FOTBuilder.h"
+#include "macros.h"
+#include "Node.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+// FIXME Stop parsing spec when we know we don't we have everything we ever need
+
+class TextInputSourceOrigin : public InputSourceOrigin {
+public:
+  TextInputSourceOrigin(Text &text);
+  Boolean defLocation(Offset off, const Origin *&, Index &) const;
+  const Text &text() const { return text_; }
+  void noteCharRef(Index, const NamedCharRef &);
+  void setExternalInfo(ExternalInfo *);
+  InputSourceOrigin *copy() const;
+  const Location &parent() const;
+private:
+  Text text_;
+  Location refLocation_;
+};
+
+DssslSpecEventHandler::DssslSpecEventHandler(Messenger &mgr)
+: mgr_(&mgr), gatheringBody_(0), currentPart_(0), currentDoc_(0), 
+currentDecl_(0)
+{
+}
+
+void DssslSpecEventHandler::load(SgmlParser &specParser,
+                                const CharsetInfo &charset,
+                                const StringC &id,
+                                Vector<Part *> &parts)
+{
+  parser_ = &specParser;
+  charset_ = &charset;
+  Doc *doc = findDoc(StringC());
+  // Load it now so that we can get the concrete syntax.
+  doc->load(*this);
+  Part *tem;
+  if (id.size() == 0)
+    tem = doc->resolveFirstPart(*this);
+  else {
+    StringC normId(id);
+    ConstPtr<Syntax> syn = parser_->instanceSyntax();
+    if (!syn.isNull())
+      syn->generalSubstTable()->subst(normId);
+    tem = doc->refPart(normId)->resolve(*this);
+  }
+  resolveParts(tem, parts);
+}
+
+DssslSpecEventHandler::Doc *DssslSpecEventHandler::findDoc(const StringC &sysid)
+{
+  for (IListIter<Doc> iter(docs_); !iter.done(); iter.next())
+    if (sysid == iter.cur()->sysid())
+      return iter.cur();
+  Doc *doc = new Doc(sysid);
+  docs_.insert(doc);
+  return doc;
+}
+
+void DssslSpecEventHandler::resolveParts(Part *part, Vector<Part *> &parts)
+{
+  if (!part)
+    return;
+  parts.push_back(part);
+  if (part->setMark()) {
+    mgr_->message(InterpreterMessages::useLoop);
+    return;
+  }
+  const Vector<PartHeader *> &use = part->use();
+  for (size_t i = 0; i < use.size(); i++) {
+    Part *tem = use[i]->resolve(*this);
+    resolveParts(tem, parts);
+  }
+  part->setMark(0);
+}
+
+void DssslSpecEventHandler::loadDoc(SgmlParser &parser, Doc &doc)
+{
+  currentDoc_ = &doc;
+  gotArc_ = 0;
+  ArcEngine::parseAll(parser, *mgr_, *this, cancelPtr());
+  if (!gotArc_) {
+    mgr_->message(InterpreterMessages::specNotArc);
+    return;
+  }
+}
+
+
+EventHandler *
+DssslSpecEventHandler::arcEventHandler(const StringC *arcPublicId,
+                                       const Notation *notation,
+                                      const Vector<StringC> &,
+                                      const SubstTable *)
+{
+  if (!notation)
+    return 0;
+  const StringC *pubid = notation->externalId().publicIdString();
+  static const char dssslArc[]
+    = "ISO/IEC 10179:1996//NOTATION DSSSL Architecture Definition Document//EN";
+  if (pubid == 0 || pubid->size() != sizeof(dssslArc) - 1)
+    return 0;
+  for (int i = 0; dssslArc[i] != '\0'; i++) {
+    if (dssslArc[i] != (*pubid)[i])
+      return 0;
+  }
+  gotArc_ = 1;
+  return this;
+}
+
+void DssslSpecEventHandler::message(MessageEvent *event)
+{
+  mgr_->dispatchMessage(event->message());
+  delete event;
+}
+
+static struct {
+  const char *gi;
+  void (DssslSpecEventHandler::*start)(const StartElementEvent &);
+  void (DssslSpecEventHandler::*end)(const EndElementEvent &);
+} mappingTable[] = {
+  { "STYLE-SPECIFICATION",
+    &DssslSpecEventHandler::styleSpecificationStart,
+    &DssslSpecEventHandler::styleSpecificationEnd },
+  { "STYLE-SPECIFICATION-BODY",
+    &DssslSpecEventHandler::styleSpecificationBodyStart,
+    &DssslSpecEventHandler::styleSpecificationBodyEnd },
+  { "EXTERNAL-SPECIFICATION",
+    &DssslSpecEventHandler::externalSpecificationStart,
+    &DssslSpecEventHandler::externalSpecificationEnd },
+  { "FEATURES", 
+    &DssslSpecEventHandler::declarationStart,
+    &DssslSpecEventHandler::declarationEnd },
+  { "BASESET-ENCODING", 
+    &DssslSpecEventHandler::declarationStart,
+    &DssslSpecEventHandler::declarationEnd },
+  { "LITERAL-DESCRIBED-CHAR", 
+    &DssslSpecEventHandler::declarationStart,
+    &DssslSpecEventHandler::declarationEnd },
+  { "ADD-NAME-CHARS",
+    &DssslSpecEventHandler::declarationStart,
+    &DssslSpecEventHandler::declarationEnd },
+  { "ADD-SEPARATOR-CHARS",
+    &DssslSpecEventHandler::declarationStart,
+    &DssslSpecEventHandler::declarationEnd },
+  { "STANDARD-CHARS", 
+    &DssslSpecEventHandler::declarationStart,
+    &DssslSpecEventHandler::declarationEnd },
+  { "OTHER-CHARS", 
+    &DssslSpecEventHandler::declarationStart,
+    &DssslSpecEventHandler::declarationEnd },
+  { "COMBINE-CHAR", 
+    &DssslSpecEventHandler::declarationStart,
+    &DssslSpecEventHandler::declarationEnd },
+  { "MAP-SDATA-ENTITY", 
+    &DssslSpecEventHandler::declarationStart,
+    &DssslSpecEventHandler::declarationEnd },
+  { "CHAR-REPERTOIRE", 
+    &DssslSpecEventHandler::declarationStart,
+    &DssslSpecEventHandler::declarationEnd },
+  { "SGML-GROVE-PLAN", 
+    &DssslSpecEventHandler::declarationStart,
+    &DssslSpecEventHandler::declarationEnd },
+};
+
+void DssslSpecEventHandler::endProlog(EndPrologEvent *event)
+{
+  currentDoc_->setLocation(event->location());
+  delete event;
+}
+
+void DssslSpecEventHandler::startElement(StartElementEvent *event)
+{
+  for (size_t i = 0; i < SIZEOF(mappingTable); i++)
+    if (event->name() == mappingTable[i].gi) {
+      (this->*(mappingTable[i].start))(*event);
+      break;
+    }
+  delete event;
+}
+
+void DssslSpecEventHandler::endElement(EndElementEvent *event)
+{
+  for (size_t i = 0; i < SIZEOF(mappingTable); i++)
+    if (event->name() == mappingTable[i].gi) {
+      (this->*(mappingTable[i].end))(*event);
+      break;
+    }
+  delete event;
+}
+
+void DssslSpecEventHandler::data(DataEvent *event)
+{
+  if (gatheringBody_)
+    currentBody_.addChars(event->data(), event->dataLength(), event->location());
+  delete event;
+}
+
+const Text *
+DssslSpecEventHandler::attributeText(const StartElementEvent &event,
+                                    const char *attName)
+{
+  const AttributeList &atts = event.attributes();
+  StringC attNameString;
+  for (const char *p = attName; *p; p++)
+    attNameString += Char(*p);
+  unsigned index;
+  if (atts.attributeIndex(attNameString, index)) {
+    const AttributeValue *val = atts.value(index);
+    if (val)
+      return val->text();
+  }
+  return 0;
+}
+
+const StringC *
+DssslSpecEventHandler::attributeString(const StartElementEvent &event,
+                                      const char *attName)
+{
+  const Text *text = attributeText(event, attName);
+  if (text)
+    return &text->string();
+  else
+    return 0;
+}
+
+ConstPtr<Entity>
+DssslSpecEventHandler::attributeEntity(const StartElementEvent &event,
+                                      const char *attName)
+{
+  const AttributeList &atts = event.attributes();
+  StringC attNameString;
+  for (const char *p = attName; *p; p++)
+    attNameString += Char(*p);
+  unsigned index;
+  if (!atts.attributeIndex(attNameString, index))
+    return 0;
+  const AttributeSemantics *sem = atts.semantics(index);
+  if (!sem || sem->nEntities() != 1)
+    return 0;
+  return sem->entity(0);
+}
+
+void DssslSpecEventHandler::externalSpecificationStart(const StartElementEvent &event)
+{
+  StringC empty;
+  const StringC *idP = attributeString(event, "ID");
+  if (!idP)
+    idP = &empty;
+  PartHeader *header = currentDoc_->refPart(*idP);
+  const Entity *ent = attributeEntity(event, "DOCUMENT").pointer();
+  if (!ent)
+    return;
+  const ExternalEntity *ext = ent->asExternalEntity();
+  if (!ext)
+    return;
+  const StringC &sysid = ext->externalId().effectiveSystemId();
+  if (sysid.size()) {
+    Doc *doc = findDoc(sysid);
+    const StringC *specidP = attributeString(event, "SPECID");
+    if (!specidP)
+      header->setPart(new ExternalFirstPart(doc));
+    else
+      header->setPart(new ExternalPart(doc->refPart(*specidP, event.location())));
+  }
+}
+
+void DssslSpecEventHandler::externalSpecificationEnd(const EndElementEvent &)
+{
+  // nothing to do
+}
+
+void DssslSpecEventHandler::styleSpecificationStart(const StartElementEvent &event)
+{
+  StringC empty;
+  const StringC *idP = attributeString(event, "ID");
+  if (!idP)
+    idP = &empty;
+  PartHeader *header = currentDoc_->refPart(*idP);
+  // FIXME give an error (or ignore) if header has part already
+  const Text *useP = attributeText(event, "USE");
+  header->setPart(currentPart_ = new Part(currentDoc_));
+  if (useP) {
+    const StringC &use = useP->string();
+    size_t i = 0;
+    for (;;) {
+      size_t j;
+      for (j = i; j < use.size() && use[j] != ' '; j++)
+       ;
+      if (j > i)
+       currentPart_->addUse(currentDoc_->refPart(StringC(use.data() + i,
+                                                         j - i),
+                                                 useP->charLocation(i)));
+      if (j >= use.size())
+       break;
+      i = j + 1;
+    }
+  }
+  // FIXME Give warning if selected part is incomplete
+}
+
+void DssslSpecEventHandler::styleSpecificationEnd(const EndElementEvent &event)
+{
+  currentPart_ = 0;
+}
+
+void DssslSpecEventHandler::styleSpecificationBodyStart(const StartElementEvent &event)
+{
+  if (currentPart_) {
+    currentBody_.clear();
+    ConstPtr<Entity> entity = attributeEntity(event, "CONTENT");
+    if (entity.isNull())
+      gatheringBody_ = 1;
+    else
+      currentPart_->append(new EntityBodyElement(entity));
+  }
+}
+
+void DssslSpecEventHandler::styleSpecificationBodyEnd(const EndElementEvent &event)
+{
+  if (gatheringBody_) {
+    if (currentPart_)
+      currentPart_->append(new ImmediateBodyElement(currentBody_));
+    gatheringBody_ = 0;
+  }
+}
+
+void DssslSpecEventHandler::declarationStart(const StartElementEvent &event)
+{
+   if (currentPart_ || currentDoc_) {
+     currentBody_.clear();
+     gatheringBody_ = 1;
+     DssslSpecEventHandler::DeclarationElement::Type type;
+     if (event.name() == "FEATURES")
+       type = DssslSpecEventHandler::DeclarationElement::features;
+     else if (event.name() == "BASESET-ENCODING")
+       type = DssslSpecEventHandler::DeclarationElement::basesetEncoding;
+     else if (event.name() == "LITERAL-DESCRIBED-CHAR")
+       type = DssslSpecEventHandler::DeclarationElement::literalDescribedChar;
+     else if (event.name() == "ADD-NAME-CHARS")
+       type = DssslSpecEventHandler::DeclarationElement::addNameChars;
+     else if (event.name() == "ADD-SEPARATOR-CHARS")
+       type = DssslSpecEventHandler::DeclarationElement::addSeparatorChars;
+     else if (event.name() == "STANDARD-CHARS")
+       type = DssslSpecEventHandler::DeclarationElement::standardChars;
+     else if (event.name() == "OTHER-CHARS")
+       type = DssslSpecEventHandler::DeclarationElement::otherChars;
+     else if (event.name() == "COMBINE-CHAR")
+       type = DssslSpecEventHandler::DeclarationElement::combineChar;
+     else if (event.name() == "MAP-SDATA-ENTITY")
+       type = DssslSpecEventHandler::DeclarationElement::mapSdataEntity;
+     else if (event.name() == "CHAR-REPERTOIRE")
+       type = DssslSpecEventHandler::DeclarationElement::charRepertoire;
+     else if (event.name() == "SGML-GROVE-PLAN")
+       type = DssslSpecEventHandler::DeclarationElement::sgmlGrovePlan;
+     currentDecl_ = new DeclarationElement(type);
+     const StringC *str; 
+     if (str = attributeString(event, "NAME"))
+        currentDecl_->setName(*str);
+     if (str = attributeString(event, "TEXT"))
+        currentDecl_->setText(*str);
+     if (str = attributeString(event, "MODADD"))
+        currentDecl_->setModadd(*str);
+     if (str = attributeString(event, "DESC"))
+        currentDecl_->setDesc(*str);
+   }
+}
+
+void DssslSpecEventHandler::declarationEnd(const EndElementEvent &event) 
+{ 
+   if (gatheringBody_ && currentDecl_) { 
+     currentDecl_->setContent(currentBody_);
+     if (currentPart_) 
+       currentPart_->append(currentDecl_); 
+     else 
+       currentDoc_->append(currentDecl_); 
+     gatheringBody_ = 0; 
+     currentDecl_ = 0;
+   } 
+}
+
+TextInputSourceOrigin::TextInputSourceOrigin(Text &text)
+{
+  text_.swap(text);
+}
+
+Boolean TextInputSourceOrigin::defLocation(Offset off, const Origin *&origin, Index &index) const
+{
+  return text_.charLocation(off, origin, index);
+}
+
+void TextInputSourceOrigin::noteCharRef(Index, const NamedCharRef &)
+{
+  CANNOT_HAPPEN();
+}
+
+void TextInputSourceOrigin::setExternalInfo(ExternalInfo *)
+{
+  CANNOT_HAPPEN();
+}
+
+InputSourceOrigin *TextInputSourceOrigin::copy() const
+{
+  return new TextInputSourceOrigin(*this);
+}
+
+const Location &TextInputSourceOrigin::parent() const
+{
+  return refLocation_;
+}
+
+DssslSpecEventHandler::Doc::Doc()
+: loaded_(0)
+{
+}
+
+DssslSpecEventHandler::Doc::Doc(const StringC &sysid)
+: sysid_(sysid), loaded_(0)
+{
+}
+
+void DssslSpecEventHandler::Doc::setLocation(const Location &loc)
+{
+  loc_ = loc;
+}
+
+DssslSpecEventHandler::Part *
+DssslSpecEventHandler::Doc::resolveFirstPart(DssslSpecEventHandler &eh)
+{
+  load(eh);
+  PartHeader *header = 0;
+  for (IListIter<PartHeader> iter(headers_); !iter.done(); iter.next())
+    header = iter.cur();
+  if (!header) {
+    if (!loc_.origin().isNull()) {
+      eh.mgr_->setNextLocation(loc_);
+      eh.mgr_->message(InterpreterMessages::noParts);
+    }
+    return 0;
+  }
+  return header->resolve(eh);
+}
+
+void DssslSpecEventHandler::Doc::load(DssslSpecEventHandler &eh)
+{
+  if (loaded_)
+    return;
+  loaded_ = 1;
+  if (sysid_.size() > 0) {
+    SgmlParser::Params params;
+    params.parent = eh.parser_;
+    params.sysid = sysid_;
+    SgmlParser specParser(params);
+    eh.loadDoc(specParser, *this);
+  }
+  else
+    eh.loadDoc(*eh.parser_, *this);
+}
+
+DssslSpecEventHandler::PartHeader *
+DssslSpecEventHandler::Doc::refPart(const StringC &id)
+{
+  for (IListIter<PartHeader> iter(headers_); !iter.done(); iter.next())
+    if (iter.cur()->id() == id)
+      return iter.cur();
+  PartHeader *header = new PartHeader(this, id);
+  headers_.insert(header);
+  return header;
+}
+
+DssslSpecEventHandler::PartHeader *
+DssslSpecEventHandler::Doc::refPart(const StringC &id, const Location &refLoc)
+{
+  PartHeader *header = refPart(id);
+  header->setRefLoc(refLoc);
+  return header;
+}
+
+void
+DssslSpecEventHandler::Doc::append(DeclarationElement *decl)
+{
+  declarations_.append(decl);
+}
+
+DssslSpecEventHandler::BodyElement::~BodyElement()
+{
+}
+
+DssslSpecEventHandler::ImmediateBodyElement::ImmediateBodyElement(Text &text)
+{
+  text_.swap(text);
+}
+
+void DssslSpecEventHandler
+::ImmediateBodyElement::makeInputSource(DssslSpecEventHandler &, Owner<InputSource> &in)
+{
+  TextInputSourceOrigin *origin = new TextInputSourceOrigin(text_);
+  in = new InternalInputSource(origin->text().string(), origin);
+}
+
+DssslSpecEventHandler::DeclarationElement::DeclarationElement(Type type) 
+ : type_(type)
+{
+}
+
+void DssslSpecEventHandler
+::DeclarationElement::setContent(Text &content) 
+{
+  content_.swap(content);
+}
+
+void DssslSpecEventHandler
+::DeclarationElement::makeInputSource(DssslSpecEventHandler &, Owner<InputSource> &in)
+{
+  TextInputSourceOrigin *origin = new TextInputSourceOrigin(content_);
+  in = new InternalInputSource(origin->text().string(), origin);
+}
+
+DssslSpecEventHandler::DeclarationElement::Type 
+DssslSpecEventHandler::DeclarationElement::type() const 
+{ 
+  return type_; 
+}
+
+DssslSpecEventHandler
+::EntityBodyElement::EntityBodyElement(const ConstPtr<Entity> &entity)
+: entity_(entity)
+{
+}
+
+void DssslSpecEventHandler
+::EntityBodyElement::makeInputSource(DssslSpecEventHandler &eh,
+                                    Owner<InputSource> &in)
+{
+  const InternalEntity *internal = entity_->asInternalEntity();
+  if (internal) {
+    in = new InternalInputSource(internal->string(),
+                                EntityOrigin::make(entity_, Location()));
+    return;
+  }
+  const StringC &sysid
+    = entity_->asExternalEntity()->externalId().effectiveSystemId();
+  if (sysid.size())
+    in = eh.parser_->entityManager().open(sysid, *eh.charset_, InputSourceOrigin::make(),
+                                         0, *eh.mgr_);
+}
+
+DssslSpecEventHandler::PartHeader::PartHeader(Doc *doc, const StringC &id)
+: doc_(doc), id_(id)
+{
+}
+
+void DssslSpecEventHandler::PartHeader::setRefLoc(const Location &loc)
+{
+  if (refLoc_.origin().isNull())
+    refLoc_ = loc;
+}
+
+DssslSpecEventHandler::Part *
+DssslSpecEventHandler::PartHeader::resolve(DssslSpecEventHandler &eh)
+{
+  doc_->load(eh);
+  if (!specPart_) {
+    eh.mgr_->setNextLocation(refLoc_);
+    eh.mgr_->message(InterpreterMessages::missingPart, StringMessageArg(id_));
+    return 0;
+  }
+  return specPart_->resolve(eh);
+}
+
+DssslSpecEventHandler::SpecPart::~SpecPart()
+{
+}
+
+DssslSpecEventHandler::ExternalPart::ExternalPart(PartHeader *header)
+: header_(header)
+{
+}
+
+DssslSpecEventHandler::Part *
+DssslSpecEventHandler::ExternalPart::resolve(DssslSpecEventHandler &eh)
+{
+  return header_->resolve(eh);
+}
+
+DssslSpecEventHandler::ExternalFirstPart::ExternalFirstPart(Doc *doc)
+: doc_(doc)
+{
+}
+
+DssslSpecEventHandler::Part *
+DssslSpecEventHandler::ExternalFirstPart::resolve(DssslSpecEventHandler &eh)
+{
+  return doc_->resolveFirstPart(eh);
+}
+
+DssslSpecEventHandler::Part::Part(Doc *doc)
+: mark_(0), doc_(doc)
+{
+}
+
+DssslSpecEventHandler::Part *
+DssslSpecEventHandler::Part::resolve(DssslSpecEventHandler &)
+{
+  return this;
+}
+
+void DssslSpecEventHandler::Part::append(BodyElement *element)
+{
+  bodyElements_.append(element);
+}
+
+void DssslSpecEventHandler::Part::append(DeclarationElement *element)
+{
+  declarations_.append(element);
+}
+
+DssslSpecEventHandler::Doc *DssslSpecEventHandler::Part::doc()
+{
+  return doc_;
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
diff --git a/style/DssslSpecEventHandler.h b/style/DssslSpecEventHandler.h
new file mode 100644 (file)
index 0000000..2bfc402
--- /dev/null
@@ -0,0 +1,277 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef DssslSpecEventHandler_INCLUDED
+#define DssslSpecEventHandler_INCLUDED 1
+
+#include "ErrorCountEventHandler.h"
+#include "ArcEngine.h"
+#include "Message.h"
+#include "Text.h"
+#include "Owner.h"
+#include "Boolean.h"
+#include "InputSource.h"
+#include "Vector.h"
+#include "NCVector.h"
+#include "IList.h"
+#include "IListIter.h"
+#include "StringC.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class DssslSpecEventHandler
+: private ErrorCountEventHandler, private ArcDirector {
+public:
+  class BodyElement : public Link {
+  public:
+    virtual ~BodyElement();
+    virtual void makeInputSource(DssslSpecEventHandler &, Owner<InputSource> &) = 0;
+  };
+
+  class ImmediateBodyElement : public BodyElement {
+  public:
+    ImmediateBodyElement(Text &);
+    void makeInputSource(DssslSpecEventHandler &, Owner<InputSource> &);
+  private:
+    Text text_;
+  };
+
+  class EntityBodyElement : public BodyElement {
+  public:
+    EntityBodyElement(const ConstPtr<Entity> &);
+    void makeInputSource(DssslSpecEventHandler &, Owner<InputSource> &);
+  private:
+    ConstPtr<Entity> entity_;
+  };
+
+  class SpecPart;
+  class Doc;
+  class Part;
+  class MapSdataEntityElement;
+
+  class DeclarationElement : public Link {
+  public:
+    enum Type {
+      features,
+      basesetEncoding,
+      literalDescribedChar,
+      addNameChars,
+      addSeparatorChars,
+      standardChars,
+      otherChars,
+      combineChar,
+      mapSdataEntity,
+      charRepertoire,
+      sgmlGrovePlan,
+    };
+
+    DeclarationElement(Type);
+    void makeInputSource(DssslSpecEventHandler&, Owner<InputSource>&);
+    Type type() const;
+    void setContent(Text &);
+    void setName(const StringC &s) { name_ = s; };
+    const StringC &name() { return name_; };
+    void setText(const StringC &s) { text_ = s; };
+    const StringC &text() { return text_; };
+    void setModadd(const StringC &s) { modadd_ = s; };
+    const StringC &modadd() { return modadd_; };
+    void setDesc(const StringC &s) { desc_ = s; };
+    const StringC &desc() { return desc_; };
+
+  private:
+    Type type_;
+    Text content_;
+    StringC name_;
+    StringC text_;
+    StringC modadd_;
+    StringC desc_;
+  };
+
+  class PartHeader : public Link {
+  public:
+    PartHeader(Doc *, const StringC &id);
+    const StringC &id() const;
+    Part *resolve(DssslSpecEventHandler &);
+    void setPart(SpecPart *);
+    void setRefLoc(const Location &);
+  private:
+    Doc *doc_;
+    StringC id_;
+    // Location of first reference
+    Location refLoc_;
+    Owner<SpecPart> specPart_;
+  };
+
+
+  class SpecPart {
+  public:
+    virtual ~SpecPart();
+    virtual Part *resolve(DssslSpecEventHandler &) = 0;
+  };
+
+  class ExternalPart : public SpecPart {
+  public:
+    ExternalPart(PartHeader *);
+    Part *resolve(DssslSpecEventHandler &);
+  private:
+    PartHeader *header_;
+  };
+
+  class ExternalFirstPart : public SpecPart {
+  public:
+    ExternalFirstPart(Doc *);
+    Part *resolve(DssslSpecEventHandler &);
+  private:
+    Doc *doc_;
+  };
+
+  class Part : public SpecPart {
+  public:
+    typedef IListIter<BodyElement> Iter;
+    typedef IListIter<DeclarationElement> DIter;
+    Part(Doc *);
+    Iter iter();
+    DIter diter();
+    Doc *doc();
+    const Vector<PartHeader *> &use() const;
+    void addUse(PartHeader *);
+    void append(BodyElement *);
+    void append(DeclarationElement *);
+    bool setMark(bool = 1);
+  private:
+    Part *resolve(DssslSpecEventHandler &);
+    IList<DeclarationElement> declarations_;
+    IList<BodyElement> bodyElements_;
+    Vector<PartHeader *> use_;
+    bool mark_;
+    Doc *doc_;
+  };
+
+  class Doc : public Link {
+  public:
+    Doc();
+    Doc(const StringC &sysid);
+    void setLocation(const Location &);
+    PartHeader *refPart(const StringC &);
+    PartHeader *refPart(const StringC &, const Location &refLoc);
+    Part *resolveFirstPart(DssslSpecEventHandler &);
+    Part::DIter diter();
+    void load(DssslSpecEventHandler &);
+    void append(DeclarationElement *); 
+    const StringC &sysid() const;
+  private:
+    bool loaded_;
+    StringC sysid_;
+    IList<DeclarationElement> declarations_;
+    IList<PartHeader> headers_;
+    Location loc_;
+    friend class Part;
+  };
+  DssslSpecEventHandler(Messenger &);
+  void load(SgmlParser &specParser, const CharsetInfo &, const StringC &id,
+           Vector<Part *> &parts);
+  void externalSpecificationStart(const StartElementEvent &);
+  void externalSpecificationEnd(const EndElementEvent &);
+  void styleSpecificationStart(const StartElementEvent &);
+  void styleSpecificationEnd(const EndElementEvent &);
+  void styleSpecificationBodyStart(const StartElementEvent &);
+  void styleSpecificationBodyEnd(const EndElementEvent &);
+  void declarationStart(const StartElementEvent &);
+  void declarationEnd(const EndElementEvent &);
+private:
+  Vector<Part *> &parts();
+  void startElement(StartElementEvent *);
+  void endElement(EndElementEvent *);
+  void data(DataEvent *);
+  void message(MessageEvent *);
+  void endProlog(EndPrologEvent *);
+  EventHandler *arcEventHandler(const StringC *,
+                               const Notation *,
+                               const Vector<StringC> &,
+                               const SubstTable *);
+  void loadDoc(SgmlParser &, Doc &);
+  void resolveParts(Part *, Vector<Part *> &);
+  Doc *findDoc(const StringC &);
+  const StringC *attributeString(const StartElementEvent &, const char *);
+  const Text *attributeText(const StartElementEvent &, const char *);
+  ConstPtr<Entity> attributeEntity(const StartElementEvent &, const char *);
+
+  Messenger *mgr_;
+  bool gotArc_;
+  bool gatheringBody_;
+  Part *currentPart_;
+  Text currentBody_;
+  Doc *currentDoc_;
+  IList<Doc> docs_;
+  SgmlParser *parser_;
+  const CharsetInfo *charset_;
+  DeclarationElement *currentDecl_;
+  friend class Doc;
+  friend class EntityBodyElement;
+  friend class PartHeader;
+};
+
+inline
+const StringC &DssslSpecEventHandler::PartHeader::id() const
+{
+  return id_;
+}
+
+inline
+void DssslSpecEventHandler::PartHeader::setPart(SpecPart *part)
+{
+  specPart_ = part;
+}
+
+inline
+void DssslSpecEventHandler::Part::addUse(PartHeader *header)
+{
+  use_.push_back(header);
+}
+    
+inline
+const Vector<DssslSpecEventHandler::PartHeader *> &
+DssslSpecEventHandler::Part::use() const
+{
+  return use_;
+}
+
+inline
+const StringC &DssslSpecEventHandler::Doc::sysid() const
+{
+  return sysid_;
+}
+
+inline
+DssslSpecEventHandler::Part::Iter DssslSpecEventHandler::Part::iter()
+{
+  return Iter(bodyElements_);
+}
+
+inline
+DssslSpecEventHandler::Part::DIter DssslSpecEventHandler::Part::diter()
+{
+  return DIter(declarations_);
+}
+
+inline
+DssslSpecEventHandler::Part::DIter DssslSpecEventHandler::Doc::diter()
+{
+  return Part::DIter(declarations_);
+}
+
+inline
+bool DssslSpecEventHandler::Part::setMark(bool b)
+{
+  bool tem = mark_;
+  mark_ = b;
+  return tem;
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not DssslSpecEventHandler_INCLUDED */
diff --git a/style/ELObj.cxx b/style/ELObj.cxx
new file mode 100644 (file)
index 0000000..bcca33d
--- /dev/null
@@ -0,0 +1,1314 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#include "stylelib.h"
+#include "ELObj.h"
+#include "Interpreter.h"
+#include "InterpreterMessages.h"
+#include "macros.h"
+#include <string.h>
+#include <math.h>
+#include <stdio.h>
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class ReverseNodeListObj : public NodeListObj {
+public:
+  ReverseNodeListObj(NodeListObj *);
+  NodePtr nodeListFirst(EvalContext &, Interpreter &);
+  NodeListObj *nodeListRest(EvalContext &, Interpreter &);
+  NodeListObj *nodeListReverse(EvalContext &context, Interpreter &interp);
+  NodePtr nodeListRef(long, EvalContext &, Interpreter &);
+  long nodeListLength(EvalContext &context, Interpreter &interp);
+  void traceSubObjects(Collector &) const;
+private:
+  NodeListObj *reversed(EvalContext &context, Interpreter &interp);
+  NodeListObj *nl_;
+  NodeListObj *reversed_;
+};
+
+ELObj::ELObj()
+{
+  hasSubObjects_ = 0;
+}
+
+bool ELObj::isEqual(ELObj &)
+{
+  return false;
+}
+    
+bool ELObj::isEquiv(ELObj &obj)
+{
+  return isEqual(obj);
+}
+    
+bool ELObj::isNil() const
+{
+  return false;
+}
+
+bool ELObj::isList() const
+{
+  return false;
+}
+
+bool ELObj::isTrue() const
+{
+  return true;
+}
+
+PairObj *ELObj::asPair()
+{
+  return 0;
+}
+
+VectorObj *ELObj::asVector()
+{
+  return 0;
+}
+
+SymbolObj *ELObj::asSymbol()
+{
+  return 0;
+}
+
+KeywordObj *ELObj::asKeyword()
+{
+  return 0;
+}
+
+StringObj *ELObj::convertToString()
+{
+  return 0;
+}
+
+FunctionObj *ELObj::asFunction()
+{
+  return 0;
+}
+
+SosofoObj *ELObj::asSosofo()
+{
+  return 0;
+}
+
+AppendSosofoObj *ELObj::asAppendSosofo()
+{
+  return 0;
+}
+
+ColorObj *ELObj::asColor()
+{
+  return 0;
+}
+
+ColorSpaceObj *ELObj::asColorSpace()
+{
+  return 0;
+}
+
+AddressObj *ELObj::asAddress()
+{
+  return 0;
+}
+
+DisplaySpaceObj *ELObj::asDisplaySpace()
+{
+  return 0;
+}
+
+InlineSpaceObj *ELObj::asInlineSpace()
+{
+  return 0;
+}
+
+GlyphSubstTableObj *ELObj::asGlyphSubstTable()
+{
+  return 0;
+}
+
+LanguageObj *ELObj::asLanguage()
+{
+  return 0;
+}
+
+bool ELObj::optSingletonNodeList(EvalContext &, Interpreter &, NodePtr &)
+{
+  return 0;
+}
+
+NodeListObj *ELObj::asNodeList()
+{
+  return 0;
+}
+
+NamedNodeListObj *ELObj::asNamedNodeList()
+{
+  return 0;
+}
+
+StyleObj *ELObj::asStyle()
+{
+  return 0;
+}
+
+BoxObj *ELObj::asBox()
+{
+  return 0;
+}
+
+void ELObj::print(Interpreter &interp, OutputCharStream &out)
+{
+  out << "#<unknown object " << (unsigned long)this << ">";
+}
+
+void ELObj::print(Interpreter &interp, OutputCharStream &out, unsigned)
+{
+  print(interp, out);
+}
+
+bool ELObj::exactIntegerValue(long &)
+{
+  return false;
+}
+
+bool ELObj::realValue(double &)
+{
+  return false;
+}
+
+bool ELObj::inexactRealValue(double &)
+{
+  return false;
+}
+
+bool ELObj::lengthValue(long &n)
+{
+  return false;
+}
+
+ELObj::QuantityType ELObj::quantityValue(long &, double &, int &)
+{
+  return noQuantity;
+}
+
+const LengthSpec *ELObj::lengthSpec() const
+{
+  return 0;
+}
+
+bool ELObj::stringData(const Char *&, size_t &)
+{
+  return false;
+}
+
+bool ELObj::charValue(Char &)
+{
+  return false;
+}
+
+const FOTBuilder::GlyphId *ELObj::glyphId() const
+{
+  return 0;
+}
+
+ELObj *ELObj::resolveQuantities(bool, Interpreter &, const Location &)
+{
+  return this;
+}
+
+ErrorObj::ErrorObj()
+{
+}
+
+void ErrorObj::print(Interpreter &interp, OutputCharStream &out)
+{
+  out << "#<error>";
+}
+
+UnspecifiedObj::UnspecifiedObj()
+{
+}
+
+void UnspecifiedObj::print(Interpreter &interp, OutputCharStream &out)
+{
+  out << "#v";
+}
+
+NilObj::NilObj()
+{
+}
+
+bool NilObj::isNil() const
+{
+  return true;
+}
+
+bool NilObj::isList() const
+{
+  return true;
+}
+
+void NilObj::print(Interpreter &, OutputCharStream &out)
+{
+  out << "()";
+}
+
+TrueObj::TrueObj()
+{
+}
+
+void TrueObj::print(Interpreter &, OutputCharStream &out)
+{
+  out << "#t";
+}
+
+FalseObj::FalseObj()
+{
+}
+
+bool FalseObj::isTrue() const
+{
+  return false;
+}
+
+void FalseObj::print(Interpreter &, OutputCharStream &out)
+{
+  out << "#f";
+}
+
+SymbolObj::SymbolObj(StringObj *name)
+: name_(name), cValue_(FOTBuilder::symbolFalse)
+{
+  hasSubObjects_ = 1;
+}
+
+void SymbolObj::traceSubObjects(Collector &c) const
+{
+  c.trace(name_);
+}
+
+void SymbolObj::print(Interpreter &interp, OutputCharStream &out)
+{
+  out.write(name()->data(), name()->size());
+}
+
+SymbolObj *SymbolObj::asSymbol()
+{
+  return this;
+}
+
+StringObj *SymbolObj::convertToString()
+{
+  return name();
+}
+
+KeywordObj::KeywordObj(const Identifier *ident)
+: ident_(ident)
+{
+}
+
+KeywordObj *KeywordObj::asKeyword()
+{
+  return this;
+}
+
+bool KeywordObj::isEqual(ELObj &obj)
+{
+  KeywordObj *k = obj.asKeyword();
+  return k && k->ident_ == ident_;
+}
+
+void KeywordObj::print(Interpreter &interp, OutputCharStream &out)
+{
+  out << ident_->name() << ":";
+}
+
+PairObj::PairObj(ELObj *car, ELObj *cdr)
+: car_(car), cdr_(cdr)
+{
+  hasSubObjects_ = 1;
+}
+
+bool PairObj::isEqual(ELObj &obj)
+{
+  PairObj *p = obj.asPair();
+  // FIXME need non-recursive implementation
+  return p && equal(*p->car(), *car()) && equal(*p->cdr(), *cdr());
+}
+
+bool PairObj::isEquiv(ELObj &obj)
+{
+  PairObj *p = obj.asPair();
+  // FIXME need non-recursive implementation
+  return p && eqv(*p->car(), *car()) && eqv(*p->cdr(), *cdr());
+}
+
+void PairObj::traceSubObjects(Collector &c) const
+{
+  c.trace(car_);
+  c.trace(cdr_);
+}
+
+ELObj *PairObj::resolveQuantities(bool force, Interpreter &interp,
+                                 const Location &loc)
+{
+  bool fail = 0;
+  PairObj *pair = this;
+  for (;;) {
+    ELObj *tem = pair->car_->resolveQuantities(force, interp, loc);
+    if (!tem)
+      fail = 1;
+    else {
+      if (pair->permanent())
+       interp.makePermanent(tem);
+      pair->car_ = tem;
+    }
+    PairObj *nextPair = pair->cdr_->asPair();
+    if (!nextPair)
+      break;
+    pair = nextPair;
+  }
+  ELObj *tem = pair->cdr_->resolveQuantities(force, interp, loc);
+  if (!tem)
+    fail = 1;
+  else {
+    if (pair->permanent())
+      interp.makePermanent(tem);
+    pair->cdr_ = tem;
+  }
+  if (fail)
+    return 0;
+  else
+    return this;
+}
+
+
+PairObj *PairObj::asPair()
+{
+  return this;
+}
+
+bool PairObj::isList() const
+{
+  ELObj *p = cdr_;
+  while (!p->isNil()) {
+    PairObj *pair = p->asPair();
+    if (!pair)
+      return false;
+    p = pair->cdr();
+  }
+  return true;
+}
+
+void PairObj::print(Interpreter &interp, OutputCharStream &out)
+{
+  out << "(";
+  car_->print(interp, out);
+  ELObj *p = cdr_;
+  for (;;) {
+    if (p->isNil()) {
+      out << ")";
+      return;
+    }
+    PairObj *pair = p->asPair();
+    if (!pair) {
+      out << " . ";
+      p->print(interp, out);
+      out << ")";
+      return;
+    }
+    out << " ";
+    pair->car()->print(interp, out);
+    p = pair->cdr();
+  }
+}
+
+VectorObj::VectorObj()
+{
+  hasSubObjects_ = 1;
+}
+
+VectorObj::VectorObj(Vector<ELObj *> &v)
+{
+  hasSubObjects_ = 1;
+  v.swap(*this);
+}
+
+void VectorObj::traceSubObjects(Collector &c) const
+{
+  for (size_t i = 0; i < Vector<ELObj *>::size(); i++)
+    c.trace((*this)[i]);
+}
+
+VectorObj *VectorObj::asVector()
+{
+  return this;
+}
+
+bool VectorObj::isEquiv(ELObj &)
+{
+  return 0;
+}
+
+bool VectorObj::isEqual(ELObj &obj)
+{
+  VectorObj *v = obj.asVector();
+  if (!v)
+    return 0;
+  if (size() != v->size())
+    return 0;
+  for (size_t i = 0; i < size(); i++)
+    if (!equal(*(*this)[i], *(*v)[i]))
+      return 0;
+  return 1;
+}
+
+void VectorObj::print(Interpreter &interp, OutputCharStream &out)
+{
+  out << "#(";
+  Vector<ELObj *> &v = *this;
+  for (size_t i = 0; i < v.size(); i++) {
+    if (i)
+      out << " ";
+    ELObj *tem = v[i];
+    if (!tem)
+      out << "#<cycle>";
+    else {
+      v[i] = 0;
+      tem->print(interp, out);
+      v[i] = tem;
+    }
+  }
+  out << ")";
+}
+
+ELObj *VectorObj::resolveQuantities(bool force, Interpreter &interp,
+                                   const Location &loc)
+{
+  bool fail = 0;
+  Vector<ELObj *> &v = *this;
+  for (size_t i = 0; i < v.size(); i++) {
+    ELObj *tem = v[i]->resolveQuantities(force, interp, loc);
+    if (tem) {
+      if (permanent())
+       interp.makePermanent(tem);
+      v[i] = tem;
+    }
+    else
+      fail = 1;
+  }
+  if (fail)
+    return 0;
+  return this;
+}
+
+CharObj::CharObj(Char ch)
+: ch_(ch)
+{
+}
+
+void CharObj::display(Interpreter &interp, OutputCharStream &out) const
+{
+  out.put(ch_);                // FIXME
+}
+
+void CharObj::print(Interpreter &, OutputCharStream &out)
+{
+  out << "#\\";
+  out.put(ch_);        // FIXME
+}
+
+bool CharObj::charValue(Char &c)
+{
+  c = ch_;
+  return 1;
+}
+
+bool CharObj::isEqual(ELObj &obj)
+{
+  Char c;
+  return obj.charValue(c) && c == ch_;
+}
+
+StringObj::StringObj()
+{
+}
+
+StringObj::StringObj(const StringC &str)
+: StringC(str)
+{
+}
+
+StringObj::StringObj(const Char *s, size_t len)
+: StringC(s, len)
+{
+}
+
+bool StringObj::stringData(const Char *&s, size_t &n)
+{
+  s = data();
+  n = size();
+  return true;
+}
+
+bool StringObj::isEqual(ELObj &obj)
+{
+  const Char *s;
+  size_t n;
+  return (obj.stringData(s, n) 
+         && n == size()
+         && (n == 0 || memcmp(s, data(), n*sizeof(Char)) == 0));
+}
+
+StringObj *StringObj::convertToString()
+{
+  return this;
+}
+
+void StringObj::print(Interpreter &interp, OutputCharStream &out)
+{
+  // FIXME
+  out << "\"";
+  const Char *s = data();
+  for (size_t i = 0; i < size(); i++)
+    switch (s[i]) {
+    case '\\':
+    case '"':
+      out << "\\";
+      // fall through
+    default:
+      out.put(s[i]);
+      break;
+    }
+  out << "\"";
+}
+
+IntegerObj::IntegerObj()
+: n_(0)
+{
+}
+
+IntegerObj::IntegerObj(long n)
+: n_(n)
+{
+}
+
+bool IntegerObj::isEqual(ELObj &obj)
+{
+  long n;
+  return obj.exactIntegerValue(n) && n == n_;
+}
+
+void IntegerObj::print(Interpreter &interp, OutputCharStream &out)
+{
+  print(interp, out, 10);
+}
+
+void IntegerObj::print(Interpreter &, OutputCharStream &out, unsigned radix)
+{
+  if (radix == 10) {
+    if (n_ < 0)
+      out << '-' << (unsigned long)-n_;
+    else
+      out << (unsigned long)n_;
+    return;
+  }
+
+  if (n_ == 0) {
+    out << '0';
+    return;
+  }
+  
+  unsigned long n;
+
+  if (n_ < 0) {
+    out << '-';
+    n = -n_;
+  }
+  else
+    n = n_;
+  
+  char buf[64];
+  int i = 0;
+
+  while (n != 0) {
+    buf[i++] = "0123456789abcdef"[n % radix];
+    n /= radix;
+  }
+
+  while (i > 0)
+    out << buf[--i];
+}
+
+bool IntegerObj::exactIntegerValue(long &n)
+{
+  n = n_;
+  return true;
+}
+
+bool IntegerObj::realValue(double &n)
+{
+  n = n_;
+  return true;
+}
+
+ELObj::QuantityType IntegerObj::quantityValue(long &val, double &, int &dim)
+{
+  val = n_;
+  dim = 0;
+  return longQuantity;
+}
+
+RealObj::RealObj(double n)
+: n_(n)
+{
+}
+
+bool RealObj::isEqual(ELObj &obj)
+{
+  double n;
+  return obj.inexactRealValue(n) && n == n_;
+}
+
+
+bool RealObj::realValue(double &n)
+{
+  n = n_;
+  return true;
+}
+
+bool RealObj::inexactRealValue(double &n)
+{
+  n = n_;
+  return true;
+}
+
+ELObj::QuantityType RealObj::quantityValue(long &, double &val, int &dim)
+{
+  val = n_;
+  dim = 0;
+  return doubleQuantity;
+}
+
+void RealObj::print(Interpreter &, OutputCharStream &out)
+{
+  char buf[1024];
+  sprintf(buf, "%g", n_);
+  out << buf;
+}
+
+LengthObj::LengthObj(long n)
+: n_(n)
+{
+}
+
+bool LengthObj::lengthValue(long &n)
+{
+  n = n_;
+  return true;
+}
+
+ELObj::QuantityType LengthObj::quantityValue(long &val, double &, int &dim)
+{
+  val = n_;
+  dim = 1;
+  return longQuantity;
+}
+
+bool LengthObj::isEqual(ELObj &obj)
+{
+  long n;
+  double d;
+  int dim;
+  switch (obj.quantityValue(n, d, dim)) {
+  case noQuantity:
+    break;
+  case doubleQuantity:
+    return dim == 1 && d == n_;
+  case longQuantity:
+    return dim == 1 && n == n_;
+  }
+  return 0;
+}
+
+void LengthObj::print(Interpreter &interp, OutputCharStream &out)
+{
+  char buf[1024];
+  sprintf(buf, "%gpt", n_ * 72.0/interp.unitsPerInch());
+  out << buf;
+}
+
+QuantityObj::QuantityObj(double val, int dim)
+: val_(val), dim_(dim)
+{
+}
+
+bool QuantityObj::isEqual(ELObj &obj)
+{
+  long n;
+  double d;
+  int dim;
+  switch (obj.quantityValue(n, d, dim)) {
+  case noQuantity:
+    break;
+  case doubleQuantity:
+    return dim == dim_ && d == val_;
+  case longQuantity:
+    return dim == dim_ && n == val_;
+  }
+  return 0;
+}
+
+ELObj::QuantityType QuantityObj::quantityValue(long &, double &val, int &dim)
+{
+  val = val_;
+  dim = dim_;
+  return doubleQuantity;
+}
+
+void QuantityObj::print(Interpreter &interp, OutputCharStream &out)
+{
+  char buf[1024];
+  sprintf(buf, "%gpt%d", val_ * pow(72.0/interp.unitsPerInch(), double(dim_)),
+         dim_);
+  out << buf;
+}
+
+bool QuantityObj::realValue(double &d)
+{
+  if (dim_ != 0)
+    return 0;
+  d = val_;
+  return 1;
+}
+
+bool QuantityObj::inexactRealValue(double &d)
+{
+  if (dim_ != 0)
+    return 0;
+  d = val_;
+  return 1;
+}
+
+LengthSpecObj::LengthSpecObj(const LengthSpec &spec)
+: lengthSpec_(new LengthSpec(spec))
+{
+}
+
+const LengthSpec *LengthSpecObj::lengthSpec() const
+{
+  return lengthSpec_.pointer();
+}
+
+LengthSpec::LengthSpec()
+{
+  for (int i = 0; i < nVals; i++)
+    val_[i] = 0.0;
+}
+
+LengthSpec::LengthSpec(double d)
+{
+  val_[0] = d;
+  for (int i = 1; i < nVals; i++)
+    val_[i] = 0.0;
+}
+LengthSpec::LengthSpec(Unknown unknown, double d)
+{
+  int i;
+  for (i = 0; i < unknown; i++)
+    val_[i] = 0.0;
+  val_[unknown] = d;
+  for (i = unknown + 1; i < nVals; i++)
+    val_[i] = 0.0;
+}
+
+void LengthSpec::operator+=(const LengthSpec &ls)
+{
+  for (int i = 0; i < nVals; i++)
+    val_[i] += ls.val_[i];
+}
+
+void LengthSpec::operator-=(const LengthSpec &ls)
+{
+  for (int i = 0; i < nVals; i++)
+    val_[i] -= ls.val_[i];
+}
+
+void LengthSpec::operator*=(double d)
+{
+  for (int i = 0; i < nVals; i++)
+    val_[i] *= d;
+}
+
+void LengthSpec::operator/=(double d)
+{
+  for (int i = 0; i < nVals; i++)
+    val_[i] /= d;
+}
+
+bool LengthSpec::convert(FOTBuilder::LengthSpec &result) const
+{
+  // FIXME do some checking
+  result.length = long(val_[0] < 0.0 ? val_[0] - 0.5 : val_[0] + .5);
+  result.displaySizeFactor = val_[1];
+  return 1;
+}
+
+bool LengthSpec::convert(FOTBuilder::TableLengthSpec &result) const
+{
+  // FIXME do some checking
+  result.length = long(val_[0] < 0.0 ? val_[0] - 0.5 : val_[0] + .5);
+  result.displaySizeFactor = val_[1];
+  result.tableUnitFactor = val_[2];
+  return 1;
+}
+
+DisplaySpaceObj::DisplaySpaceObj(const FOTBuilder::DisplaySpace &displaySpace)
+: displaySpace_(new FOTBuilder::DisplaySpace(displaySpace))
+{
+}
+const FOTBuilder::DisplaySpace &DisplaySpaceObj::displaySpace() const
+{
+  return *displaySpace_;
+}
+
+DisplaySpaceObj *DisplaySpaceObj::asDisplaySpace()
+{
+  return this;
+}
+
+InlineSpaceObj::InlineSpaceObj(const FOTBuilder::InlineSpace &inlineSpace)
+: inlineSpace_(new FOTBuilder::InlineSpace(inlineSpace))
+{
+}
+const FOTBuilder::InlineSpace &InlineSpaceObj::inlineSpace() const
+{
+  return *inlineSpace_;
+}
+
+InlineSpaceObj *InlineSpaceObj::asInlineSpace()
+{
+  return this;
+}
+
+UnresolvedLengthObj::UnresolvedLengthObj(long val, int valExp, Unit *unit)
+: val_(val), valExp_(valExp), unit_(unit)
+{
+}
+
+ELObj *UnresolvedLengthObj::resolveQuantities(bool force,
+                                             Interpreter &interp,
+                                             const Location &loc)
+{
+  unsigned part;
+  Location defLoc;
+  if (!unit_->defined(part, defLoc)) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::undefinedQuantity,
+                  StringMessageArg(unit_->name()));
+    return interp.makeError();
+  }
+  return unit_->resolveQuantity(force, interp, val_, valExp_);
+}
+
+UnresolvedQuantityObj
+::UnresolvedQuantityObj(double val, Unit *unit, int unitExp)
+: val_(val), unit_(unit), unitExp_(unitExp)
+{
+}
+
+ELObj *UnresolvedQuantityObj::resolveQuantities(bool force,
+                                               Interpreter &interp,
+                                               const Location &loc)
+{
+  unsigned part;
+  Location defLoc;
+  if (!unit_->defined(part, defLoc)) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::undefinedQuantity,
+                  StringMessageArg(unit_->name()));
+    return interp.makeError();
+  }
+  return unit_->resolveQuantity(force, interp, val_, unitExp_);
+}
+
+GlyphIdObj::GlyphIdObj(const FOTBuilder::GlyphId &glyphId)
+: glyphId_(glyphId)
+{
+}
+
+const FOTBuilder::GlyphId *GlyphIdObj::glyphId() const
+{
+  return &glyphId_;
+}
+
+bool GlyphIdObj::isEqual(ELObj &obj)
+{
+  const FOTBuilder::GlyphId *p = obj.glyphId();
+  return (p
+          && p->publicId == glyphId_.publicId
+         && p->suffix == glyphId_.suffix);
+}
+
+GlyphSubstTableObj::GlyphSubstTableObj(const ConstPtr<FOTBuilder::GlyphSubstTable> &table)
+: table_(table)
+{
+}
+
+GlyphSubstTableObj *GlyphSubstTableObj::asGlyphSubstTable()
+{
+  return this;
+}
+
+AddressObj::AddressObj(FOTBuilder::Address::Type type,
+                      const NodePtr &node,
+                      const StringC &str1,
+                      const StringC &str2,
+                      const StringC &str3)
+{
+  address_ = new FOTBuilder::Address;
+  address_->type = type;
+  address_->node = node;
+  address_->params[0] = str1;
+  address_->params[1] = str2;
+  address_->params[2] = str3;
+}
+
+AddressObj *AddressObj::asAddress()
+{
+  return this;
+}
+
+NodeListObj *NodeListObj::asNodeList()
+{
+  return this;
+}
+
+NodeListObj *NodeListObj::nodeListNoOrder(Collector &)
+{
+  return this;
+}
+
+NodeListObj *NodeListObj::nodeListChunkRest(EvalContext &context, Interpreter &interp, bool &chunk)
+{
+  chunk = 0;
+  return nodeListRest(context, interp);
+}
+
+bool NodeListObj::optSingletonNodeList(EvalContext &context, Interpreter &interp, NodePtr &node)
+{
+  NodeListObj *rest = nodeListRest(context, interp);
+  ELObjDynamicRoot protect(interp, rest);
+  if (rest->nodeListFirst(context, interp))
+    return 0;
+  node = nodeListFirst(context, interp);
+  return 1;
+}
+
+NodePtr NodeListObj::nodeListRef(long n, EvalContext &context, Interpreter &interp)
+{
+  if (n < 0)
+    return NodePtr();
+  NodeListObj *nl = this;
+  ELObjDynamicRoot protect(interp, nl);
+  while (n > 0) {
+    NodePtr nd(nl->nodeListFirst(context, interp));
+    if (!nd)
+      return NodePtr();
+    GroveString str;
+    if (nd->charChunk(interp, str) == accessOK && str.size() <= n) {
+      bool chunk;
+      nl = nl->nodeListChunkRest(context, interp, chunk);
+      if (chunk)
+       n -= str.size();
+      else
+       n--;
+    }
+    else {
+      nl = nl->nodeListRest(context, interp);
+      n--;
+    }
+    protect = nl;
+  }
+  return nl->nodeListFirst(context, interp);
+}
+
+NodeListObj *NodeListObj::nodeListReverse(EvalContext &, Interpreter &interp)
+{
+  return new (interp) ReverseNodeListObj(this);
+}
+
+long NodeListObj::nodeListLength(EvalContext &context, Interpreter &interp)
+{
+  NodeListObj *nl = this;
+  long n = 0;
+  ELObjDynamicRoot protect(interp, nl);
+  for (;;) {
+    NodePtr nd(nl->nodeListFirst(context, interp));
+    if (!nd)
+      break;
+    bool chunk;
+    nl = nl->nodeListChunkRest(context, interp, chunk);
+    protect = nl;
+    GroveString str;
+    if (chunk && nd->charChunk(interp, str) == accessOK)
+      n += str.size();
+    else
+      n += 1;
+  }
+  return n;
+}
+
+bool NodeListObj::suppressError()
+{
+  return 0;
+}
+
+NamedNodeListObj *NamedNodeListObj::asNamedNodeList()
+{
+  return this;
+}
+
+NodePtrNodeListObj::NodePtrNodeListObj()
+{
+}
+
+NodePtrNodeListObj::NodePtrNodeListObj(const NodePtr &node)
+: node_(node)
+{
+}
+
+bool NodePtrNodeListObj::optSingletonNodeList(EvalContext &, Interpreter &, NodePtr &node)
+{
+  node = node_;
+  return 1;
+}
+
+NodePtr NodePtrNodeListObj::nodeListFirst(EvalContext &, Interpreter &)
+{
+  return node_;
+}
+
+NodeListObj *NodePtrNodeListObj::nodeListRest(EvalContext &context, Interpreter &interp)
+{
+  if (node_)
+    return new (interp) NodePtrNodeListObj;
+  else
+    return this;
+}
+
+NodeListPtrNodeListObj::NodeListPtrNodeListObj(const NodeListPtr &nodeList)
+: nodeList_(nodeList)
+{
+}
+
+NodePtr NodeListPtrNodeListObj::nodeListFirst(EvalContext &, Interpreter &)
+{
+  NodePtr nd;
+  if (nodeList_->first(nd) == accessOK)
+    return nd;
+  else
+    return NodePtr();
+}
+
+NodeListObj *NodeListPtrNodeListObj::nodeListRest(EvalContext &context, Interpreter &interp)
+{
+  NodeListPtr nl;
+  if (nodeList_->rest(nl) == accessOK)
+    return new (interp) NodeListPtrNodeListObj(nl);
+  else
+    return interp.makeEmptyNodeList();
+}
+
+NodeListObj *NodeListPtrNodeListObj::nodeListChunkRest(EvalContext &context, Interpreter &interp, bool &chunk)
+{
+  NodeListPtr nl;
+  if (nodeList_->chunkRest(nl) == accessOK) {
+    chunk = 1;
+    return new (interp) NodeListPtrNodeListObj(nl);
+  }
+  else {
+    chunk = 0;
+    return interp.makeEmptyNodeList();
+  }
+}
+
+NodePtr NodeListPtrNodeListObj::nodeListRef(long i, EvalContext &, Interpreter &interp)
+{
+  NodePtr nd;
+  if (i < 0 || nodeList_->ref(i, nd) != accessOK)
+    return NodePtr();
+  return nd;
+}
+
+NamedNodeListPtrNodeListObj
+::NamedNodeListPtrNodeListObj(const NamedNodeListPtr &nnl)
+: namedNodeList_(nnl)
+{
+}
+
+NodePtr NamedNodeListPtrNodeListObj::namedNode(const Char *s, size_t n)
+{
+  NodePtr node;
+  if (namedNodeList_->namedNode(GroveString(s, n), node) != accessOK)
+    node.clear();
+  return node;
+}
+
+bool NamedNodeListPtrNodeListObj::nodeName(const NodePtr &nd, GroveString &str)
+{
+  return namedNodeList_->nodeName(nd, str) == accessOK;
+}
+
+size_t NamedNodeListPtrNodeListObj::normalize(Char *s, size_t n)
+{
+  return namedNodeList_->normalize(s, n);
+}
+
+NodePtr NamedNodeListPtrNodeListObj::nodeListFirst(EvalContext &, Interpreter &)
+{
+  if (!nodeList_)
+    nodeList_ = namedNodeList_->nodeList();
+  NodePtr nd;
+  if (nodeList_->first(nd) == accessOK)
+    return nd;
+  else
+    return NodePtr();
+}
+NodeListObj *NamedNodeListPtrNodeListObj::nodeListRest(EvalContext &context, Interpreter &interp)
+{
+  if (!nodeList_)
+    nodeList_ = namedNodeList_->nodeList();
+  NodeListPtr nl;
+  if (nodeList_->rest(nl) == accessOK)
+    return new (interp) NodeListPtrNodeListObj(nl);
+  else
+    return new (interp) NodePtrNodeListObj;
+}
+
+NodeListObj *NamedNodeListPtrNodeListObj::nodeListNoOrder(Collector &c)
+{
+  return new (c) NodeListPtrNodeListObj(namedNodeList_->nodeListNoOrder());
+}
+
+PairNodeListObj::PairNodeListObj(NodeListObj *head, NodeListObj *tail)
+: head_(head), tail_(tail)
+{
+  hasSubObjects_ = 1;
+}
+
+NodePtr PairNodeListObj::nodeListFirst(EvalContext &context, Interpreter &interp)
+{
+  if (head_) {
+    NodePtr nd(head_->nodeListFirst(context, interp));
+    if (nd)
+      return nd;
+    head_ = 0;
+  }
+  return tail_->nodeListFirst(context, interp);
+}
+
+NodeListObj *PairNodeListObj::nodeListRest(EvalContext &context, Interpreter &interp)
+{
+  if (!head_ || !head_->nodeListFirst(context, interp))
+    return tail_->nodeListRest(context, interp);
+  NodeListObj *tem = head_->nodeListRest(context, interp);
+  ELObjDynamicRoot protect(interp, tem);
+  return new (interp) PairNodeListObj(tem, tail_);
+}
+
+NodeListObj *PairNodeListObj::nodeListChunkRest(EvalContext &context, Interpreter &interp, bool &chunk)
+{
+  if (!head_ || !head_->nodeListFirst(context, interp))
+    return tail_->nodeListChunkRest(context, interp, chunk);
+  NodeListObj *tem = head_->nodeListChunkRest(context, interp, chunk);
+  ELObjDynamicRoot protect(interp, tem);
+  return new (interp) PairNodeListObj(tem, tail_);
+}
+
+void PairNodeListObj::traceSubObjects(Collector &c) const
+{
+  c.trace(head_);
+  c.trace(tail_);
+}
+
+ReverseNodeListObj::ReverseNodeListObj(NodeListObj *nl)
+: nl_(nl), reversed_(0)
+{
+  hasSubObjects_ = 1;
+}
+
+NodePtr ReverseNodeListObj::nodeListFirst(EvalContext &context, Interpreter &interp)
+{
+  return reversed(context, interp)->nodeListFirst(context, interp);
+}
+
+NodeListObj *ReverseNodeListObj::nodeListRest(EvalContext &context, Interpreter &interp)
+{
+  return reversed(context, interp)->nodeListRest(context, interp);
+}
+
+NodePtr ReverseNodeListObj::nodeListRef(long n, EvalContext &context, Interpreter &interp)
+{
+  if (reversed_)
+    return reversed_->nodeListRef(n, context, interp);
+  if (n < 0)
+    return NodePtr();
+  size_t len = nl_->nodeListLength(context, interp);
+  if (n >= len)
+    return 0;
+  return nl_->nodeListRef(len - n - 1, context, interp);
+}
+
+NodeListObj *ReverseNodeListObj::reversed(EvalContext &context, Interpreter &interp)
+{
+  if (!reversed_) {
+    NodePtr nd(nl_->nodeListFirst(context, interp));
+    if (nd) {
+      reversed_ = new (interp) NodePtrNodeListObj(nd);
+      NodeListObj *tem = nl_;
+      ELObjDynamicRoot protect(interp, tem);
+      ELObjDynamicRoot protect2(interp, reversed_);
+      for (;;) {
+       tem = tem->nodeListRest(context, interp);
+       protect = tem;
+       nd = tem->nodeListFirst(context, interp);
+       if (!nd)
+         break;
+       NodeListObj *single = new (interp) NodePtrNodeListObj(nd);
+       protect2 = single;
+       reversed_ = new (interp) PairNodeListObj(single, reversed_);
+      }
+    }
+    else
+      reversed_ = nl_;
+  }
+  return reversed_;
+}
+
+NodeListObj *ReverseNodeListObj::nodeListReverse(EvalContext &, Interpreter &)
+{
+  return nl_;
+}
+
+long ReverseNodeListObj::nodeListLength(EvalContext &context, Interpreter &interp)
+{
+  return nl_->nodeListLength(context, interp);
+}
+
+void ReverseNodeListObj::traceSubObjects(Collector &c) const
+{
+  c.trace(nl_);
+  c.trace(reversed_);
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
diff --git a/style/ELObj.h b/style/ELObj.h
new file mode 100644 (file)
index 0000000..4207daf
--- /dev/null
@@ -0,0 +1,591 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef ELObj_INCLUDED
+#define ELObj_INCLUDED 1
+
+#include "types.h"
+#include "Collector.h"
+#include "OutputCharStream.h"
+#include "Boolean.h"
+#include "Location.h"
+#include "Node.h"
+#include "FOTBuilder.h"
+#include <string.h>
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class Interpreter;
+class EvalContext;
+
+class Unit;
+class PairObj;
+class FunctionObj;
+class SymbolObj;
+class KeywordObj;
+class BoxObj;
+class StringObj;
+class SosofoObj;
+class AppendSosofoObj;
+class ColorObj;
+class ColorSpaceObj;
+class StyleObj;
+class AddressObj;
+class NodeListObj;
+class NamedNodeListObj;
+class Identifier;
+class LengthSpec;
+class DisplaySpaceObj;
+class InlineSpaceObj;
+class GlyphSubstTableObj;
+class VectorObj;
+class LanguageObj;
+
+class ELObj : public Collector::Object {
+public:
+  ELObj();
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(0);
+  }
+#ifdef SP_HAVE_PLACEMENT_OPERATOR_DELETE
+private:
+  void operator delete(void *p) { }
+public:
+  void operator delete(void *p, Collector &c) {
+    c.unallocateObject(p);
+  }
+#endif
+  virtual bool isNil() const;
+  virtual bool isList() const;
+  virtual bool isTrue() const;
+  virtual PairObj *asPair();
+  virtual SymbolObj *asSymbol();
+  virtual KeywordObj *asKeyword();
+  virtual FunctionObj *asFunction();
+  virtual SosofoObj *asSosofo();
+  virtual AppendSosofoObj *asAppendSosofo();
+  virtual ColorObj *asColor();
+  virtual ColorSpaceObj *asColorSpace();
+  virtual StyleObj *asStyle();
+  virtual AddressObj *asAddress();
+  virtual DisplaySpaceObj *asDisplaySpace();
+  virtual InlineSpaceObj *asInlineSpace();
+  virtual GlyphSubstTableObj *asGlyphSubstTable();
+  virtual NodeListObj *asNodeList();
+  virtual NamedNodeListObj *asNamedNodeList();
+  virtual StringObj *convertToString();        // either symbol or string
+  virtual BoxObj *asBox();
+  virtual VectorObj *asVector();
+  virtual LanguageObj *asLanguage();
+  virtual bool charValue(Char &);
+  virtual bool stringData(const Char *&, size_t &);
+  virtual void print(Interpreter &, OutputCharStream &);
+  virtual void print(Interpreter &, OutputCharStream &, unsigned);
+  virtual bool exactIntegerValue(long &);
+  virtual bool realValue(double &);
+  virtual bool inexactRealValue(double &);
+  virtual bool lengthValue(long &);
+  virtual const FOTBuilder::GlyphId *glyphId() const;
+  virtual const LengthSpec *lengthSpec() const;
+  enum QuantityType {
+    noQuantity,
+    longQuantity,
+    doubleQuantity
+    };
+  virtual QuantityType quantityValue(long &, double &, int &);
+  virtual ELObj *resolveQuantities(bool force, Interpreter &,
+                                  const Location &);
+  virtual bool optSingletonNodeList(EvalContext &, Interpreter &, NodePtr &);
+  static bool equal(ELObj &, ELObj &);
+  // Note that in DSSSL2 unlike Scheme eqv? for lists and strings is the same
+  // as equal?.  Only for vectors do they differ.
+  static bool eqv(ELObj &, ELObj &);
+protected:
+  // This checks for equality of *distinct* objects.
+  virtual bool isEqual(ELObj &);
+  // This checks for equivalence of *distinct* objects.
+  virtual bool isEquiv(ELObj &);
+};
+
+class ErrorObj : public ELObj {
+public:
+  void print(Interpreter &, OutputCharStream &);
+private:
+  ErrorObj();
+  friend class Interpreter;
+};
+
+class UnspecifiedObj : public ELObj {
+public:
+  void print(Interpreter &, OutputCharStream &);
+private:
+  UnspecifiedObj();
+  friend class Interpreter;
+};
+
+class NilObj : public ELObj {
+public:
+  bool isNil() const;
+  bool isList() const;
+  void print(Interpreter &, OutputCharStream &);
+private:
+  NilObj();
+  friend class Interpreter;
+};
+
+class TrueObj : public ELObj {
+public:
+  void print(Interpreter &, OutputCharStream &);
+private:
+  TrueObj();
+  friend class Interpreter;
+};
+
+class FalseObj : public ELObj {
+public:
+  void print(Interpreter &, OutputCharStream &);
+  bool isTrue() const;
+private:
+  FalseObj();
+  friend class Interpreter;
+};
+
+class StringObj;
+class CharObj;
+
+class SymbolObj : public ELObj {
+public:
+  void print(Interpreter &, OutputCharStream &);
+  SymbolObj *asSymbol();
+  StringObj *convertToString();
+  StringObj *name() const;
+  void traceSubObjects(Collector &) const;
+  FOTBuilder::Symbol cValue() const;
+  void setCValue(FOTBuilder::Symbol);
+  static const StringC &key(const SymbolObj &);
+private:
+  SymbolObj(StringObj *);
+  StringObj *name_;
+  FOTBuilder::Symbol cValue_;
+  friend class Interpreter;
+};
+
+class Identifier;
+
+class KeywordObj : public ELObj {
+public:
+  void print(Interpreter &, OutputCharStream &);
+  KeywordObj *asKeyword();
+  const Identifier *identifier() const;
+  bool isEqual(ELObj &);
+private:
+  KeywordObj(const Identifier *);
+  const Identifier *ident_;
+friend class Interpreter;
+};
+
+class PairObj : public ELObj {
+public:
+  PairObj(ELObj *car, ELObj *cdr);
+  ELObj *car();
+  ELObj *cdr();
+  void setCar(ELObj *);
+  void setCdr(ELObj *);
+  PairObj *asPair();
+  bool isList() const;
+  void print(Interpreter &, OutputCharStream &);
+  void traceSubObjects(Collector &) const;
+  ELObj *resolveQuantities(bool force, Interpreter &, const Location &);
+  bool isEqual(ELObj &);
+  bool isEquiv(ELObj &);
+private:
+  ELObj *car_;
+  ELObj *cdr_;
+};
+
+class VectorObj : public ELObj, public Vector<ELObj *> {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  VectorObj();
+  VectorObj(Vector<ELObj *> &v);
+  void traceSubObjects(Collector &) const;
+  VectorObj *asVector();
+  bool isEqual(ELObj &);
+  bool isEquiv(ELObj &);
+  void print(Interpreter &, OutputCharStream &);
+  ELObj *resolveQuantities(bool force, Interpreter &, const Location &);
+};
+
+class CharObj : public ELObj {
+public:
+  Char ch();
+  void print(Interpreter &, OutputCharStream &);
+  void display(Interpreter &, OutputCharStream &) const;
+  bool isEqual(ELObj &);
+  bool charValue(Char &);
+private:
+  CharObj(Char);
+  Char ch_;
+  friend class Interpreter;
+};
+
+class StringObj : public ELObj, public StringC {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  StringObj();
+  StringObj(const StringC &str);
+  StringObj(const Char *, size_t);
+  void print(Interpreter &, OutputCharStream &);
+  StringObj *convertToString();
+  bool stringData(const Char *&, size_t &);
+  bool isEqual(ELObj &);
+};
+
+class IntegerObj : public ELObj {
+public:
+  void print(Interpreter &, OutputCharStream &);
+  void print(Interpreter &, OutputCharStream &, unsigned);
+  bool exactIntegerValue(long &);
+  bool realValue(double &);
+  QuantityType quantityValue(long &, double &, int &);
+  bool isEqual(ELObj &);
+private:
+  friend class Interpreter;
+  IntegerObj();
+  IntegerObj(long);
+  long n_;
+};
+
+class RealObj : public ELObj {
+public:
+  RealObj(double);
+  bool realValue(double &);
+  bool inexactRealValue(double &);
+  QuantityType quantityValue(long &, double &, int &);
+  bool isEqual(ELObj &);
+  void print(Interpreter &, OutputCharStream &);
+private:
+  double n_;
+};
+
+class LengthObj : public ELObj {
+public:
+  LengthObj(long units);
+  bool lengthValue(long &);
+  QuantityType quantityValue(long &, double &, int &);
+  void print(Interpreter &, OutputCharStream &);
+  bool isEqual(ELObj &);
+private:
+  long n_;
+};
+
+class QuantityObj : public ELObj {
+public:
+  QuantityObj(double, int);
+  QuantityType quantityValue(long &, double &, int &);
+  void print(Interpreter &, OutputCharStream &);
+  bool isEqual(ELObj &);
+  bool realValue(double &);
+  bool inexactRealValue(double &);
+private:
+  // This is in units per inch.
+  double val_;
+  int dim_;
+};
+
+class LengthSpec {
+public:
+  enum Unknown { displaySize = 1, tableUnit };
+  LengthSpec();
+  LengthSpec(double);
+  LengthSpec(Unknown, double);
+  void operator+=(const LengthSpec &);
+  void operator+=(double d) { val_[0] += d; }
+  void operator-=(const LengthSpec &);
+  void operator-=(double d) { val_[0] -= d; }
+  void operator*=(double);
+  void operator/=(double);
+  bool convert(FOTBuilder::LengthSpec &) const;
+  bool convert(FOTBuilder::TableLengthSpec &) const;
+private:
+  enum { nVals = 3 };
+  double val_[nVals];
+};
+
+class LengthSpecObj : public ELObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  LengthSpecObj(const LengthSpec &);
+  const LengthSpec *lengthSpec() const;
+private:
+  Owner<LengthSpec> lengthSpec_;
+};
+
+class DisplaySpaceObj : public ELObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  DisplaySpaceObj(const FOTBuilder::DisplaySpace &);
+  const FOTBuilder::DisplaySpace &displaySpace() const;
+  DisplaySpaceObj *asDisplaySpace();
+private:
+  Owner<FOTBuilder::DisplaySpace> displaySpace_;
+};
+
+class InlineSpaceObj : public ELObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  InlineSpaceObj(const FOTBuilder::InlineSpace &);
+  const FOTBuilder::InlineSpace &inlineSpace() const;
+  InlineSpaceObj *asInlineSpace();
+private:
+  Owner<FOTBuilder::InlineSpace> inlineSpace_;
+};
+
+class UnresolvedQuantityObj : public ELObj {
+public:
+  UnresolvedQuantityObj(double, Unit *, int);
+  ELObj *resolveQuantities(bool force, Interpreter &, const Location &);
+private:
+  double val_;
+  Unit *unit_;
+  int unitExp_;
+};
+
+class UnresolvedLengthObj : public ELObj {
+public:
+  UnresolvedLengthObj(long val, int valExp, Unit *);
+  ELObj *resolveQuantities(bool force, Interpreter &, const Location &);
+private:
+  long val_;
+  Unit *unit_;
+  int valExp_;
+};
+
+class GlyphIdObj : public ELObj {
+public:
+  GlyphIdObj(const FOTBuilder::GlyphId &);
+  const FOTBuilder::GlyphId *glyphId() const;
+  bool isEqual(ELObj &);
+private:
+  FOTBuilder::GlyphId glyphId_;
+};
+
+class GlyphSubstTableObj : public ELObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  GlyphSubstTableObj(const ConstPtr<FOTBuilder::GlyphSubstTable> &);
+  GlyphSubstTableObj *asGlyphSubstTable();
+  const ConstPtr<FOTBuilder::GlyphSubstTable> &glyphSubstTable() const;
+private:
+  ConstPtr<FOTBuilder::GlyphSubstTable> table_;
+};
+
+class AddressObj : public ELObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  AddressObj(FOTBuilder::Address::Type,
+             const NodePtr & = NodePtr(),
+            const StringC & = StringC(),
+            const StringC & = StringC(),
+            const StringC & = StringC());
+  AddressObj *asAddress();
+  const FOTBuilder::Address &address() const;
+private:
+  Owner<FOTBuilder::Address> address_;
+};
+
+class NodeListObj : public ELObj {
+public:
+  NodeListObj *asNodeList();
+  bool optSingletonNodeList(EvalContext &, Interpreter &, NodePtr &);
+  virtual NodePtr nodeListFirst(EvalContext &, Interpreter &) = 0;
+  virtual NodeListObj *nodeListRest(EvalContext &, Interpreter &) = 0;
+  virtual NodeListObj *nodeListNoOrder(Collector &);
+  // If this node contains all the node in the chunk of the first node, then
+  // this *may* return the node list containing the nodes following the chunk;
+  // If so chunk, will be set to 1.  Otherwise return nodeListRest() and set
+  // chunk to 0.  If charChunk() returns a string of length n, then
+  // the chunk of the node is the node together with the n - 1 following siblings;
+  // otherwise the chunk of the node is the node itself.
+  virtual NodeListObj *nodeListChunkRest(EvalContext &, Interpreter &, bool &chunk);
+  virtual NodePtr nodeListRef(long, EvalContext &, Interpreter &);
+  virtual NodeListObj *nodeListReverse(EvalContext &, Interpreter &);
+  virtual long nodeListLength(EvalContext &, Interpreter &);
+  virtual bool suppressError();
+};
+
+class NamedNodeListObj : public NodeListObj {
+public:
+  NamedNodeListObj *asNamedNodeList();
+  virtual NodePtr namedNode(const Char *, size_t) = 0;
+  virtual bool nodeName(const NodePtr &, GroveString &) = 0;
+  virtual size_t normalize(Char *, size_t) = 0;
+};
+
+class NodePtrNodeListObj : public NodeListObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  NodePtrNodeListObj();
+  NodePtrNodeListObj(const NodePtr &);
+  NodePtr nodeListFirst(EvalContext &, Interpreter &);
+  NodeListObj *nodeListRest(EvalContext &, Interpreter &);
+  bool optSingletonNodeList(EvalContext &, Interpreter &, NodePtr &);
+  bool chunkComplete();
+private:
+  // Null for no node.
+  NodePtr node_;
+};
+
+class NodeListPtrNodeListObj : public NodeListObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  NodeListPtrNodeListObj(const NodeListPtr &);
+  NodePtr nodeListFirst(EvalContext &, Interpreter &);
+  NodeListObj *nodeListRest(EvalContext &, Interpreter &);
+  NodeListObj *nodeListChunkRest(EvalContext &, Interpreter &, bool &);
+  NodePtr nodeListRef(long, EvalContext &, Interpreter &);
+private:
+  // never null
+  NodeListPtr nodeList_;
+};
+
+class NamedNodeListPtrNodeListObj : public NamedNodeListObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  NamedNodeListPtrNodeListObj(const NamedNodeListPtr &);
+  NodePtr nodeListFirst(EvalContext &, Interpreter &);
+  NodeListObj *nodeListRest(EvalContext &, Interpreter &);
+  NodePtr namedNode(const Char *, size_t);
+  bool nodeName(const NodePtr &, GroveString &);
+  size_t normalize(Char *, size_t);
+  NodeListObj *nodeListNoOrder(Collector &);
+private:
+  NamedNodeListPtr namedNodeList_;
+  // cached node list, null if not yet computed
+  NodeListPtr nodeList_;
+};
+
+class PairNodeListObj : public NodeListObj {
+public:
+  PairNodeListObj(NodeListObj *, NodeListObj *);
+  NodePtr nodeListFirst(EvalContext &, Interpreter &);
+  NodeListObj *nodeListRest(EvalContext &, Interpreter &);
+  NodeListObj *nodeListChunkRest(EvalContext &, Interpreter &, bool &);
+  void traceSubObjects(Collector &) const;
+private:
+  NodeListObj *head_; // may be null
+  NodeListObj *tail_;
+};
+
+inline
+bool ELObj::equal(ELObj &obj1, ELObj &obj2)
+{
+  return &obj1 == &obj2 || obj1.isEqual(obj2);
+}
+    
+inline
+bool ELObj::eqv(ELObj &obj1, ELObj &obj2)
+{
+  return &obj1 == &obj2 || obj1.isEquiv(obj2);
+}
+
+inline
+ELObj *PairObj::car()
+{
+  return car_;
+}
+
+inline
+ELObj *PairObj::cdr()
+{
+  return cdr_;
+}
+
+inline
+void PairObj::setCar(ELObj *car)
+{
+  car_ = car;
+}
+
+inline
+void PairObj::setCdr(ELObj *cdr)
+{
+  cdr_ = cdr;
+}
+
+inline
+StringObj *SymbolObj::name() const
+{
+  return name_;
+}
+
+inline
+FOTBuilder::Symbol SymbolObj::cValue() const
+{
+  return cValue_;
+}
+
+inline
+void SymbolObj::setCValue(FOTBuilder::Symbol sym)
+{
+  cValue_ = sym;
+}
+
+inline
+Char CharObj::ch()
+{
+  return ch_;
+}
+
+inline
+const StringC &SymbolObj::key(const SymbolObj &sym)
+{
+  return *sym.name();
+}
+
+inline
+const Identifier *KeywordObj::identifier() const
+{
+  return ident_;
+}
+
+inline
+const FOTBuilder::Address &AddressObj::address() const
+{
+  return *address_;
+}
+
+inline
+const ConstPtr<FOTBuilder::GlyphSubstTable> &
+GlyphSubstTableObj::glyphSubstTable() const
+{
+  return table_;
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not ELObj_INCLUDED */
diff --git a/style/ELObjMessageArg.cxx b/style/ELObjMessageArg.cxx
new file mode 100644 (file)
index 0000000..05faf32
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#include "stylelib.h"
+#include "ELObjMessageArg.h"
+#include "Interpreter.h"
+#include "OutputCharStream.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+ELObjMessageArg::ELObjMessageArg(ELObj *obj, Interpreter &interp)
+: StringMessageArg(convert(obj, interp))
+{
+}
+
+StringC ELObjMessageArg::convert(ELObj *obj, Interpreter &interp)
+{
+  StrOutputCharStream os;
+  obj->print(interp, os);
+  StringC result;
+  os.extractString(result);
+  return result;
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
diff --git a/style/ELObjMessageArg.h b/style/ELObjMessageArg.h
new file mode 100644 (file)
index 0000000..e82d5a2
--- /dev/null
@@ -0,0 +1,26 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef ELObjMessageArg_INCLUDED
+#define ELObjMessageArg_INCLUDED 1
+
+#include "ELObj.h"
+#include "MessageArg.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class ELObjMessageArg : public StringMessageArg {
+public:
+  ELObjMessageArg(ELObj *, Interpreter &);
+private:
+  static StringC convert(ELObj *obj, Interpreter &interp);
+};
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+
+#endif /* not ELObjMessageArg_INCLUDED */
diff --git a/style/ELObjPropVal.h b/style/ELObjPropVal.h
new file mode 100644 (file)
index 0000000..9630647
--- /dev/null
@@ -0,0 +1,90 @@
+// Copyright (c) 1999 Matthias Clasen
+// See the file copying.txt for copying permission.
+
+#ifndef ELObjPropVal_INCLUDED
+#define ELObjPropVal_INCLUDED 1
+
+#include "Node.h"
+#include "ELObj.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class ELObjPropertyValue : public PropertyValue {
+public:
+  ELObjPropertyValue(Interpreter &interp, bool rcs) : interp_(&interp), rcs_(rcs), obj(0) { }
+  void set(const NodePtr &nd) {
+    obj = new (*interp_) NodePtrNodeListObj(nd);
+  }
+  void set(const NodeListPtr &nl) {
+    obj = new (*interp_) NodeListPtrNodeListObj(nl);
+  }
+  void set(const NamedNodeListPtr &nnl) {
+    obj = new (*interp_) NamedNodeListPtrNodeListObj(nnl);
+  }
+  void set(bool b) {
+    if (b)
+      obj = interp_->makeTrue();
+    else
+      obj = interp_->makeFalse();
+  }
+ void set(GroveChar c) {
+    obj = interp_->makeChar(c);
+  }
+  void set(GroveString s) {
+    obj = new (*interp_) StringObj(s.data(), s.size());
+  }
+  void set(ComponentName::Id id) {
+    const char *s = rcs_ ? ComponentName::rcsName(id) : ComponentName::sdqlName(id);
+    obj = interp_->makeSymbol(interp_->makeStringC(s));
+  }
+  void set(const GroveStringListPtr &gsListPtr) {
+    PairObj *head = new (*interp_) PairObj(0, 0);
+    ELObjDynamicRoot protect(*interp_, head);
+    PairObj *tail = head;
+    ConstGroveStringListIter sgListIter(*gsListPtr);
+    while (!sgListIter.done()) {
+      StringObj *gs = new (*interp_) StringObj(sgListIter.cur().data(), sgListIter.cur().size());
+      tail->setCdr(gs);
+      PairObj *tem = new (*interp_) PairObj(gs, 0);
+      tail->setCdr(tem);
+      tail = tem;
+      sgListIter.next();
+    }
+    tail->setCdr(interp_->makeNil());
+    obj = head->cdr();
+  }
+  void set(const ComponentName::Id *names) {
+    PairObj *head = new (*interp_) PairObj(0, 0);
+    ELObjDynamicRoot protect(*interp_, head);
+    PairObj *tail = head;
+    for (int i = 0; names[i] != ComponentName::noId; i++) {
+      const char *s = (rcs_
+                       ? ComponentName::rcsName(names[i])
+                       : ComponentName::sdqlName(names[i]));
+      SymbolObj *sym = interp_->makeSymbol(interp_->makeStringC(s));
+      tail->setCdr(sym); // in case we ever gc symbols
+      PairObj *tem = new (*interp_) PairObj(sym, 0);
+      tail->setCdr(tem);
+      tail = tem;
+    }
+    tail->setCdr(interp_->makeNil());
+    obj = head->cdr();
+  }
+  void set(long l) {
+    obj = interp_->makeInteger(l);
+  }
+  ELObj *obj;
+private:
+  Interpreter *interp_;
+  bool rcs_;
+};
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not ELObjPropVal_INCLUDED */
+
+
diff --git a/style/EvalContext.h b/style/EvalContext.h
new file mode 100644 (file)
index 0000000..f7ff45a
--- /dev/null
@@ -0,0 +1,71 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef EvalContext_INCLUDED
+#define EvalContext_INCLUDED 1
+
+#include "Boolean.h"
+#include "Node.h"
+#include "Vector.h"
+#include <stddef.h>
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class StyleStack;
+class StyleObj;
+class ProcessingMode;
+class LanguageObj;
+
+class EvalContext {
+public:
+  class CurrentNodeSetter {
+  public:
+   CurrentNodeSetter(const NodePtr &, const ProcessingMode *, EvalContext &);
+   ~CurrentNodeSetter();
+  private:
+    EvalContext *ec_;
+    NodePtr saveCurrentNode_;
+    const ProcessingMode *saveProcessingMode_;
+  };
+
+  EvalContext();
+  StyleStack *styleStack;
+  unsigned specLevel; // level of the specification flow object in the style stack
+  StyleObj *overridingStyle;
+  Vector<size_t> *actualDependencies;
+  NodePtr currentNode;
+  const ProcessingMode *processingMode;
+  LanguageObj *currentLanguage;
+};
+
+inline
+EvalContext::EvalContext()
+: styleStack(0), overridingStyle(0),
+  actualDependencies(0), processingMode(0), currentLanguage(0)
+{
+}
+
+inline
+EvalContext::CurrentNodeSetter::CurrentNodeSetter(const NodePtr &node,
+                                                 const ProcessingMode *mode,
+                                                 EvalContext &ec)
+: ec_(&ec), saveCurrentNode_(ec.currentNode), saveProcessingMode_(ec.processingMode)
+{
+  ec.currentNode = node;
+  ec.processingMode = mode;
+}
+
+inline
+EvalContext::CurrentNodeSetter::~CurrentNodeSetter()
+{
+  ec_->currentNode = saveCurrentNode_;
+  ec_->processingMode = saveProcessingMode_;
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not EvalContext_INCLUDED */
diff --git a/style/Expression.cxx b/style/Expression.cxx
new file mode 100644 (file)
index 0000000..13211cb
--- /dev/null
@@ -0,0 +1,1585 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#include "stylelib.h"
+#include "Insn.h"
+#include "Insn2.h"
+#include "Interpreter.h"
+#include "InterpreterMessages.h"
+#include "ELObjMessageArg.h"
+#include "Expression.h"
+#include "Style.h"
+#include "macros.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+Expression::Expression(const Location &loc)
+: loc_(loc)
+{
+}
+
+void Expression::optimize(Interpreter &, const Environment &, Owner<Expression> &)
+{
+}
+
+ELObj *Expression::constantValue() const
+{
+  return 0;
+}
+
+const Identifier *Expression::keyword() const
+{
+  return 0;
+}
+
+void Expression::markBoundVars(BoundVarList &, bool)
+{
+}
+
+ConstantExpression::ConstantExpression(ELObj *obj, const Location &loc)
+: Expression(loc), obj_(obj)
+{
+}
+
+InsnPtr
+ConstantExpression::compile(Interpreter &interp, const Environment &env,
+                           int stackPos, const InsnPtr &next)
+{
+  return new ConstantInsn(obj_, new ResolveQuantitiesInsn(location(), next));
+}
+
+void ConstantExpression::optimize(Interpreter &interp, const Environment &,
+                                 Owner<Expression> &expr)
+{
+  ELObj *tem = obj_->resolveQuantities(0, interp, location());
+  if (tem) {
+    interp.makePermanent(tem);
+    expr = new ResolvedConstantExpression(tem, location());
+  }
+}
+
+bool ConstantExpression::canEval(bool) const
+{
+  return 0;
+}
+
+const Identifier *ConstantExpression::keyword() const
+{
+  const KeywordObj *k = obj_->asKeyword();
+  if (k)
+    return k->identifier();
+  else
+    return 0;
+}
+
+ResolvedConstantExpression::ResolvedConstantExpression(ELObj *obj, const Location &loc)
+: Expression(loc), obj_(obj)
+{
+}
+
+InsnPtr
+ResolvedConstantExpression::compile(Interpreter &interp, const Environment &env,
+                                   int stackPos, const InsnPtr &next)
+{
+  return new ConstantInsn(obj_, next);
+}
+
+ELObj *ResolvedConstantExpression::constantValue() const
+{
+  return obj_;
+}
+
+bool ResolvedConstantExpression::canEval(bool) const
+{
+  return 1;
+}
+
+CallExpression::CallExpression(Owner<Expression> &op,
+                              NCVector<Owner<Expression> > &args,
+                              const Location &loc)
+: Expression(loc)
+{
+  op.swap(op_);
+  args.swap(args_);
+}
+
+bool CallExpression::canEval(bool) const
+{
+  if (!op_->canEval(1))
+    return 0;
+  for (size_t i = 0; i < args_.size(); i++)
+    if (!args_[i]->canEval(1))
+      return 0;
+  return 1;
+}
+
+int CallExpression::nArgs()
+{
+  return args_.size();
+}
+
+InsnPtr CallExpression::compile(Interpreter &interp, const Environment &env,
+                               int stackPos, const InsnPtr &next)
+{
+  op_->optimize(interp, env, op_);
+  ELObj *value = op_->constantValue();
+  InsnPtr result;
+  if (value) {
+    FunctionObj *func = value->asFunction();
+    if (!func) {
+      interp.setNextLocation(location());
+      interp.message(InterpreterMessages::callNonFunction,
+                    ELObjMessageArg(value, interp));
+      return new ErrorInsn;
+    }
+    if (nArgs() < func->nRequiredArgs()) {
+      interp.setNextLocation(location());
+      interp.message(InterpreterMessages::missingArg);
+      return new ErrorInsn;
+    }
+    if (nArgs() - func->nRequiredArgs() > func->nOptionalArgs()) {
+      if (func->nKeyArgs()) {
+       if ((nArgs() - func->nRequiredArgs() - func->nOptionalArgs()) & 1) {
+         interp.setNextLocation(location());
+         interp.message(InterpreterMessages::oddKeyArgs);
+         args_.resize(func->nRequiredArgs() + func->nOptionalArgs());
+       }
+      }
+      else if (!func->restArg()) {
+       interp.setNextLocation(location());
+       interp.message(InterpreterMessages::tooManyArgs);
+       args_.resize(func->nRequiredArgs() + func->nOptionalArgs());
+      }
+    }
+
+    int callerArgs;
+    if (!next.isNull() && next->isReturn(callerArgs) && !interp.debugMode())
+      result = func->makeTailCallInsn(nArgs(), interp, location(), callerArgs);
+    else
+      result = func->makeCallInsn(nArgs(), interp, location(), next);
+  }
+  else {
+    int n = nArgs();
+    int callerArgs;
+    if (!next.isNull() && next->isReturn(callerArgs) && !interp.debugMode())
+      result = new TailApplyInsn(callerArgs, n, location());
+    else
+      result = new ApplyInsn(n, location(), next);
+    result = op_->compile(interp, env, stackPos + n, result);
+  }
+  for (size_t i = args_.size(); i > 0; i--)
+    result = optimizeCompile(args_[i - 1], interp, env,
+                             stackPos + i - 1, result);
+  return result;
+}
+
+void CallExpression::markBoundVars(BoundVarList &vars, bool shared)
+{
+  op_->markBoundVars(vars, shared);
+  for (size_t i = 0; i < args_.size(); i++)
+    args_[i]->markBoundVars(vars, shared);
+}
+
+VariableExpression::VariableExpression(const Identifier *ident,
+                                      const Location &loc)
+: Expression(loc), ident_(ident), isTop_(0)
+{
+}
+
+InsnPtr VariableExpression::compile(Interpreter &interp,
+                                   const Environment &env,
+                                   int stackPos,
+                                   const InsnPtr &next)
+{
+  bool isFrame;
+  int index;
+  unsigned flags;
+  if (env.lookup(ident_, isFrame, index, flags)) {
+    bool boxed = BoundVar::flagsBoxed(flags);
+    InsnPtr tem;
+    int n;
+    if (isFrame
+        && !next.isNull()
+        && next->isPopBindings(n, tem)
+       && n == 1
+       && index - stackPos == -1) {
+      if (flags & BoundVar::uninitFlag)
+       tem = new CheckInitInsn(ident_, location(), tem);
+      // This happens with named let.
+      if (boxed)
+       return new UnboxInsn(tem);
+      else
+       return tem;
+    }
+    if (flags & BoundVar::uninitFlag)
+      tem = new CheckInitInsn(ident_, location(), next);
+    else
+      tem = next;
+    if (boxed)
+      tem = new UnboxInsn(tem);
+    if (isFrame)
+      return new StackRefInsn(index - stackPos, index, tem);
+    else
+      return new ClosureRefInsn(index, tem);
+  }
+  isTop_ = 1;
+  Location loc;
+  unsigned part;
+  if (!ident_->defined(part, loc)) {
+    interp.setNextLocation(location());
+    interp.message(InterpreterMessages::undefinedVariableReference,
+                  StringMessageArg(ident_->name()));
+    return new ErrorInsn;
+  }
+  ELObj *val = ident_->computeValue(0, interp);
+  if (!val)
+    return new TopRefInsn(ident_, next);
+  if (interp.isError(val))
+    return new ErrorInsn;
+  return new ConstantInsn(val, next);
+}
+
+void VariableExpression::optimize(Interpreter &interp, const Environment &env,
+                                 Owner<Expression> &expr)
+{
+  bool isFrame;
+  int index;
+  unsigned flags;
+  if (env.lookup(ident_, isFrame, index, flags))
+    return;
+  isTop_ = 1;
+  Location loc;
+  unsigned part;
+  if (ident_->defined(part, loc)) {
+    ELObj *obj = ident_->computeValue(0, interp);
+    if (obj && !interp.isError(obj)) {
+      interp.makePermanent(obj);
+      expr = new ConstantExpression(obj, location());
+      expr->optimize(interp, env, expr);
+    }
+  }
+}
+
+bool VariableExpression::canEval(bool) const
+{
+  return !isTop_ || ident_->evaluated();
+}
+
+void VariableExpression::markBoundVars(BoundVarList &vars, bool shared)
+{
+  vars.mark(ident_, BoundVar::usedFlag | (shared ? BoundVar::sharedFlag : 0));
+}
+
+IfExpression::IfExpression(Owner<Expression> &test,
+                          Owner<Expression> &consequent,
+                          Owner<Expression> &alternate,
+                          const Location &loc)
+: Expression(loc)
+{
+  test.swap(test_);
+  consequent.swap(consequent_);
+  alternate.swap(alternate_);
+}
+
+bool IfExpression::canEval(bool maybeCall) const
+{
+  return (test_->canEval(maybeCall)
+          && consequent_->canEval(maybeCall)
+         && alternate_->canEval(maybeCall));
+}
+
+void IfExpression::optimize(Interpreter &interp, const Environment &env,
+                           Owner<Expression> &expr)
+{
+  test_->optimize(interp, env, test_);
+  ELObj *obj = test_->constantValue();
+  if (obj) {
+    if (obj->isTrue()) {
+      expr = consequent_.extract();
+      expr->optimize(interp, env, expr);
+    }
+    else {
+      expr = alternate_.extract();
+      expr->optimize(interp, env, expr);
+    }
+  }
+}
+
+InsnPtr IfExpression::compile(Interpreter &interp, const Environment &env,
+                             int stackPos, const InsnPtr &next)
+{
+  alternate_->optimize(interp, env, alternate_);
+  if (alternate_->constantValue() == interp.makeFalse())
+    return test_->compile(interp, env, stackPos,
+                         new AndInsn(optimizeCompile(consequent_,
+                                                     interp, env,
+                                                     stackPos, next),
+                                     next));
+  else
+    return test_->compile(interp, env, stackPos,
+                         new TestInsn(optimizeCompile(consequent_,
+                                                      interp, env,
+                                                      stackPos, next),
+                                      alternate_->compile(interp, env,
+                                                          stackPos, next)));
+}
+
+void IfExpression::markBoundVars(BoundVarList &vars, bool shared)
+{
+  test_->markBoundVars(vars, shared);
+  consequent_->markBoundVars(vars, shared);
+  alternate_->markBoundVars(vars, shared);
+}
+
+OrExpression::OrExpression(Owner<Expression> &test1,
+                          Owner<Expression> &test2,
+                          const Location &loc)
+: Expression(loc)
+{
+  test1.swap(test1_);
+  test2.swap(test2_);
+}
+
+bool OrExpression::canEval(bool maybeCall) const
+{
+  return (test1_->canEval(maybeCall)
+          && test2_->canEval(maybeCall));
+}
+
+void OrExpression::optimize(Interpreter &interp, const Environment &env,
+                           Owner<Expression> &expr)
+{
+  test1_->optimize(interp, env, test1_);
+  ELObj *obj = test1_->constantValue();
+  if (obj) {
+    if (obj->isTrue())
+      expr = test1_.extract();
+    else {
+      expr = test2_.extract();
+      expr->optimize(interp, env, expr);
+    }
+  }
+}
+
+InsnPtr OrExpression::compile(Interpreter &interp, const Environment &env,
+                             int stackPos, const InsnPtr &next)
+{
+  return test1_->compile(interp, env, stackPos,
+                        new OrInsn(optimizeCompile(test2_, interp, env,
+                                                   stackPos, next),
+                                   next));
+}
+
+void OrExpression::markBoundVars(BoundVarList &vars, bool shared)
+{
+  test1_->markBoundVars(vars, shared);
+  test2_->markBoundVars(vars, shared);
+}
+
+CondFailExpression::CondFailExpression(const Location &loc)
+: Expression(loc)
+{
+}
+
+InsnPtr CondFailExpression::compile(Interpreter &, const Environment &,
+                                   int, const InsnPtr &)
+{
+  return new CondFailInsn(location());
+}
+
+bool CondFailExpression::canEval(bool maybeCall) const
+{
+  return 1;
+}
+
+CaseExpression::CaseExpression(Owner<Expression> &key,
+                              NCVector<Case> &cases,
+                              Owner<Expression> &elseClause,
+                              const Location &loc)
+: Expression(loc)
+{
+  key.swap(key_);
+  cases.swap(cases_);
+  elseClause.swap(else_);
+}
+
+InsnPtr CaseExpression::compile(Interpreter &interp,
+                               const Environment &env, int stackPos,
+                               const InsnPtr &next)
+{
+  InsnPtr finish;
+  if (else_)
+    finish = new PopInsn(else_->compile(interp, env, stackPos, next));
+  else
+    finish = new CaseFailInsn(location());
+  for (size_t i = 0; i < cases_.size(); i++) {
+    InsnPtr match = cases_[i].expr->compile(interp, env, stackPos, next);
+    for (size_t j = 0; j < nResolved_[i]; j++)
+      finish = new CaseInsn(cases_[i].datums[j], match, finish);
+  }
+  // FIXME handle unresolved quantities
+  return key_->compile(interp, env, stackPos, finish);
+}
+
+void CaseExpression::markBoundVars(BoundVarList &vars, bool shared)
+{
+  key_->markBoundVars(vars, shared);
+  for (size_t i = 0; i < cases_.size(); i++)
+    cases_[i].expr->markBoundVars(vars, shared);
+  if (else_)
+    else_->markBoundVars(vars, shared);
+}
+
+bool CaseExpression::canEval(bool maybeCall) const
+{
+  if (!key_->canEval(maybeCall))
+    return 0;
+  if (else_ && !else_->canEval(maybeCall))
+    return 0;
+  for (size_t i = 0; i < cases_.size(); i++) {
+    if (!cases_[i].expr->canEval(maybeCall))
+      return 0;
+    if (nResolved_[i] == cases_[i].datums.size())
+      return 0;
+  }
+  return 1;
+}
+
+void CaseExpression::optimize(Interpreter &interp, const Environment &env,
+                             Owner<Expression> &expr)
+{
+  key_->optimize(interp, env, key_);
+  ELObj *k = key_->constantValue();
+  nResolved_.assign(cases_.size(), 0);
+  bool unresolved = 0;
+  for (size_t i = 0; i < cases_.size(); i++) {
+    cases_[i].expr->optimize(interp, env, cases_[i].expr);
+    int nResolved = 0;
+    for (size_t j = 0; j < cases_[i].datums.size(); j++) {
+      ELObj *tem = cases_[i].datums[j]->resolveQuantities(0, interp,
+                                                         location());
+      if (tem) {
+       if (k && ELObj::eqv(*k, *tem)) {
+         expr = cases_[i].expr.extract();
+         return;
+       }
+       if (j != nResolved)
+         cases_[i].datums[j] = cases_[i].datums[nResolved];
+       cases_[i].datums[nResolved++] = tem;
+      }
+      else
+       unresolved = 1;
+    }
+    nResolved_[i] = nResolved;
+  }
+  if (else_) {
+    else_->optimize(interp, env, else_);
+    if (k && !unresolved)
+      expr = else_.extract();
+  }
+  else if (k && !unresolved) {
+    interp.setNextLocation(location());
+    interp.message(InterpreterMessages::caseFail, ELObjMessageArg(k, interp));
+  }
+  if (unresolved) {
+    interp.setNextLocation(location());
+    interp.message(InterpreterMessages::caseUnresolvedQuantities);
+  }
+}
+
+
+LambdaExpression::LambdaExpression(Vector<const Identifier *> &formals,
+                                  NCVector<Owner<Expression> > &inits,
+                                  int nOptional,
+                                  bool hasRest,
+                                  int nKey,
+                                  Owner<Expression> &body,
+                                  const Location &loc)
+: Expression(loc)
+{
+  formals.swap(formals_);
+  inits.swap(inits_);
+  body.swap(body_);
+  sig_.nRequiredArgs = formals_.size() - nOptional - nKey - hasRest;
+  sig_.nOptionalArgs = nOptional;
+  sig_.restArg = hasRest;
+  sig_.nKeyArgs = nKey;
+  sig_.keys = formals_.begin() + formals_.size() - nKey;
+}
+
+bool LambdaExpression::canEval(bool maybeCall) const
+{
+  if (!maybeCall)
+    return 1;
+  if (!body_->canEval(1))
+    return 0;
+  for (size_t i = 0; i < inits_.size(); i++)
+    if (inits_[i] && !inits_[i]->canEval(1))
+      return 0;
+  return 1;
+}
+
+InsnPtr LambdaExpression::compile(Interpreter &interp, const Environment &env,
+                                 int stackPos, const InsnPtr &next)
+{
+  BoundVarList boundVars;
+  env.boundVars(boundVars);
+  markBoundVars(boundVars, 0);
+  boundVars.removeUnused();
+  BoundVarList formalVars(formals_, sig_.nRequiredArgs);
+  for (int i = 0; i < sig_.nOptionalArgs + sig_.nKeyArgs; i++) {
+    if (inits_[i])
+      inits_[i]->markBoundVars(formalVars, 0);
+    formalVars.append(formals_[sig_.nRequiredArgs + i], 0);
+  }
+  if (sig_.restArg)
+    formalVars.append(formals_.back(), 0);
+  ASSERT(formalVars.size() == formals_.size());
+  body_->markBoundVars(formalVars, 0);
+  InsnPtr code
+    = optimizeCompile(body_, interp,
+                     Environment(formalVars, boundVars), formals_.size(),
+                     new ReturnInsn(formals_.size()));
+  if (sig_.nOptionalArgs || sig_.restArg || sig_.nKeyArgs) {
+    Vector<InsnPtr> entryPoints(sig_.nOptionalArgs
+                               + (sig_.restArg || sig_.nKeyArgs)
+                               + 1);
+    // First entry point is for only required args supplied
+    // Next entry is for one optional arg supplied, no rest arg
+    // Next entry is for two optional args, no rest arg
+    // ..
+    // Next entry is for all optional args, no other args
+    // Last entry is for all optional args supplied, and other args
+    //  (for this entry point all args are pushed; unspecified
+    //   keyword args are bound to 0).
+    entryPoints.back() = code;
+    // Box the rest arg if necessary.
+    if (sig_.restArg && formalVars.back().boxed())
+      entryPoints.back() = new BoxStackInsn(-1 - sig_.nKeyArgs, entryPoints.back());
+    if (sig_.nKeyArgs) {
+      // For each keyword argument test whether it is 0,
+      // and if so initialize it.
+      for (int i = sig_.nOptionalArgs + sig_.nKeyArgs - 1;
+          i >= sig_.nOptionalArgs;
+          i--) {
+       int offset = i - (sig_.nOptionalArgs + sig_.nKeyArgs);
+       InsnPtr &next = entryPoints.back();
+       InsnPtr set(new SetKeyArgInsn(offset, next));
+       if (formalVars[sig_.nRequiredArgs + i].boxed())
+         set = new BoxInsn(set);
+       if (inits_[i]) {
+         BoundVarList f(formalVars);
+         f.resize(sig_.nRequiredArgs + i + sig_.restArg);
+         set = optimizeCompile(inits_[i], interp,
+                               Environment(f, boundVars),
+                               formals_.size(),
+                               set);
+       }
+       else
+         set = new ConstantInsn(interp.makeFalse(), set);
+       next = new TestNullInsn(offset, set, next);
+      }
+    }
+    if (sig_.restArg || sig_.nKeyArgs) {
+      for (int i = sig_.nOptionalArgs + sig_.nKeyArgs - 1;
+          i >= sig_.nOptionalArgs;
+          i--) {
+       if (formalVars[sig_.nRequiredArgs + i].boxed())
+         code = new BoxInsn(code);
+       if (inits_[i]) {
+         BoundVarList f(formalVars);
+         f.resize(sig_.nRequiredArgs + i + sig_.restArg);
+         code = optimizeCompile(inits_[i], interp,
+                                Environment(f, boundVars),
+                                f.size(),
+                                code);
+       }
+       else
+         code = new ConstantInsn(interp.makeFalse(), code);
+      }
+      if (sig_.restArg) {
+       if (formalVars.back().boxed())
+         code = new BoxInsn(code);
+       code = new ConstantInsn(interp.makeNil(), code);
+      }
+      entryPoints[sig_.nOptionalArgs] = code;
+    }
+    for (int i = sig_.nOptionalArgs - 1; i >= 0; i--) {
+      InsnPtr tem(entryPoints[i + 1]);
+      if (formalVars[sig_.nRequiredArgs + i].boxed())
+       tem = new BoxInsn(tem);
+      if (inits_[i]) {
+       BoundVarList f(formalVars);
+       f.resize(sig_.nRequiredArgs + i);
+       entryPoints[i]
+         = optimizeCompile(inits_[i], interp,
+                           Environment(f, boundVars),
+                           f.size(),
+                           tem);
+      }
+      else
+       entryPoints[i] = new ConstantInsn(interp.makeFalse(),
+                                         tem);
+    }
+    for (int i = 0; i < sig_.nOptionalArgs; i++) {
+      if (formalVars[sig_.nRequiredArgs + i].boxed()) {
+        for (int j = i; j < sig_.nOptionalArgs; j++)
+         entryPoints[j + 1] = new BoxArgInsn(i + sig_.nRequiredArgs, entryPoints[j + 1]);
+       if (sig_.nKeyArgs || sig_.restArg)
+         entryPoints.back() = new BoxStackInsn(i - sig_.nKeyArgs - sig_.restArg
+                                               - sig_.nOptionalArgs,
+                                               entryPoints.back());
+      }
+    }
+    code = new VarargsInsn(sig_, entryPoints, location());
+  }
+  for (int i = 0; i < sig_.nRequiredArgs; i++)
+    if (formalVars[i].boxed())
+      code = new BoxArgInsn(i, code);
+  return compilePushVars(interp, env, stackPos, boundVars, 0,
+                        new ClosureInsn(&sig_, code,
+                                        boundVars.size(), next));
+}
+
+InsnPtr Expression::compilePushVars(Interpreter &interp,
+                                   const Environment &env,
+                                   int stackPos,
+                                   const BoundVarList &vars,
+                                   size_t varIndex,
+                                   const InsnPtr &next)
+{
+  if (varIndex >= vars.size())
+    return next;
+  bool isFrame;
+  int index;
+  unsigned flags;
+  if (!env.lookup(vars[varIndex].ident, isFrame, index, flags))
+    CANNOT_HAPPEN();
+  if (isFrame)
+    return new FrameRefInsn(index,
+                           compilePushVars(interp, env, stackPos + 1, vars,
+                                           varIndex + 1, next));
+  else
+    return new ClosureRefInsn(index,
+                             compilePushVars(interp, env, stackPos + 1, vars,
+                                             varIndex + 1, next));
+}
+
+void LambdaExpression::markBoundVars(BoundVarList &vars, bool shared)
+{
+  for (int i = 0; i < sig_.nOptionalArgs + sig_.nKeyArgs; i++)
+    if (inits_[i]) {
+      Vector<const Identifier *> f(formals_);
+      f.resize(sig_.nRequiredArgs + i
+              + (sig_.restArg && i >= sig_.nOptionalArgs));
+      vars.rebind(f);
+      inits_[i]->markBoundVars(vars, 1);
+      vars.unbind(f);
+    }
+  vars.rebind(formals_);
+  body_->markBoundVars(vars, 1);
+  vars.unbind(formals_);
+}
+
+LetExpression::LetExpression(Vector<const Identifier *> &vars,
+                            NCVector<Owner<Expression> > &inits,
+                            Owner<Expression> &body,
+                            const Location &loc)
+: Expression(loc)
+{
+  vars.swap(vars_);
+  inits.swap(inits_);
+  body.swap(body_);
+}
+
+bool LetExpression::canEval(bool maybeCall) const
+{
+  if (!body_->canEval(maybeCall))
+    return 0;
+  for (size_t i = 0; i < inits_.size(); i++)
+    if (!inits_[i]->canEval(1))
+      return 0;
+  return 1;
+}
+
+InsnPtr LetExpression::compile(Interpreter &interp, const Environment &env,
+                              int stackPos, const InsnPtr &next)
+{
+  int nVars = vars_.size();
+  Environment bodyEnv(env);
+  BoundVarList boundVars(vars_);
+  body_->markBoundVars(boundVars, 0);
+  bodyEnv.augmentFrame(boundVars, stackPos);
+  return compileInits(interp, env, boundVars, 0, stackPos,
+                     optimizeCompile(body_, interp, bodyEnv,
+                                     stackPos + nVars,
+                                     PopBindingsInsn::make(nVars, next)));
+}
+
+InsnPtr LetExpression::compileInits(Interpreter &interp,
+                                   const Environment &env,
+                                   const BoundVarList &initVars,
+                                   size_t initIndex,
+                                   int stackPos,
+                                   const InsnPtr &next)
+{
+  if (initIndex >= inits_.size())
+    return next;
+  InsnPtr tem = compileInits(interp, env, initVars, initIndex + 1, stackPos + 1, next);
+  if (initVars[initIndex].boxed())
+    tem = new BoxInsn(tem);
+  return optimizeCompile(inits_[initIndex], interp, env, stackPos, tem);
+}
+
+void LetExpression::markBoundVars(BoundVarList &vars, bool shared)
+{
+  for (size_t i = 0; i < inits_.size(); i++)
+    inits_[i]->markBoundVars(vars, shared);
+  vars.rebind(vars_);
+  body_->markBoundVars(vars, shared);
+  vars.unbind(vars_);
+}
+
+LetStarExpression::LetStarExpression(Vector<const Identifier *> &vars,
+                                    NCVector<Owner<Expression> > &inits,
+                                    Owner<Expression> &body,
+                                    const Location &loc)
+: LetExpression(vars, inits, body, loc)
+{
+}
+
+InsnPtr LetStarExpression::compile(Interpreter &interp,
+                                  const Environment &env,
+                                  int stackPos,
+                                  const InsnPtr &next)
+{
+  int nVars = vars_.size();
+  Environment bodyEnv(env);
+  BoundVarList vars;
+  for (int i = 0; i < nVars; i++) {
+    if (i > 0)
+      inits_[i]->markBoundVars(vars, 0);
+    vars.append(vars_[i], 0);
+  }
+  body_->markBoundVars(vars, 0);
+  bodyEnv.augmentFrame(vars, stackPos);
+  return compileInits(interp, env, vars, 0, stackPos,
+                     optimizeCompile(body_, interp, bodyEnv,
+                                     stackPos + vars_.size(),
+                                     PopBindingsInsn::make(nVars, next)));
+}
+
+InsnPtr LetStarExpression::compileInits(Interpreter &interp,
+                                       const Environment &env,
+                                       const BoundVarList &initVars,
+                                       size_t initIndex,
+                                       int stackPos,
+                                       const InsnPtr &next)
+{
+  if (initIndex >= inits_.size())
+    return next;
+  Environment nextEnv(env);
+  BoundVarList vars;
+  vars.append(initVars[initIndex].ident, initVars[initIndex].flags);
+  nextEnv.augmentFrame(vars, stackPos);
+  InsnPtr tem
+    = compileInits(interp, nextEnv, initVars, initIndex + 1, stackPos + 1, next);
+  if (initVars[initIndex].boxed())
+    tem = new BoxInsn(tem);
+  return optimizeCompile(inits_[initIndex], interp, env, stackPos, tem);
+}
+
+LetrecExpression::LetrecExpression(Vector<const Identifier *> &vars,
+                                  NCVector<Owner<Expression> > &inits,
+                                  Owner<Expression> &body,
+                                  const Location &loc)
+: Expression(loc)
+{
+  vars.swap(vars_);
+  inits.swap(inits_);
+  body.swap(body_);
+}
+
+bool LetrecExpression::canEval(bool maybeCall) const
+{
+  if (!body_->canEval(maybeCall))
+    return 0;
+  for (size_t i = 0; i < inits_.size(); i++)
+    if (!inits_[i]->canEval(1))
+      return 0;
+  return 1;
+}
+
+
+InsnPtr LetrecExpression::compile(Interpreter &interp, const Environment &env,
+                                 int stackPos, const InsnPtr &next)
+{
+  int nVars = vars_.size();
+
+  BoundVarList vars(vars_, nVars, BoundVar::assignedFlag);
+
+  Environment bodyEnv(env);
+  for (size_t i = 0; i < nVars; i++)
+    inits_[i]->markBoundVars(vars, 0);
+  body_->markBoundVars(vars, 0);
+  bodyEnv.augmentFrame(vars, stackPos);
+  InsnPtr tem = optimizeCompile(body_, interp, bodyEnv, stackPos + nVars,
+                               PopBindingsInsn::make(nVars, next));
+
+  for (size_t i = 0; i < nVars; i++)
+    vars[i].flags |= BoundVar::uninitFlag;
+
+  for (int i = 0; i < nVars; i++) {
+    if (vars[i].boxed())
+      tem = new SetBoxInsn(nVars, tem);
+    else
+      tem = new SetImmediateInsn(nVars, tem);
+  }
+  tem = compileInits(interp, bodyEnv, 0, stackPos + nVars, tem);
+  for (int i = nVars; i > 0; --i) {
+    if (vars[i - 1].boxed())
+      tem = new BoxInsn(tem);
+    tem = new ConstantInsn(0, tem);
+  }
+  return tem;
+}
+
+InsnPtr LetrecExpression::compileInits(Interpreter &interp,
+                                      const Environment &env,
+                                      size_t initIndex,
+                                      int stackPos,
+                                      const InsnPtr &next)
+{
+  if (initIndex >= inits_.size())
+    return next;
+  return optimizeCompile(inits_[initIndex], interp, env, stackPos,
+                                   compileInits(interp, env, initIndex + 1,
+                                                stackPos + 1, next));
+}
+
+void LetrecExpression::markBoundVars(BoundVarList &vars, bool shared)
+{
+  vars.rebind(vars_);
+  for (size_t i = 0; i < inits_.size(); i++)
+    inits_[i]->markBoundVars(vars, shared);
+  body_->markBoundVars(vars, shared);
+  vars.unbind(vars_);
+}
+
+QuasiquoteExpression::QuasiquoteExpression(NCVector<Owner<Expression> > &members,
+                                          Vector<PackedBoolean> &spliced,
+                                          Type type,
+                                          const Location &loc)
+: Expression(loc), spliced_(spliced), type_(type)
+{
+  members.swap(members_);
+}
+
+InsnPtr QuasiquoteExpression::compile(Interpreter &interp, const Environment &env,
+                                     int stackPos, const InsnPtr &next)
+{
+  InsnPtr tem(next);
+  size_t n = members_.size();
+  if (type_ == vectorType) {
+    bool splicy = 0;
+    for (size_t i = 0; i < n; i++) {
+      if (spliced_[i]) {
+        splicy = 1;
+       break;
+      }
+    }
+    if (!splicy) {
+      tem = new VectorInsn(n, tem);
+      for (size_t i = n; i > 0; i--)
+       tem = members_[i - 1]->compile(interp, env, stackPos + (i - 1), tem);
+      return tem;
+    }
+    tem = new ListToVectorInsn(tem);
+  }
+  else if (type_ == improperType)
+    n--;
+  for (size_t i = 0; i < n; i++) {
+    if (spliced_[i])
+      tem = new AppendInsn(location(), tem);
+    else
+      tem = new ConsInsn(tem);
+    tem = members_[i]->compile(interp, env, stackPos + 1, tem);
+  }
+  if (type_ == improperType)
+    tem = members_.back()->compile(interp, env, stackPos, tem);
+  else
+    tem = new ConstantInsn(interp.makeNil(), tem);
+  return tem;
+}
+
+void QuasiquoteExpression::markBoundVars(BoundVarList &vars, bool shared)
+{
+  for (size_t i = 0; i < members_.size(); i++)
+    members_[i]->markBoundVars(vars, shared);
+}
+
+bool QuasiquoteExpression::canEval(bool maybeCall) const
+{
+  for (size_t i = 0; i < members_.size(); i++)
+    if (!members_[i]->canEval(maybeCall))
+      return 0;
+  return 1;
+}
+
+void QuasiquoteExpression::optimize(Interpreter &interp, const Environment &env, Owner<Expression> &expr)
+{
+  for (size_t i = 0; i < members_.size(); i++)
+    members_[i]->optimize(interp, env, members_[i]);
+  if (type_ == vectorType)
+    return;
+  if (members_.size() == 0) {
+    expr = new ResolvedConstantExpression(interp.makeNil(), location());
+    return;
+  }
+  ELObj *tail = members_.back()->constantValue();
+  if (!tail)
+    return;
+  ASSERT(!(spliced_.back() && type_ == improperType));
+  if (type_ != improperType && !spliced_.back()) {
+    tail = interp.makePair(tail, interp.makeNil());
+    interp.makePermanent(tail);
+  }
+  for (size_t i = members_.size() - 1; i-- > 0;) {
+    ELObj *tem = members_[i]->constantValue();
+    // FIXME optimize splice as well
+    if (!tem || spliced_[i]) {
+      members_.resize(i + 2);
+      type_ = improperType;
+      members_[i + 1] = new ResolvedConstantExpression(tail, location());
+      return;
+    }
+    tail = interp.makePair(tem, tail);
+    interp.makePermanent(tail);
+  }
+  expr = new ResolvedConstantExpression(tail, location());
+}
+
+SequenceExpression::SequenceExpression(NCVector<Owner<Expression> > &sequence,
+                                      const Location &loc)
+: Expression(loc)
+{
+  ASSERT(sequence.size() > 0);
+  sequence.swap(sequence_);
+}
+
+InsnPtr
+SequenceExpression::compile(Interpreter &interp, const Environment &env,
+                           int stackPos, const InsnPtr &next)
+{
+  // FIXME optimize this
+  InsnPtr result(sequence_.back()->compile(interp, env, stackPos, next));
+  for (size_t i = sequence_.size() - 1; i > 0; i--)
+    result = sequence_[i - 1]->compile(interp, env, stackPos,
+                                       new PopInsn(result));
+  return result;
+}
+
+void SequenceExpression::markBoundVars(BoundVarList &vars, bool shared)
+{
+  for (size_t i = 0; i < sequence_.size(); i++)
+    sequence_[i]->markBoundVars(vars, shared);
+}
+
+bool SequenceExpression::canEval(bool maybeCall) const
+{
+  for (size_t i = 0; i < sequence_.size(); i++)
+    if (!sequence_[i]->canEval(maybeCall))
+      return 0;
+  return 1;
+}
+
+void SequenceExpression::optimize(Interpreter &interp, const Environment &env,
+                                 Owner<Expression> &expr)
+{
+  size_t j = 0;
+  for (size_t i = 0;; i++) {
+    if (j != i)
+      sequence_[j].swap(sequence_[i]);
+    sequence_[j]->optimize(interp, env, sequence_[j]);
+    if (i == sequence_.size() - 1)
+      break;
+    if (!sequence_[j]->constantValue())
+      j++;  
+  }
+  if (j == 0)
+    sequence_[0].swap(expr);
+  else
+    sequence_.resize(j + 1);
+}
+
+AssignmentExpression::AssignmentExpression(const Identifier *var,
+                                          Owner<Expression> &value,
+                                          const Location &loc)
+: Expression(loc), var_(var)
+{
+  value.swap(value_);
+}
+
+InsnPtr AssignmentExpression::compile(Interpreter &interp, const Environment &env,
+                                     int stackPos, const InsnPtr &next)
+{
+  bool isFrame;
+  int index;
+  unsigned flags;
+  if (!env.lookup(var_, isFrame, index, flags)) {
+    interp.setNextLocation(location());
+    unsigned part;
+    Location loc;
+    if (var_->defined(part, loc))
+      interp.message(InterpreterMessages::topLevelAssignment,
+                    StringMessageArg(var_->name()));
+    else
+      interp.message(InterpreterMessages::undefinedVariableReference,
+                    StringMessageArg(var_->name()));
+    return new ErrorInsn;
+  }
+  InsnPtr result;
+  if (flags & BoundVar::uninitFlag)
+    result = new CheckInitInsn(var_, location(), next);
+  else
+    result = next;
+  if (isFrame) {
+    if (BoundVar::flagsBoxed(flags))
+      result = new StackSetBoxInsn(index - (stackPos + 1), index, location(), result);
+    else
+      result = new StackSetInsn(index - (stackPos + 1), index, result);
+  }
+  else {
+    ASSERT(BoundVar::flagsBoxed(flags));
+    result = new ClosureSetBoxInsn(index, location(), result);
+  }
+  return optimizeCompile(value_, interp, env, stackPos, result);
+}
+void AssignmentExpression::markBoundVars(BoundVarList &vars, bool shared)
+{
+  vars.mark(var_,
+            (BoundVar::usedFlag
+            |BoundVar::assignedFlag
+            |(shared ? BoundVar::sharedFlag : 0)));
+  value_->markBoundVars(vars, shared);
+}
+bool AssignmentExpression::canEval(bool maybeCall) const
+{
+  return value_->canEval(maybeCall);
+}
+WithModeExpression::WithModeExpression(const ProcessingMode *mode, Owner<Expression> &expr,
+                                      const Location &loc)
+: Expression(loc), mode_(mode)
+{
+  expr.swap(expr_);
+}
+
+InsnPtr WithModeExpression::compile(Interpreter &interp, const Environment &env, int stackPos,
+                                   const InsnPtr &next)
+{
+  if (!mode_->defined()) {
+    interp.setNextLocation(location());
+    interp.message(InterpreterMessages::undefinedMode, StringMessageArg(mode_->name()));
+  }
+  return new PushModeInsn(mode_,
+                         optimizeCompile(expr_, interp, env, stackPos,
+                                         new PopModeInsn(next)));
+}
+
+void WithModeExpression::markBoundVars(BoundVarList &vars, bool shared)
+{
+  expr_->markBoundVars(vars, shared);
+}
+
+bool WithModeExpression::canEval(bool maybeCall) const
+{
+  return expr_->canEval(maybeCall);
+}
+
+StyleExpression::StyleExpression(Vector<const Identifier *> &keys,
+                                NCVector<Owner<Expression> > &exprs,
+                                const Location &loc)
+: Expression(loc)
+{
+  keys.swap(keys_);
+  exprs.swap(exprs_);
+}
+
+// Interpret keywords in the following order of preference
+// 1. non-inherited characteristics
+// 2. DSSSL defined meaning (use: content-map:) etc
+// 3. inherited characteristics
+
+InsnPtr StyleExpression::compile(Interpreter &interp, const Environment &env,
+                                int stackPos, const InsnPtr &next)
+{
+  Vector<ConstPtr<InheritedC> > ics;
+  Vector<ConstPtr<InheritedC> > forceIcs;
+  Vector<const Identifier *> forceKeys(keys_.size()); 
+  for (size_t i = 0; i < keys_.size(); i++) {
+    forceKeys[i] = 0; 
+    if (keys_[i]->name().size() > 6) {
+      StringC prefix(keys_[i]->name().data(), 6);  
+      if (prefix == interp.makeStringC("force!")) {
+        StringC name(keys_[i]->name().data() + 6, keys_[i]->name().size() - 6);
+        forceKeys[i] = interp.lookup(name);
+      }
+    } 
+  }
+  bool hasUse = 0;
+  size_t useIndex;
+  BoundVarList boundVars;
+  env.boundVars(boundVars);
+  for (size_t i = 0; i < keys_.size(); i++) {
+    Identifier::SyntacticKey sk;
+    if (forceKeys[i] 
+        && maybeStyleKeyword(forceKeys[i])
+        && !forceKeys[i]->inheritedC().isNull()) {
+      forceIcs.resize(forceIcs.size() + 1);
+      exprs_[i]->markBoundVars(boundVars, 0);
+    }
+    else if (maybeStyleKeyword(keys_[i])
+       && !(keys_[i]->syntacticKey(sk) && sk == Identifier::keyUse)
+        && !keys_[i]->inheritedC().isNull()) {
+      ics.resize(ics.size() + 1);
+      exprs_[i]->markBoundVars(boundVars, 0);
+    } 
+  }
+  // FIXME optimize case where ics.size() == 0
+  boundVars.removeUnused();
+  BoundVarList noVars;
+  Environment newEnv(noVars, boundVars);
+  size_t j = 0;
+  size_t k = 0;
+  for (size_t i = 0; i < keys_.size(); i++) {
+    Identifier::SyntacticKey sk;
+    if (forceKeys[i] 
+        && maybeStyleKeyword(forceKeys[i])
+        && !forceKeys[i]->inheritedC().isNull()) {
+      exprs_[i]->optimize(interp, newEnv, exprs_[i]);
+      ELObj *val = exprs_[i]->constantValue();
+      if (val) {
+       interp.makePermanent(val);
+       forceIcs[k] = forceKeys[i]->inheritedC()->make(val, exprs_[i]->location(), interp);
+       if (forceIcs[k].isNull())
+         forceIcs.resize(forceIcs.size() - 1);
+       else
+         k++;
+      }
+      else {
+       forceIcs[k++] = new VarInheritedC(forceKeys[i]->inheritedC(),
+                         exprs_[i]->compile(interp, newEnv, 0, InsnPtr()),
+                                    exprs_[i]->location());
+      }
+    }    
+    else if (!maybeStyleKeyword(keys_[i]))
+      ;
+    else if (keys_[i]->syntacticKey(sk) && sk == Identifier::keyUse) {
+      if (!hasUse) {
+       hasUse = 1;
+       useIndex = i;
+      }
+    }
+    else if (!keys_[i]->inheritedC().isNull()) {
+      exprs_[i]->optimize(interp, newEnv, exprs_[i]);
+      ELObj *val = exprs_[i]->constantValue();
+      if (val) {
+       interp.makePermanent(val);
+       ics[j] = keys_[i]->inheritedC()->make(val, exprs_[i]->location(), interp);
+       if (ics[j].isNull())
+         ics.resize(ics.size() - 1);
+       else
+         j++;
+      }
+      else {
+       ics[j++] = new VarInheritedC(keys_[i]->inheritedC(),
+                                    exprs_[i]->compile(interp, newEnv, 0, InsnPtr()),
+                                    exprs_[i]->location());
+      }
+    }
+    else
+      unknownStyleKeyword(keys_[i], interp, location());
+  }
+  InsnPtr result
+    = compilePushVars(interp, env, stackPos + hasUse, boundVars, 0,
+                     new VarStyleInsn(new StyleSpec(forceIcs, ics), 
+                                      boundVars.size(), hasUse,
+                                      new MaybeOverrideStyleInsn(next)));
+  if (!hasUse)
+    return result;
+  else {
+    result = new CheckStyleInsn(location(), result);
+    return optimizeCompile(exprs_[useIndex], interp, env, stackPos, result);
+  }
+}
+
+void StyleExpression::markBoundVars(BoundVarList &vars, bool shared)
+{
+  for (size_t i = 0; i < exprs_.size(); i++)
+    exprs_[i]->markBoundVars(vars, 1);
+}
+
+bool StyleExpression::canEval(bool maybeCall) const
+{
+  for (size_t i = 0; i < exprs_.size(); i++)
+    if (!exprs_[i]->canEval(maybeCall))
+      return 0;
+  return 1;
+}
+
+void StyleExpression::unknownStyleKeyword(const Identifier *ident, Interpreter &interp,
+                                         const Location &loc) const
+{
+  interp.setNextLocation(loc);
+  StringC tem(ident->name());
+  tem += Char(':');
+  interp.message(InterpreterMessages::invalidStyleKeyword,
+                StringMessageArg(tem));
+}
+
+bool StyleExpression::maybeStyleKeyword(const Identifier *ident) const
+{
+  return 1;
+}
+
+MakeExpression::MakeExpression(const Identifier *foc,
+                              Vector<const Identifier *> &keys,
+                              NCVector<Owner<Expression> > &exprs,
+                              const Location &loc)
+: foc_(foc), StyleExpression(keys, exprs, loc)
+{
+}
+
+InsnPtr MakeExpression::compile(Interpreter &interp, const Environment &env, int stackPos,
+                               const InsnPtr &next)
+{
+  FlowObj *flowObj = foc_->flowObj();
+  if (!flowObj)  {
+    interp.setNextLocation(location());
+    interp.message(InterpreterMessages::unknownFlowObjectClass,
+                  StringMessageArg(foc_->name()));
+    flowObj = new (interp) SequenceFlowObj;
+    interp.makePermanent(flowObj);
+  }
+  Owner<Expression> *contentMapExpr = 0;
+  InsnPtr rest(next);
+  for (size_t i = 0; i < keys_.size(); i++) {
+    Identifier::SyntacticKey syn;
+    if (!flowObj->hasNonInheritedC(keys_[i]) && keys_[i]->syntacticKey(syn)) {
+      if (syn == Identifier::keyLabel)
+       rest = optimizeCompile(exprs_[i],
+                              interp,
+                              env,
+                              stackPos + 1,
+                              new LabelSosofoInsn(exprs_[i]->location(), rest));
+      else if (syn == Identifier::keyContentMap)
+       contentMapExpr = &exprs_[i];
+    }
+  }
+  flowObj = applyConstNonInheritedCs(flowObj, interp, env);
+  size_t nContent = exprs_.size() - keys_.size();
+  CompoundFlowObj *cFlowObj = flowObj->asCompoundFlowObj();
+  if (!cFlowObj && nContent > 0) {
+    interp.setNextLocation(location());
+    interp.message(InterpreterMessages::atomicContent,
+                  StringMessageArg(foc_->name()));
+    nContent = 0;
+  }
+  rest = compileNonInheritedCs(interp, env, stackPos + 1, rest);
+  for (size_t i = 0; i < keys_.size(); i++) {
+    if (flowObj->hasPseudoNonInheritedC(keys_[i])
+        && !exprs_[i]->constantValue()) {
+      rest = exprs_[i]->compile(interp, env, stackPos + 1,
+                               new SetPseudoNonInheritedCInsn(keys_[i],
+                                                              exprs_[i]->location(),
+                                                              rest));
+    }
+  }
+  // FIXME optimize case where there are no non-inherited styles.
+  rest = StyleExpression::compile(interp, env, stackPos + 1, new SetStyleInsn(rest));
+  if (nContent == 0 && !contentMapExpr) {
+    if (cFlowObj)
+      return new SetDefaultContentInsn(cFlowObj, location(), rest);
+    else
+      return new CopyFlowObjInsn(flowObj, rest);
+  }
+  rest = new SetContentInsn(cFlowObj, rest);
+  if (contentMapExpr) {
+    rest = optimizeCompile(*contentMapExpr, interp, env, stackPos + 1,
+                          new ContentMapSosofoInsn((*contentMapExpr)->location(), rest));
+    if (nContent == 0)
+      return new MakeDefaultContentInsn(location(), rest);
+  }
+  // FIXME get rid of CheckSosofoInsn if we can guarantee result is a SosofoObj.
+  if (nContent == 1)
+    return optimizeCompile(exprs_.back(), interp, env, stackPos,
+                          new CheckSosofoInsn(exprs_.back()->location(), rest));
+  rest = new SosofoAppendInsn(nContent, rest);
+  for (size_t i = 1; i <= nContent; i++)
+    rest = optimizeCompile(exprs_[exprs_.size() - i], interp, env, stackPos + nContent - i,
+                           new CheckSosofoInsn(exprs_[exprs_.size() - i]->location(), rest));
+  return rest;
+}
+
+FlowObj *MakeExpression::applyConstNonInheritedCs(FlowObj *flowObj, Interpreter &interp,
+                                                 const Environment &env)
+{
+  FlowObj *result = flowObj;
+  for (size_t i = 0; i < keys_.size(); i++)
+    if (flowObj->hasNonInheritedC(keys_[i])
+        || flowObj->hasPseudoNonInheritedC(keys_[i])) {
+      exprs_[i]->optimize(interp, env, exprs_[i]);
+      ELObj *val = exprs_[i]->constantValue();
+      if (val) {
+       if (result == flowObj) {
+         result = flowObj->copy(interp);
+         interp.makePermanent(result);
+       }
+       result->setNonInheritedC(keys_[i], val, exprs_[i]->location(), interp);
+      }
+    }
+  return result;
+}
+
+// Have a copied flow object on the stack.
+// Generate code to set its non-constant, non-inherited characteristics.
+
+InsnPtr MakeExpression::compileNonInheritedCs(Interpreter &interp, const Environment &env,
+                                             int stackPos, const InsnPtr &next)
+{
+  FlowObj *flowObj = foc_->flowObj();
+  if (!flowObj)
+    return next;
+  bool gotOne = flowObj->isCharacter();
+  BoundVarList boundVars;
+  env.boundVars(boundVars);
+  for (size_t i = 0; i < keys_.size(); i++) {
+    if (flowObj->hasNonInheritedC(keys_[i]) && !exprs_[i]->constantValue()) {
+      exprs_[i]->markBoundVars(boundVars, 0);
+      gotOne = 1;
+    }
+  }
+  if (!gotOne)
+    return next;
+  boundVars.removeUnused();
+  BoundVarList noVars;
+  Environment newEnv(noVars, boundVars);
+  InsnPtr code;
+  for (size_t i = 0; i < keys_.size(); i++)
+    if (flowObj->hasNonInheritedC(keys_[i]) && !exprs_[i]->constantValue())
+     code = exprs_[i]->compile(interp, newEnv, 1,
+                                 new SetNonInheritedCInsn(keys_[i],
+                                                          exprs_[i]->location(),
+                                                          code));
+  InsnPtr rest(new SetNonInheritedCsSosofoInsn(code, boundVars.size(), next));
+  if (flowObj->isCharacter()) 
+    rest = new SetImplicitCharInsn(Location(), rest); 
+  return compilePushVars(interp, env, stackPos, boundVars, 0, rest);
+}
+
+void MakeExpression::unknownStyleKeyword(const Identifier *ident, Interpreter &interp,
+                                         const Location &loc) const
+{
+  FlowObj *flowObj = foc_->flowObj();
+  if (!flowObj)
+    return;
+  Identifier::SyntacticKey key;
+  if (ident->syntacticKey(key)) {
+    switch(key) {
+    case Identifier::keyLabel:
+    case Identifier::keyContentMap:
+      return;
+    default:
+      break;
+    }
+  }
+  if (flowObj->hasNonInheritedC(ident)
+      || flowObj->hasPseudoNonInheritedC(ident))
+    return;
+  interp.setNextLocation(loc);
+  StringC tem(ident->name());
+  tem += Char(':');
+  interp.message(InterpreterMessages::invalidMakeKeyword,
+                StringMessageArg(tem), StringMessageArg(foc_->name()));
+}
+
+bool MakeExpression::maybeStyleKeyword(const Identifier *ident) const
+{
+  FlowObj *flowObj = foc_->flowObj();
+  if (!flowObj)
+    return 1;
+  return (!flowObj->hasNonInheritedC(ident)
+          && !flowObj->hasPseudoNonInheritedC(ident));
+}
+
+Environment::Environment()
+: closureVars_(0)
+{
+}
+
+Environment::Environment(const BoundVarList &frameVars,
+                        const BoundVarList &closureVars)
+: closureVars_(&closureVars)
+{
+  FrameVarList *tem = new FrameVarList;
+  frameVarList_ = tem;
+  tem->vars = &frameVars;
+  tem->stackPos = 0;
+}
+
+void Environment::boundVars(BoundVarList &result) const
+{
+  if (closureVars_) {
+    for (size_t i = 0; i < closureVars_->size(); i++)
+      result.append((*closureVars_)[i].ident,
+                   (*closureVars_)[i].flags);
+  }
+  for (const FrameVarList *f = frameVarList_.pointer();
+       f;
+       f = f->next.pointer()) {
+    for (size_t i = 0; i < f->vars->size(); i++)
+      result.append((*f->vars)[i].ident, (*f->vars)[i].flags);
+  }
+}
+
+bool Environment::lookup(const Identifier *ident,
+                        bool &isFrame, int &index, unsigned &flags)
+     const
+{
+  for (const FrameVarList *p = frameVarList_.pointer();
+       p;
+       p = p->next.pointer()) {
+    for (size_t i = 0; i < p->vars->size(); i++)
+      if ((*p->vars)[i].ident == ident) {
+       isFrame = true;
+       index = i + p->stackPos;
+       flags = (*p->vars)[i].flags;
+       return true;
+      }
+  }
+  if (closureVars_) {
+    for (size_t i = 0; i < closureVars_->size(); i++)
+      if ((*closureVars_)[i].ident == ident) {
+       isFrame = false;
+       index = i;
+       flags = (*closureVars_)[i].flags;
+       return true;
+      }
+  }
+  return false;
+}
+
+void Environment::augmentFrame(const BoundVarList &vars, int stackPos)
+{
+  FrameVarList *tem = new FrameVarList;
+  tem->stackPos = stackPos;
+  tem->vars = &vars;
+  tem->next = frameVarList_;
+  frameVarList_ = tem;
+}
+
+BoundVarList::BoundVarList(const Vector<const Identifier *> &idents)
+: Vector<BoundVar>(idents.size())
+{
+  for (size_t i = 0; i < size(); i++) {
+    BoundVar &tem = (*this)[i];
+    tem.ident = idents[i];
+    tem.reboundCount = 0;
+    tem.flags = 0;
+  }
+}
+
+BoundVarList::BoundVarList(const Vector<const Identifier *> &idents, size_t n,
+                          unsigned flags)
+: Vector<BoundVar>(n)
+{
+  for (size_t i = 0; i < n; i++) {
+    BoundVar &tem = (*this)[i];
+    tem.ident = idents[i];
+    tem.reboundCount = 0;
+    tem.flags = (flags & ~BoundVar::usedFlag);
+  }
+}
+
+void BoundVarList::append(const Identifier *id, unsigned flags)
+{
+  resize(size() + 1);
+  BoundVar &tem = back();
+  tem.ident = id;
+  tem.flags = (flags & ~BoundVar::usedFlag);
+  tem.reboundCount = 0;
+}
+
+void BoundVarList::remove(const Vector<const Identifier *> &idents)
+{
+  size_t j = 0;
+  for (size_t i = 0; i < size(); i++) {
+    const Identifier *ident = (*this)[i].ident;
+    for (size_t k = 0;; k++) {
+      if (k >= idents.size()) {
+       if (j != i)
+         (*this)[j] = (*this)[i];
+       j++;
+       break;
+      }
+      if (idents[k] == ident)
+       break;                  // skip it
+    }
+  }
+  resize(j);
+}
+
+void BoundVarList::removeUnused()
+{
+  size_t j = 0;
+  for (size_t i = 0; i < size(); i++) {
+    if ((*this)[i].flags & BoundVar::usedFlag) {
+      if (j != i)
+       (*this)[j] = (*this)[i];
+      j++;
+    }
+  }
+  resize(j);
+}
+
+void BoundVarList::mark(const Identifier *ident, unsigned flags)
+{
+  BoundVar *bv = find(ident);
+  if (bv && !bv->reboundCount)
+    bv->flags |= flags;
+}
+
+void BoundVarList::rebind(const Vector<const Identifier *> &idents)
+{
+  for (size_t i = 0; i < idents.size(); i++) {
+    BoundVar *bv = find(idents[i]);
+    if (bv)
+      bv->reboundCount += 1;
+  }
+}
+
+void BoundVarList::unbind(const Vector<const Identifier *> &idents)
+{
+  for (size_t i = 0; i < idents.size(); i++) {
+    BoundVar *bv = find(idents[i]);
+    if (bv)
+      bv->reboundCount -= 1;
+  }
+}
+
+BoundVar *BoundVarList::find(const Identifier *ident)
+{
+  for (size_t i = 0; i < size(); i++)
+    if ((*this)[i].ident == ident)
+      return &(*this)[i];
+  return 0;
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
diff --git a/style/Expression.h b/style/Expression.h
new file mode 100644 (file)
index 0000000..367d576
--- /dev/null
@@ -0,0 +1,385 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef Expression_INCLUDED
+#define Expression_INCLUDED 1
+
+#include "ELObj.h"
+#include "Owner.h"
+#include "Vector.h"
+#include "NCVector.h"
+#include "Resource.h"
+#include "Ptr.h"
+#include "Insn.h"
+#include "Named.h"
+#include "Location.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class Interpreter;
+class Identifier;
+
+struct BoundVar {
+  const Identifier *ident;
+  enum {
+    usedFlag = 01,
+    assignedFlag = 02,
+    sharedFlag = 04,
+    uninitFlag = 010,
+    boxedFlags = assignedFlag|sharedFlag
+  };
+  static bool flagsBoxed(unsigned f) { return (f & boxedFlags) == boxedFlags; }
+  bool boxed() const { return flagsBoxed(flags); }
+  unsigned flags;
+  unsigned reboundCount;
+};
+
+class BoundVarList : public Vector<BoundVar> {
+public:
+  BoundVarList() { }
+  BoundVarList(const Vector<const Identifier *> &);
+  BoundVarList(const Vector<const Identifier *> &, size_t, unsigned flags = 0);
+  void append(const Identifier *, unsigned flags);
+  void mark(const Identifier *, unsigned flags);
+  void removeUnused();
+  void remove(const Vector<const Identifier *> &);
+  void rebind(const Vector<const Identifier *> &);
+  void unbind(const Vector<const Identifier *> &);
+  BoundVar *find(const Identifier *);
+};
+
+class Environment {
+public:
+  Environment();
+  Environment(const BoundVarList &frameVars,
+             const BoundVarList &closureVars);
+  void boundVars(BoundVarList &) const;
+  bool lookup(const Identifier *var,
+             bool &isFrame, int &index, unsigned &flags) const;
+  void augmentFrame(const BoundVarList &,
+                   int stackPos);
+private:
+  struct FrameVarList : public Resource {
+    int stackPos;
+    const BoundVarList *vars;
+    ConstPtr<FrameVarList> next;
+  };
+  ConstPtr<FrameVarList> frameVarList_;
+  const BoundVarList *closureVars_;
+};
+
+class Expression {
+public:
+  Expression(const Location &);
+  virtual ~Expression() { }
+  virtual InsnPtr compile(Interpreter &, const Environment &, int,
+                         const InsnPtr &) = 0;
+  static
+    InsnPtr optimizeCompile(Owner<Expression> &, Interpreter &, const Environment &, int,
+                            const InsnPtr &);
+  virtual void markBoundVars(BoundVarList &vars, bool);
+  virtual void optimize(Interpreter &, const Environment &, Owner<Expression> &);
+  virtual ELObj *constantValue() const;
+  virtual bool canEval(bool maybeCall) const = 0;
+  virtual const Identifier *keyword() const;
+  const Location &location() const;
+protected:
+  static
+  InsnPtr compilePushVars(Interpreter &interp,
+                         const Environment &env, int stackPos,
+                         const BoundVarList &vars, size_t varIndex,
+                         const InsnPtr &next);
+private:
+  Location loc_;
+};
+
+class ConstantExpression : public Expression {
+public:
+  ConstantExpression(ELObj *, const Location &);
+  InsnPtr compile(Interpreter &, const Environment &, int, const InsnPtr &);
+  void optimize(Interpreter &, const Environment &, Owner<Expression> &);
+  bool canEval(bool maybeCall) const;
+  const Identifier *keyword() const;
+private:
+  ELObj *obj_;                 // must be permanent
+};
+
+class ResolvedConstantExpression : public Expression {
+public:
+  ResolvedConstantExpression(ELObj *, const Location &);
+  InsnPtr compile(Interpreter &, const Environment &, int, const InsnPtr &);
+  bool canEval(bool maybeCall) const;
+  ELObj *constantValue() const;
+private:
+  ELObj *obj_;
+};
+
+class CallExpression : public Expression {
+public:
+  CallExpression(Owner<Expression> &, NCVector<Owner<Expression> > &,
+                const Location &loc);
+  InsnPtr compile(Interpreter &, const Environment &, int, const InsnPtr &);
+  void markBoundVars(BoundVarList &vars, bool);
+  int nArgs();
+  bool canEval(bool maybeCall) const;
+private:
+  Owner<Expression> op_;
+  NCVector<Owner<Expression> > args_;
+};
+
+class VariableExpression : public Expression {
+public:
+  VariableExpression(const Identifier *, const Location &loc);
+  InsnPtr compile(Interpreter &, const Environment &, int, const InsnPtr &);
+  void optimize(Interpreter &, const Environment &, Owner<Expression> &);
+  void markBoundVars(BoundVarList &vars, bool);
+  bool canEval(bool maybeCall) const;
+private:
+  const Identifier *ident_;
+  bool isTop_;
+};
+
+class IfExpression : public Expression {
+public:
+  IfExpression(Owner<Expression> &,
+              Owner<Expression> &,
+              Owner<Expression> &,
+              const Location &);
+  InsnPtr compile(Interpreter &, const Environment &, int, const InsnPtr &);
+  void markBoundVars(BoundVarList &vars, bool);
+  bool canEval(bool maybeCall) const;
+  void optimize(Interpreter &, const Environment &, Owner<Expression> &);
+private:
+  Owner<Expression> test_;
+  Owner<Expression> consequent_;
+  Owner<Expression> alternate_;
+};
+
+class OrExpression : public Expression {
+public:
+  OrExpression(Owner<Expression> &,
+              Owner<Expression> &,
+              const Location &);
+  InsnPtr compile(Interpreter &, const Environment &, int, const InsnPtr &);
+  void markBoundVars(BoundVarList &vars, bool);
+  bool canEval(bool maybeCall) const;
+  void optimize(Interpreter &, const Environment &, Owner<Expression> &);
+private:
+  Owner<Expression> test1_;
+  Owner<Expression> test2_;
+};
+
+class CondFailExpression : public Expression {
+public:
+  CondFailExpression(const Location &);
+  InsnPtr compile(Interpreter &, const Environment &, int, const InsnPtr &);
+  bool canEval(bool maybeCall) const;
+};
+
+class CaseExpression : public Expression {
+public:
+  struct Case {
+    Vector<ELObj *> datums;
+    Owner<Expression> expr;
+  };
+  CaseExpression(Owner<Expression> &,
+                NCVector<Case> &,
+                Owner<Expression> &,
+                const Location &);
+  InsnPtr compile(Interpreter &, const Environment &, int, const InsnPtr &);
+  void markBoundVars(BoundVarList &vars, bool);
+  bool canEval(bool maybeCall) const;
+  void optimize(Interpreter &, const Environment &, Owner<Expression> &);
+private:
+  Owner<Expression> key_;
+  NCVector<Case> cases_;
+  Vector<unsigned> nResolved_;
+  Owner<Expression> else_;
+};
+
+class LambdaExpression : public Expression {
+public:
+  LambdaExpression(Vector<const Identifier *> &vars,
+                  NCVector<Owner<Expression> > &inits,
+                  int nOptional,
+                  bool hasRest,
+                  int nKey,
+                  Owner<Expression> &body,
+                  const Location &);
+  InsnPtr compile(Interpreter &, const Environment &, int, const InsnPtr &);
+  void markBoundVars(BoundVarList &vars, bool);
+  bool canEval(bool maybeCall) const;
+private:
+  Vector<const Identifier *> formals_;
+  NCVector<Owner<Expression> > inits_;
+  Signature sig_;
+  Owner<Expression> body_;
+};
+
+class LetExpression : public Expression {
+public:
+  LetExpression(Vector<const Identifier *> &vars,
+               NCVector<Owner<Expression> > &inits,
+               Owner<Expression> &body,
+               const Location &);
+  InsnPtr compile(Interpreter &, const Environment &, int, const InsnPtr &);
+  void markBoundVars(BoundVarList &vars, bool);
+  bool canEval(bool maybeCall) const;
+protected:
+  InsnPtr compileInits(Interpreter &interp, const Environment &env,
+                      const BoundVarList &initVars,
+                      size_t initIndex, int stackPos, const InsnPtr &next);
+  Vector<const Identifier *> vars_;
+  NCVector<Owner<Expression> > inits_;
+  Owner<Expression> body_;
+};
+
+class LetStarExpression : public LetExpression {
+public:
+  LetStarExpression(Vector<const Identifier *> &vars,
+                   NCVector<Owner<Expression> > &inits,
+                   Owner<Expression> &body,
+                   const Location &);
+  InsnPtr compile(Interpreter &, const Environment &, int, const InsnPtr &);
+private:
+  InsnPtr compileInits(Interpreter &interp, const Environment &env,
+                      const BoundVarList &initVars,
+                      size_t initIndex, int stackPos, const InsnPtr &next);
+};
+
+class LetrecExpression : public Expression {
+public:
+  LetrecExpression(Vector<const Identifier *> &vars,
+                  NCVector<Owner<Expression> > &inits,
+                  Owner<Expression> &body,
+                  const Location &);
+  InsnPtr compile(Interpreter &, const Environment &, int, const InsnPtr &);
+  void markBoundVars(BoundVarList &vars, bool);
+  bool canEval(bool maybeCall) const;
+private:
+  InsnPtr compileInits(Interpreter &interp, const Environment &env,
+                      size_t initIndex, int stackPos, const InsnPtr &next);
+  Vector<const Identifier *> vars_;
+  NCVector<Owner<Expression> > inits_;
+  Owner<Expression> body_;
+};
+
+class QuasiquoteExpression : public Expression {
+public:
+  enum Type {
+    listType,
+    improperType,
+    vectorType
+  };
+  QuasiquoteExpression(NCVector<Owner<Expression> > &,
+                      Vector<PackedBoolean> &spliced,
+                      Type type,
+                      const Location &);
+  InsnPtr compile(Interpreter &, const Environment &, int, const InsnPtr &);
+  void markBoundVars(BoundVarList &vars, bool);
+  bool canEval(bool maybeCall) const;
+  void optimize(Interpreter &, const Environment &, Owner<Expression> &);
+private:
+  NCVector<Owner<Expression> > members_;
+  Vector<PackedBoolean> spliced_;
+  Type type_;
+};
+
+class SequenceExpression : public Expression {
+public:
+  SequenceExpression(NCVector<Owner<Expression> > &,
+                    const Location &);
+  InsnPtr compile(Interpreter &, const Environment &, int, const InsnPtr &);
+  void markBoundVars(BoundVarList &vars, bool);
+  bool canEval(bool maybeCall) const;
+  void optimize(Interpreter &, const Environment &, Owner<Expression> &);
+private:
+  NCVector<Owner<Expression> > sequence_;
+};
+
+class AssignmentExpression : public Expression {
+public:
+  AssignmentExpression(const Identifier *,
+                       Owner<Expression> &,
+                      const Location &);
+  InsnPtr compile(Interpreter &, const Environment &, int, const InsnPtr &);
+  void markBoundVars(BoundVarList &vars, bool);
+  bool canEval(bool maybeCall) const;
+private:
+  const Identifier *var_;
+  Owner<Expression> value_;
+};
+
+class ProcessingMode;
+
+class WithModeExpression : public Expression {
+public:
+  WithModeExpression(const ProcessingMode *, Owner<Expression> &,
+                    const Location &);
+  InsnPtr compile(Interpreter &, const Environment &, int,
+                 const InsnPtr &);
+  void markBoundVars(BoundVarList &vars, bool);
+  bool canEval(bool maybeCall) const;
+private:
+  const ProcessingMode *mode_;
+  Owner<Expression> expr_;
+};
+
+class StyleExpression : public Expression {
+public:
+  StyleExpression(Vector<const Identifier *> &,
+                 NCVector<Owner<Expression> > &,
+                 const Location &loc);
+  InsnPtr compile(Interpreter &, const Environment &, int, const InsnPtr &);
+  void markBoundVars(BoundVarList &vars, bool);
+  bool canEval(bool maybeCall) const;
+protected:
+  virtual void unknownStyleKeyword(const Identifier *ident, Interpreter &interp,
+                                   const Location &loc) const;
+  virtual bool maybeStyleKeyword(const Identifier *ident) const;
+  Vector<const Identifier *> keys_;
+  NCVector<Owner<Expression> > exprs_;
+};
+
+class FlowObj;
+
+class MakeExpression : public StyleExpression {
+public:
+  MakeExpression(const Identifier *,
+                 Vector<const Identifier *> &,
+                NCVector<Owner<Expression> > &,
+                const Location &loc);
+  InsnPtr compile(Interpreter &, const Environment &, int, const InsnPtr &);
+private:
+  InsnPtr compileNonInheritedCs(Interpreter &interp, const Environment &env,
+                               int stackPos, const InsnPtr &next);
+  FlowObj *applyConstNonInheritedCs(FlowObj *, Interpreter &, const Environment &);
+  void unknownStyleKeyword(const Identifier *ident, Interpreter &interp,
+                          const Location &loc) const;
+  bool maybeStyleKeyword(const Identifier *ident) const;
+
+  const Identifier *foc_;
+};
+
+inline
+const Location &Expression::location() const
+{
+  return loc_;
+}
+
+inline
+InsnPtr Expression::optimizeCompile(Owner<Expression> &expr, Interpreter &interp,
+                                   const Environment &env, int stackPos,
+                                   const InsnPtr &next)
+{
+  expr->optimize(interp, env, expr);
+  return expr->compile(interp, env, stackPos, next);
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not Expression_INCLUDED */
diff --git a/style/FOTBuilder.cxx b/style/FOTBuilder.cxx
new file mode 100644 (file)
index 0000000..f67813f
--- /dev/null
@@ -0,0 +1,2824 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#include "stylelib.h"
+#include "FOTBuilder.h"
+#include "Owner.h"
+#include "macros.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+const char *FOTBuilder::symbolName(Symbol sym)
+{
+  if (sym < 2 || sym >= int(nSymbols))
+    return 0;
+  // These must match the order in Symbol
+  static const char *names[] = {
+    "not-applicable",
+    "ultra-condensed",
+    "extra-condensed",
+    "condensed",
+    "semi-condensed",
+    "ultra-light",
+    "extra-light",
+    "light",
+    "semi-light",
+    "medium",
+    "semi-expanded",
+    "expanded",
+    "extra-expanded",
+    "ultra-expanded",
+    "semi-bold",
+    "bold",
+    "extra-bold",
+    "ultra-bold",
+    "upright",
+    "oblique",
+    "back-slanted-oblique",
+    "italic",
+    "back-slanted-italic",
+    "start",
+    "end",
+    "center",
+    "justify",
+    "spread-inside",
+    "spread-outside",
+    "page-inside",
+    "page-outside",
+    "wrap",
+    "asis",
+    "asis-wrap",
+    "asis-truncate",
+    "none",
+    "before",
+    "through",
+    "after",
+    "top-to-bottom",
+    "left-to-right",
+    "bottom-to-top",
+    "right-to-left",
+    "inside",
+    "outside",
+    "horizontal",
+    "vertical",
+    "escapement",
+    "line-progression",
+    "math",
+    "ordinary",
+    "operator",
+    "binary",
+    "relation",
+    "opening",
+    "closing",
+    "punctuation",
+    "inner",
+    "space",
+    "page",
+    "page-region",
+    "column-set",
+    "column",
+    "max",
+    "max-uniform",
+    "miter",
+    "round",
+    "join",
+    "butt",
+    "square",
+    "loose",
+    "normal",
+    "kern",
+    "tight",
+    "touch",
+    "preserve",
+    "collapse",
+    "ignore",
+    "relative",
+    "display",
+    "inline",
+    "border",
+    "background",
+    "both",
+    "base",
+    "font",
+    "top",
+    "bottom",
+    "spread",
+    "solid",
+    "outline",
+    "with",
+    "against",
+    "force",
+    "independent",
+    "pile",
+    "sup-out",
+    "sub-out",
+    "lead-edge",
+    "trail-edge",
+    "explicit",
+    "row-major",
+    "column-major",
+  };
+  ASSERT(SIZEOF(names) == nSymbols - 2);
+  return names[sym - 2];
+}
+
+SaveFOTBuilder *FOTBuilder::asSaveFOTBuilder()
+{
+  return 0;
+}
+
+FOTBuilder::~FOTBuilder()
+{
+}
+
+void FOTBuilder::start()
+{
+}
+
+void FOTBuilder::end()
+{
+}
+
+void FOTBuilder::atomic()
+{
+  start();
+  end();
+}
+
+void FOTBuilder::characters(const Char *, size_t)
+{
+}
+  
+void FOTBuilder::charactersFromNode(const NodePtr &, const Char *s, size_t n)
+{
+  characters(s, n);
+}
+
+void FOTBuilder::character(const CharacterNIC &nic)
+{
+  if (nic.valid)
+    characters(&nic.ch, 1);
+  atomic();
+}
+  
+void FOTBuilder::startSequence()
+{
+  start();
+}
+  
+void FOTBuilder::endSequence()
+{
+  end();
+}
+
+void FOTBuilder::startLineField(const LineFieldNIC &)
+{
+  start();
+}
+  
+void FOTBuilder::endLineField()
+{
+  end();
+}
+
+void FOTBuilder::paragraphBreak(const ParagraphNIC &)
+{
+  atomic();
+}
+
+void FOTBuilder::externalGraphic(const ExternalGraphicNIC &)
+{
+  atomic();
+}
+
+void FOTBuilder::rule(const RuleNIC &)
+{
+  atomic();
+}
+
+void FOTBuilder::alignmentPoint()
+{
+  atomic();
+}
+
+void FOTBuilder::formattingInstruction(const StringC &)
+{
+  atomic();
+}
+
+void FOTBuilder::startParagraph(const ParagraphNIC &)
+{
+  start();
+}
+  
+void FOTBuilder::endParagraph()
+{
+  end();
+}
+  
+void FOTBuilder::startDisplayGroup(const DisplayGroupNIC &)
+{
+  start();
+}
+  
+void FOTBuilder::endDisplayGroup()
+{
+  end();
+}
+  
+void FOTBuilder::startScroll()
+{
+  start();
+}
+
+void FOTBuilder::endScroll()
+{
+  end();
+}
+
+void FOTBuilder::startLink(const Address &)
+{
+  start();
+}
+
+void FOTBuilder::endLink()
+{
+  end();
+}
+
+void FOTBuilder::startMarginalia()
+{
+  start();
+}
+
+void FOTBuilder::endMarginalia()
+{
+  end();
+}
+
+void FOTBuilder::startMultiMode(const FOTBuilder::MultiMode *,
+                               const Vector<FOTBuilder::MultiMode> &,
+                               Vector<FOTBuilder *> &ports)
+{
+  start();
+  for (size_t i = 0; i < ports.size(); i++)
+    ports[i] = this;
+}
+
+void FOTBuilder::endMultiMode()
+{
+  end();
+}
+
+void FOTBuilder::startScore(Symbol)
+{
+  start();
+}
+
+void FOTBuilder::startScore(Char)
+{
+  start();
+}
+
+void FOTBuilder::startScore(const LengthSpec &)
+{
+  start();
+}
+
+void FOTBuilder::endScore()
+{
+  end();
+}
+
+void FOTBuilder::startLeader(const LeaderNIC &)
+{
+  start();
+}
+
+void FOTBuilder::endLeader()
+{
+  end();
+}
+
+void FOTBuilder::startBox(const BoxNIC &)
+{
+  start();
+}
+
+void FOTBuilder::endBox()
+{
+  end();
+}
+
+void FOTBuilder::startSideline()
+{
+}
+
+void FOTBuilder::endSideline()
+{
+}
+
+void FOTBuilder::startSimplePageSequence(FOTBuilder* headerFooter[nHF])
+{
+  for ( unsigned i = 0; i < nHF; ++i )
+    headerFooter[i] = this;
+  start();
+}
+
+void FOTBuilder::endSimplePageSequenceHeaderFooter()
+{
+}
+
+void FOTBuilder::endSimplePageSequence()
+{
+  end();
+}
+
+void FOTBuilder::pageNumber()
+{
+}
+
+void FOTBuilder::startTable(const TableNIC &)
+{
+  start();
+}
+
+void FOTBuilder::endTable()
+{
+  end();
+}
+
+void FOTBuilder::tableBeforeRowBorder()
+{
+  atomic();
+}
+
+void FOTBuilder::tableAfterRowBorder()
+{
+  atomic();
+}
+
+void FOTBuilder::tableBeforeColumnBorder()
+{
+  atomic();
+}
+
+void FOTBuilder::tableAfterColumnBorder()
+{
+  atomic();
+}
+
+void FOTBuilder::startTablePart(const TablePartNIC &, FOTBuilder *&header, FOTBuilder *&footer)
+{
+  start();
+  header = footer = this;
+}
+
+void FOTBuilder::endTablePart()
+{
+  end();
+}
+
+void FOTBuilder::tableColumn(const TableColumnNIC &)
+{
+  atomic();
+}
+
+void FOTBuilder::startTableRow()
+{
+  start();
+}
+
+void FOTBuilder::endTableRow()
+{
+  end();
+}
+
+void FOTBuilder::startTableCell(const TableCellNIC &)
+{
+  start();
+}
+
+void FOTBuilder::endTableCell()
+{
+  end();
+}
+
+void FOTBuilder::tableCellBeforeRowBorder()
+{
+  atomic();
+}
+
+void FOTBuilder::tableCellAfterRowBorder()
+{
+  atomic();
+}
+
+void FOTBuilder::tableCellBeforeColumnBorder()
+{
+  atomic();
+}
+
+void FOTBuilder::tableCellAfterColumnBorder()
+{
+  atomic();
+}
+
+void FOTBuilder::startMathSequence()
+{
+  start();
+}
+
+void FOTBuilder::endMathSequence()
+{
+  end();
+}
+
+void FOTBuilder::startFraction(FOTBuilder *&numerator, FOTBuilder *&denominator)
+{
+  start();
+  numerator = denominator = this;
+}
+
+void FOTBuilder::endFraction()
+{
+  end();
+}
+
+void FOTBuilder::fractionBar()
+{
+  atomic();
+}
+
+void FOTBuilder::startUnmath()
+{
+  start();
+}
+
+void FOTBuilder::endUnmath()
+{
+  end();
+}
+
+void FOTBuilder::startSuperscript()
+{
+  start();
+}
+
+void FOTBuilder::endSuperscript()
+{
+  end();
+}
+
+void FOTBuilder::startSubscript()
+{
+  start();
+}
+
+void FOTBuilder::endSubscript()
+{
+  end();
+}
+
+void FOTBuilder::startScript(FOTBuilder *&preSup,
+                            FOTBuilder *&preSub,
+                            FOTBuilder *&postSup,
+                            FOTBuilder *&postSub,
+                            FOTBuilder *&midSup,
+                            FOTBuilder *&midSub)
+{
+  start();
+  preSup = preSub = postSup = postSub = midSup = midSub = this;
+}
+
+void FOTBuilder::endScript()
+{
+  end();
+}
+
+void FOTBuilder::startMark(FOTBuilder *&overMark, FOTBuilder *&underMark)
+{
+  start();
+  overMark = underMark = this;
+}
+
+void FOTBuilder::endMark()
+{
+  end();
+}
+
+void FOTBuilder::startFence(FOTBuilder *&open, FOTBuilder *&close)
+{
+  start();
+  open = close = this;
+}
+
+void FOTBuilder::endFence()
+{
+  end();
+}
+
+void FOTBuilder::startRadical(FOTBuilder *&degree)
+{
+  start();
+  degree = this;
+}
+
+void FOTBuilder::endRadical()
+{
+  end();
+}
+
+void FOTBuilder::radicalRadical(const CharacterNIC &)
+{
+  atomic();
+}
+
+void FOTBuilder::radicalRadicalDefaulted()
+{
+}
+
+void FOTBuilder::startMathOperator(FOTBuilder *&oper,
+                                  FOTBuilder *&lowerLimit,
+                                  FOTBuilder *&upperLimit)
+{
+  start();
+  oper = lowerLimit = upperLimit = this;
+}
+
+void FOTBuilder::endMathOperator()
+{
+  end();
+}
+
+void FOTBuilder::startGrid(const GridNIC &)
+{
+  start();
+}
+
+void FOTBuilder::endGrid()
+{
+  end();
+}
+
+void FOTBuilder::startGridCell(const GridCellNIC &)
+{
+  start();
+}
+
+void FOTBuilder::endGridCell()
+{
+  end();
+}
+
+void FOTBuilder::extension(const ExtensionFlowObj &, const NodePtr &)
+{
+  atomic();
+}
+void FOTBuilder::startExtension(const CompoundExtensionFlowObj &,
+                               const NodePtr &,
+                               Vector<FOTBuilder *> &ports)
+{
+  for (size_t i = 0; i < ports.size(); i++)
+    ports[i] = this;
+  start();
+}
+
+void FOTBuilder::endExtension(const CompoundExtensionFlowObj &)
+{
+  end();
+}
+
+
+void FOTBuilder::setFontSize(Length)
+{
+}
+  
+void FOTBuilder::setFontFamilyName(const StringC &)
+{
+}
+
+void FOTBuilder::setFontWeight(Symbol)
+{
+}
+
+void FOTBuilder::setFontPosture(Symbol)
+{
+}
+
+void FOTBuilder::setStartIndent(const LengthSpec &)
+{
+}
+
+void FOTBuilder::setEndIndent(const LengthSpec &)
+{
+}
+
+void FOTBuilder::setFirstLineStartIndent(const LengthSpec &)
+{
+}
+
+void FOTBuilder::setLastLineEndIndent(const LengthSpec &)
+{
+}
+
+void FOTBuilder::setLineSpacing(const LengthSpec &)
+{
+}
+
+void FOTBuilder::setFieldWidth(const LengthSpec &)
+{
+}
+
+void FOTBuilder::setQuadding(Symbol)
+{
+}
+
+void FOTBuilder::setDisplayAlignment(Symbol)
+{
+}
+
+void FOTBuilder::setFieldAlign(Symbol)
+{
+}
+
+void FOTBuilder::setLines(Symbol)
+{
+}
+
+void FOTBuilder::setColor(const DeviceRGBColor &)
+{
+}
+
+void FOTBuilder::setBackgroundColor(const DeviceRGBColor &)
+{
+}
+
+void FOTBuilder::setBackgroundColor()
+{
+}
+
+void FOTBuilder::setPageWidth(Length)
+{
+}
+
+void FOTBuilder::setPageHeight(Length)
+{
+}
+
+void FOTBuilder::setLeftMargin(Length)
+{
+}
+
+void FOTBuilder::setRightMargin(Length)
+{
+}
+
+void FOTBuilder::setTopMargin(Length)
+{
+}
+
+void FOTBuilder::setBottomMargin(Length)
+{
+}
+
+void FOTBuilder::setHeaderMargin(Length)
+{
+}
+
+void FOTBuilder::setFooterMargin(Length)
+{
+}
+
+void FOTBuilder::setBorderPresent(bool)
+{
+}
+
+void FOTBuilder::setLineThickness(Length)
+{
+}
+
+void FOTBuilder::setCellBeforeRowMargin(Length)
+{
+}
+
+void FOTBuilder::setCellAfterRowMargin(Length)
+{
+}
+
+void FOTBuilder::setCellBeforeColumnMargin(Length)
+{
+}
+
+void FOTBuilder::setCellAfterColumnMargin(Length)
+{
+}
+
+void FOTBuilder::setLineSep(Length)
+{
+}
+
+void FOTBuilder::setBoxSizeBefore(Length)
+{
+}
+
+void FOTBuilder::setBoxSizeAfter(Length)
+{
+}
+
+void FOTBuilder::setPositionPointShift(const LengthSpec &)
+{
+}
+
+void FOTBuilder::setStartMargin(const LengthSpec &)
+{
+}
+
+void FOTBuilder::setEndMargin(const LengthSpec &)
+{
+}
+
+void FOTBuilder::setSidelineSep(const LengthSpec &)
+{
+}
+
+void FOTBuilder::setAsisWrapIndent(const LengthSpec &)
+{
+}
+
+void FOTBuilder::setLineNumberSep(const LengthSpec &)
+{
+}
+
+void FOTBuilder::setLastLineJustifyLimit(const LengthSpec &)
+{
+}
+
+void FOTBuilder::setJustifyGlyphSpaceMaxAdd(const LengthSpec &)
+{
+}
+
+void FOTBuilder::setJustifyGlyphSpaceMaxRemove(const LengthSpec &)
+{
+}
+
+void FOTBuilder::setTableCornerRadius(const LengthSpec &)
+{
+}
+
+void FOTBuilder::setBoxCornerRadius(const LengthSpec &)
+{
+}
+
+void FOTBuilder::setMarginaliaSep(const LengthSpec &)
+{
+}
+
+void FOTBuilder::setMinPreLineSpacing(const OptLengthSpec &)
+{
+}
+
+void FOTBuilder::setMinPostLineSpacing(const OptLengthSpec &)
+{
+}
+
+void FOTBuilder::setMinLeading(const OptLengthSpec &)
+{
+}
+
+void FOTBuilder::setInhibitLineBreaks(bool)
+{
+}
+
+void FOTBuilder::setHyphenate(bool)
+{
+}
+
+void FOTBuilder::setKern(bool)
+{
+}
+
+void FOTBuilder::setLigature(bool)
+{
+}
+
+void FOTBuilder::setScoreSpaces(bool)
+{
+}
+
+void FOTBuilder::setFloatOutMarginalia(bool)
+{
+}
+
+void FOTBuilder::setFloatOutSidelines(bool)
+{
+}
+
+void FOTBuilder::setFloatOutLineNumbers(bool)
+{
+}
+
+void FOTBuilder::setCellBackground(bool)
+{
+}
+
+void FOTBuilder::setSpanWeak(bool)
+{
+}
+
+void FOTBuilder::setIgnoreRecordEnd(bool)
+{
+}
+
+void FOTBuilder::setNumberedLines(bool)
+{
+}
+
+void FOTBuilder::setHangingPunct(bool)
+{
+}
+
+void FOTBuilder::setBoxOpenEnd(bool)
+{
+}
+
+void FOTBuilder::setTruncateLeader(bool)
+{
+}
+
+void FOTBuilder::setAlignLeader(bool)
+{
+}
+
+void FOTBuilder::setTablePartOmitMiddleHeader(bool)
+{
+}
+
+void FOTBuilder::setTablePartOmitMiddleFooter(bool)
+{
+}
+
+void FOTBuilder::setBorderOmitAtBreak(bool)
+{
+}
+
+void FOTBuilder::setPrincipalModeSimultaneous(bool)
+{
+}
+
+void FOTBuilder::setMarginaliaKeepWithPrevious(bool)
+{
+}
+
+void FOTBuilder::setGridEquidistantRows(bool)
+{
+}
+void FOTBuilder::setGridEquidistantColumns(bool)
+{
+}
+
+void FOTBuilder::setLineJoin(Symbol)
+{
+}
+
+void FOTBuilder::setLineCap(Symbol)
+{
+}
+
+void FOTBuilder::setLineNumberSide(Symbol)
+{
+}
+
+void FOTBuilder::setKernMode(Symbol)
+{
+}
+
+void FOTBuilder::setInputWhitespaceTreatment(Symbol)
+{
+}
+
+void FOTBuilder::setFillingDirection(Symbol)
+{
+}
+
+void FOTBuilder::setWritingMode(Symbol)
+{
+}
+
+void FOTBuilder::setLastLineQuadding(Symbol)
+{
+}
+
+void FOTBuilder::setMathDisplayMode(Symbol)
+{
+}
+
+void FOTBuilder::setScriptPreAlign(Symbol)
+{
+}
+
+void FOTBuilder::setScriptPostAlign(Symbol)
+{
+}
+
+void FOTBuilder::setScriptMidSupAlign(Symbol)
+{
+}
+
+void FOTBuilder::setScriptMidSubAlign(Symbol)
+{
+}
+
+void FOTBuilder::setNumeratorAlign(Symbol)
+{
+}
+
+void FOTBuilder::setDenominatorAlign(Symbol)
+{
+}
+
+void FOTBuilder::setGridPositionCellType(Symbol)
+{
+}
+
+void FOTBuilder::setGridColumnAlignment(Symbol)
+{
+}
+
+void FOTBuilder::setGridRowAlignment(Symbol)
+{
+}
+
+void FOTBuilder::setBoxType(Symbol)
+{
+}
+
+void FOTBuilder::setGlyphAlignmentMode(Symbol)
+{
+}
+
+void FOTBuilder::setBoxBorderAlignment(Symbol)
+{
+}
+
+void FOTBuilder::setCellRowAlignment(Symbol)
+{
+}
+
+void FOTBuilder::setBorderAlignment(Symbol)
+{
+}
+
+void FOTBuilder::setSidelineSide(Symbol)
+{
+}
+
+void FOTBuilder::setHyphenationKeep(Symbol)
+{
+}
+
+void FOTBuilder::setFontStructure(Symbol)
+{
+}
+
+void FOTBuilder::setFontProportionateWidth(Symbol)
+{
+}
+
+void FOTBuilder::setCellCrossed(Symbol)
+{
+}
+
+void FOTBuilder::setMarginaliaSide(Symbol)
+{
+}
+
+void FOTBuilder::setLayer(long)
+{
+}
+
+void FOTBuilder::setBackgroundLayer(long)
+{
+}
+
+void FOTBuilder::setBorderPriority(long)
+{
+}
+
+void FOTBuilder::setLineRepeat(long)
+{
+}
+
+void FOTBuilder::setSpan(long)
+{
+}
+
+void FOTBuilder::setMinLeaderRepeat(long)
+{
+}
+
+void FOTBuilder::setHyphenationRemainCharCount(long)
+{
+}
+
+void FOTBuilder::setHyphenationPushCharCount(long)
+{
+}
+
+void FOTBuilder::setWidowCount(long)
+{
+}
+
+void FOTBuilder::setOrphanCount(long)
+{
+}
+
+void FOTBuilder::setExpandTabs(long)
+{
+}
+
+void FOTBuilder::setHyphenationLadderCount(long)
+{
+}
+
+void FOTBuilder::setBackgroundTile(PublicId)
+{
+}
+
+void FOTBuilder::setLineBreakingMethod(PublicId)
+{
+}
+
+void FOTBuilder::setLineCompositionMethod(PublicId)
+{
+}
+
+void FOTBuilder::setImplicitBidiMethod(PublicId)
+{
+}
+
+void FOTBuilder::setGlyphSubstMethod(PublicId)
+{
+}
+
+void FOTBuilder::setGlyphReorderMethod(PublicId)
+{
+}
+
+void FOTBuilder::setHyphenationMethod(PublicId)
+{
+}
+
+void FOTBuilder::setTableAutoWidthMethod(PublicId)
+{
+}
+
+void FOTBuilder::setFontName(PublicId)
+{
+}
+
+void FOTBuilder::setLanguage(Letter2)
+{
+}
+
+void FOTBuilder::setCountry(Letter2)
+{
+}
+
+void FOTBuilder::setEscapementSpaceBefore(const InlineSpace &)
+{
+}
+
+void FOTBuilder::setEscapementSpaceAfter(const InlineSpace &)
+{
+}
+
+void FOTBuilder::setInlineSpaceSpace(const OptInlineSpace &)
+{
+}
+
+void FOTBuilder::setGlyphSubstTable(const Vector<ConstPtr<GlyphSubstTable> > &)
+{
+}
+
+void FOTBuilder::startNode(const NodePtr &, const StringC &)
+{
+}
+  
+void FOTBuilder::endNode()
+{
+}
+
+void FOTBuilder::currentNodePageNumber(const NodePtr &)
+{
+}
+
+void FOTBuilder::extensionSet(void (FOTBuilder::*func)(bool), bool arg)
+{
+  (this->*func)(arg);
+}
+
+void FOTBuilder::extensionSet(void (FOTBuilder::*func)(const StringC &), const StringC &arg)
+{
+  (this->*func)(arg);
+}
+
+void FOTBuilder::extensionSet(void (FOTBuilder::*func)(long), long arg)
+{
+  (this->*func)(arg);
+}
+
+
+FOTBuilder::DisplayNIC::DisplayNIC()
+: positionPreference(symbolFalse),
+  keep(symbolFalse),
+  breakBefore(symbolFalse),
+  breakAfter(symbolFalse),
+  keepWithPrevious(0),
+  keepWithNext(0),
+  mayViolateKeepBefore(0),
+  mayViolateKeepAfter(0)
+{
+}
+
+FOTBuilder::DisplayGroupNIC::DisplayGroupNIC()
+: hasCoalesceId(0)
+{
+}
+
+FOTBuilder::InlineNIC::InlineNIC()
+: breakBeforePriority(0),
+  breakAfterPriority(0)
+{
+}
+
+FOTBuilder::ExternalGraphicNIC::ExternalGraphicNIC()
+: scaleType(symbolMaxUniform),
+  isDisplay(0),
+  hasMaxWidth(0),
+  hasMaxHeight(0),
+  escapementDirection(symbolFalse)
+{
+}
+
+FOTBuilder::BoxNIC::BoxNIC()
+: isDisplay(0)
+{
+}
+
+FOTBuilder::RuleNIC::RuleNIC()
+: orientation(symbolHorizontal),
+  hasLength(0)
+{
+}
+
+FOTBuilder::LeaderNIC::LeaderNIC()
+: hasLength(0)
+{
+}
+
+FOTBuilder::CharacterNIC::CharacterNIC()
+: valid(0), specifiedC(0), stretchFactor(1.0)
+{
+}
+
+FOTBuilder::TableNIC::TableNIC()
+: widthType(widthFull)
+{
+}
+
+FOTBuilder::TableColumnNIC::TableColumnNIC()
+: columnIndex(0), nColumnsSpanned(1), hasWidth(0)
+{
+}
+
+FOTBuilder::TableCellNIC::TableCellNIC()
+: columnIndex(0), nColumnsSpanned(1), nRowsSpanned(1), missing(0)
+{
+}
+
+FOTBuilder::GridNIC::GridNIC()
+: nColumns(0), nRows(0)
+{
+}
+
+FOTBuilder::GridCellNIC::GridCellNIC()
+: columnNumber(0), rowNumber(0)
+{
+}
+
+FOTBuilder::MultiMode::MultiMode()
+: hasDesc(0)
+{
+}
+
+FOTBuilder::GlyphId FOTBuilder::GlyphSubstTable::subst(const FOTBuilder::GlyphId &gid) const
+{
+  for (size_t i = 0; i < pairs.size(); i += 2)
+    if (gid == pairs[i])
+      return pairs[i + 1];
+  return gid;
+}
+
+SaveFOTBuilder::SaveFOTBuilder()
+: calls_(0), tail_(&calls_)
+{
+}
+
+SaveFOTBuilder::SaveFOTBuilder(const NodePtr &currentNode,
+                              const StringC &processingMode)
+: currentNode_(currentNode),
+  processingMode_(processingMode),
+  calls_(0), tail_(&calls_)
+{
+}
+
+SaveFOTBuilder::~SaveFOTBuilder()
+{
+  *tail_ = 0;
+  while (calls_) {
+    Call *tem = calls_;
+    calls_ = calls_->next;
+    delete tem;
+  }
+}
+
+SaveFOTBuilder *SaveFOTBuilder::asSaveFOTBuilder()
+{
+  return this;
+}
+
+void SaveFOTBuilder::emit(FOTBuilder &fotb)
+{
+  if (currentNode_)
+    fotb.startNode(currentNode_, processingMode_);
+  SaveFOTBuilder *save = fotb.asSaveFOTBuilder();
+  if (save) {
+    if (calls_) {
+      *save->tail_ = calls_;
+      save->tail_ = tail_;
+      calls_ = 0;
+      tail_ = &calls_;
+    }
+  }
+  else {
+    *tail_ = 0;
+    while (calls_) {
+      Call *tem = calls_;
+      calls_ = calls_->next;
+      tem->emit(fotb);
+      delete tem;
+    }
+    tail_ = &calls_;
+  }
+  if (currentNode_)
+    fotb.endNode();
+}
+
+#define NO_ARG_CALL(F) \
+  void SaveFOTBuilder::F() { \
+    *tail_ = new NoArgCall(&FOTBuilder::F); \
+     tail_ = &(*tail_)->next; }
+
+NO_ARG_CALL(startSequence)
+NO_ARG_CALL(endSequence)
+NO_ARG_CALL(endLineField)
+NO_ARG_CALL(endParagraph)
+NO_ARG_CALL(endDisplayGroup)
+NO_ARG_CALL(alignmentPoint)
+NO_ARG_CALL(startScroll)
+NO_ARG_CALL(endScroll)
+NO_ARG_CALL(endLeader)
+NO_ARG_CALL(endLink)
+NO_ARG_CALL(startMarginalia)
+NO_ARG_CALL(endMarginalia)
+NO_ARG_CALL(endMultiMode)
+NO_ARG_CALL(endScore)
+NO_ARG_CALL(endBox)
+NO_ARG_CALL(startSideline)
+NO_ARG_CALL(endSideline)
+NO_ARG_CALL(endNode)
+NO_ARG_CALL(endSimplePageSequenceHeaderFooter)
+NO_ARG_CALL(endSimplePageSequence)
+NO_ARG_CALL(pageNumber)
+NO_ARG_CALL(endTable)
+NO_ARG_CALL(tableBeforeRowBorder)
+NO_ARG_CALL(tableAfterRowBorder)
+NO_ARG_CALL(tableBeforeColumnBorder)
+NO_ARG_CALL(tableAfterColumnBorder)
+NO_ARG_CALL(endTablePart)
+NO_ARG_CALL(startTableRow)
+NO_ARG_CALL(endTableRow)
+NO_ARG_CALL(endTableCell)
+NO_ARG_CALL(tableCellBeforeRowBorder)
+NO_ARG_CALL(tableCellAfterRowBorder)
+NO_ARG_CALL(tableCellBeforeColumnBorder)
+NO_ARG_CALL(tableCellAfterColumnBorder)
+NO_ARG_CALL(startMathSequence)
+NO_ARG_CALL(endMathSequence)
+NO_ARG_CALL(endFraction)
+NO_ARG_CALL(fractionBar)
+NO_ARG_CALL(startUnmath)
+NO_ARG_CALL(endUnmath)
+NO_ARG_CALL(startSuperscript)
+NO_ARG_CALL(endSuperscript)
+NO_ARG_CALL(startSubscript)
+NO_ARG_CALL(endSubscript)
+NO_ARG_CALL(endScript)
+NO_ARG_CALL(endMark)
+NO_ARG_CALL(endFence)
+NO_ARG_CALL(endRadical)
+NO_ARG_CALL(radicalRadicalDefaulted)
+NO_ARG_CALL(endMathOperator)
+NO_ARG_CALL(endGrid)
+NO_ARG_CALL(endGridCell)
+
+#define LENGTH_SPEC_ARG_CALL(F) \
+  void SaveFOTBuilder::F(const LengthSpec &lengthSpec) { \
+    *tail_ = new LengthSpecArgCall(&FOTBuilder::F, lengthSpec); \
+     tail_ = &(*tail_)->next; }
+
+LENGTH_SPEC_ARG_CALL(setStartIndent)
+LENGTH_SPEC_ARG_CALL(setEndIndent)
+LENGTH_SPEC_ARG_CALL(setFirstLineStartIndent)
+LENGTH_SPEC_ARG_CALL(setLastLineEndIndent)
+LENGTH_SPEC_ARG_CALL(setLineSpacing)
+LENGTH_SPEC_ARG_CALL(setFieldWidth)
+LENGTH_SPEC_ARG_CALL(setPositionPointShift)
+LENGTH_SPEC_ARG_CALL(setStartMargin)
+LENGTH_SPEC_ARG_CALL(setEndMargin)
+LENGTH_SPEC_ARG_CALL(setSidelineSep)
+LENGTH_SPEC_ARG_CALL(setAsisWrapIndent)
+LENGTH_SPEC_ARG_CALL(setLineNumberSep)
+LENGTH_SPEC_ARG_CALL(setLastLineJustifyLimit)
+LENGTH_SPEC_ARG_CALL(setJustifyGlyphSpaceMaxAdd)
+LENGTH_SPEC_ARG_CALL(setJustifyGlyphSpaceMaxRemove)
+LENGTH_SPEC_ARG_CALL(setTableCornerRadius)
+LENGTH_SPEC_ARG_CALL(setBoxCornerRadius)
+LENGTH_SPEC_ARG_CALL(setMarginaliaSep)
+
+#define OPT_LENGTH_SPEC_ARG_CALL(F) \
+  void SaveFOTBuilder::F(const OptLengthSpec &optLengthSpec) { \
+    *tail_ = new OptLengthSpecArgCall(&FOTBuilder::F, optLengthSpec); \
+     tail_ = &(*tail_)->next; }
+
+OPT_LENGTH_SPEC_ARG_CALL(setMinPreLineSpacing)
+OPT_LENGTH_SPEC_ARG_CALL(setMinPostLineSpacing)
+OPT_LENGTH_SPEC_ARG_CALL(setMinLeading)
+
+#define LONG_ARG_CALL(F) \
+  void SaveFOTBuilder::F(long n) { \
+    *tail_ = new LongArgCall(&FOTBuilder::F, n); \
+     tail_ = &(*tail_)->next; }
+
+
+LONG_ARG_CALL(setFontSize)
+LONG_ARG_CALL(setPageWidth)
+LONG_ARG_CALL(setPageHeight)
+LONG_ARG_CALL(setLeftMargin)
+LONG_ARG_CALL(setRightMargin)
+LONG_ARG_CALL(setTopMargin)
+LONG_ARG_CALL(setBottomMargin)
+LONG_ARG_CALL(setHeaderMargin)
+LONG_ARG_CALL(setFooterMargin)
+LONG_ARG_CALL(setLineThickness)
+LONG_ARG_CALL(setCellBeforeRowMargin)
+LONG_ARG_CALL(setCellAfterRowMargin)
+LONG_ARG_CALL(setCellBeforeColumnMargin)
+LONG_ARG_CALL(setCellAfterColumnMargin)
+LONG_ARG_CALL(setLineSep)
+LONG_ARG_CALL(setBoxSizeBefore)
+LONG_ARG_CALL(setBoxSizeAfter)
+LONG_ARG_CALL(setLayer)
+LONG_ARG_CALL(setBackgroundLayer)
+LONG_ARG_CALL(setBorderPriority)
+LONG_ARG_CALL(setLineRepeat)
+LONG_ARG_CALL(setSpan)
+LONG_ARG_CALL(setMinLeaderRepeat)
+LONG_ARG_CALL(setHyphenationRemainCharCount)
+LONG_ARG_CALL(setHyphenationPushCharCount)
+LONG_ARG_CALL(setWidowCount)
+LONG_ARG_CALL(setOrphanCount)
+LONG_ARG_CALL(setExpandTabs)
+LONG_ARG_CALL(setHyphenationLadderCount)
+
+#define BOOL_ARG_CALL(F) \
+  void SaveFOTBuilder::F(bool b) { \
+    *tail_ = new BoolArgCall(&FOTBuilder::F, b); \
+     tail_ = &(*tail_)->next; }
+
+BOOL_ARG_CALL(setBorderPresent)
+BOOL_ARG_CALL(setInhibitLineBreaks)
+BOOL_ARG_CALL(setHyphenate)
+BOOL_ARG_CALL(setKern)
+BOOL_ARG_CALL(setLigature)
+BOOL_ARG_CALL(setScoreSpaces)
+BOOL_ARG_CALL(setFloatOutMarginalia)
+BOOL_ARG_CALL(setFloatOutSidelines)
+BOOL_ARG_CALL(setFloatOutLineNumbers)
+BOOL_ARG_CALL(setCellBackground)
+BOOL_ARG_CALL(setSpanWeak)
+BOOL_ARG_CALL(setIgnoreRecordEnd)
+BOOL_ARG_CALL(setNumberedLines)
+BOOL_ARG_CALL(setHangingPunct)
+BOOL_ARG_CALL(setBoxOpenEnd)
+BOOL_ARG_CALL(setTruncateLeader)
+BOOL_ARG_CALL(setAlignLeader)
+BOOL_ARG_CALL(setTablePartOmitMiddleHeader)
+BOOL_ARG_CALL(setTablePartOmitMiddleFooter)
+BOOL_ARG_CALL(setBorderOmitAtBreak)
+BOOL_ARG_CALL(setPrincipalModeSimultaneous)
+BOOL_ARG_CALL(setMarginaliaKeepWithPrevious)
+BOOL_ARG_CALL(setGridEquidistantRows)
+BOOL_ARG_CALL(setGridEquidistantColumns)
+
+#define SYMBOL_ARG_CALL(F) \
+  void SaveFOTBuilder::F(Symbol sym) { \
+    *tail_ = new SymbolArgCall(&FOTBuilder::F, sym); \
+     tail_ = &(*tail_)->next; }
+
+SYMBOL_ARG_CALL(setFontWeight)
+SYMBOL_ARG_CALL(setFontPosture)
+SYMBOL_ARG_CALL(setLines)
+SYMBOL_ARG_CALL(setQuadding)
+SYMBOL_ARG_CALL(setDisplayAlignment)
+SYMBOL_ARG_CALL(setFieldAlign)
+SYMBOL_ARG_CALL(setLineJoin)
+SYMBOL_ARG_CALL(setLineCap)
+SYMBOL_ARG_CALL(setLineNumberSide)
+SYMBOL_ARG_CALL(setKernMode)
+SYMBOL_ARG_CALL(setInputWhitespaceTreatment)
+SYMBOL_ARG_CALL(setFillingDirection)
+SYMBOL_ARG_CALL(setWritingMode)
+SYMBOL_ARG_CALL(setLastLineQuadding)
+SYMBOL_ARG_CALL(setMathDisplayMode)
+SYMBOL_ARG_CALL(setScriptPreAlign)
+SYMBOL_ARG_CALL(setScriptPostAlign)
+SYMBOL_ARG_CALL(setScriptMidSupAlign)
+SYMBOL_ARG_CALL(setScriptMidSubAlign)
+SYMBOL_ARG_CALL(setNumeratorAlign)
+SYMBOL_ARG_CALL(setDenominatorAlign)
+SYMBOL_ARG_CALL(setGridPositionCellType)
+SYMBOL_ARG_CALL(setGridColumnAlignment)
+SYMBOL_ARG_CALL(setGridRowAlignment)
+SYMBOL_ARG_CALL(setBoxType)
+SYMBOL_ARG_CALL(setGlyphAlignmentMode)
+SYMBOL_ARG_CALL(setBoxBorderAlignment)
+SYMBOL_ARG_CALL(setCellRowAlignment)
+SYMBOL_ARG_CALL(setBorderAlignment)
+SYMBOL_ARG_CALL(setSidelineSide)
+SYMBOL_ARG_CALL(setHyphenationKeep)
+SYMBOL_ARG_CALL(setFontStructure)
+SYMBOL_ARG_CALL(setFontProportionateWidth)
+SYMBOL_ARG_CALL(setCellCrossed)
+SYMBOL_ARG_CALL(setMarginaliaSide)
+
+#define PUBLIC_ID_ARG_CALL(F) \
+  void SaveFOTBuilder::F(PublicId pubid) { \
+    *tail_ = new PublicIdArgCall(&FOTBuilder::F, pubid); \
+     tail_ = &(*tail_)->next; }
+
+PUBLIC_ID_ARG_CALL(setBackgroundTile)
+PUBLIC_ID_ARG_CALL(setLineBreakingMethod)
+PUBLIC_ID_ARG_CALL(setLineCompositionMethod)
+PUBLIC_ID_ARG_CALL(setImplicitBidiMethod)
+PUBLIC_ID_ARG_CALL(setGlyphSubstMethod)
+PUBLIC_ID_ARG_CALL(setGlyphReorderMethod)
+PUBLIC_ID_ARG_CALL(setHyphenationMethod)
+PUBLIC_ID_ARG_CALL(setTableAutoWidthMethod)
+PUBLIC_ID_ARG_CALL(setFontName)
+
+#define UNSIGNED_ARG_CALL(F) \
+  void SaveFOTBuilder::F(unsigned n) { \
+    *tail_ = new UnsignedArgCall(&FOTBuilder::F, n); \
+     tail_ = &(*tail_)->next; }
+
+UNSIGNED_ARG_CALL(setLanguage)
+UNSIGNED_ARG_CALL(setCountry)
+
+#define STRING_ARG_CALL(F) \
+  void SaveFOTBuilder::F(const StringC &str) { \
+    *tail_ = new StringArgCall(&FOTBuilder::F, str); \
+     tail_ = &(*tail_)->next; }
+
+
+STRING_ARG_CALL(setFontFamilyName)
+STRING_ARG_CALL(formattingInstruction)
+
+#define INLINE_SPACE_ARG_CALL(F) \
+  void SaveFOTBuilder::F(const InlineSpace &is) { \
+    *tail_ = new InlineSpaceArgCall(&FOTBuilder::F, is); \
+     tail_ = &(*tail_)->next; }
+
+INLINE_SPACE_ARG_CALL(setEscapementSpaceBefore)
+INLINE_SPACE_ARG_CALL(setEscapementSpaceAfter)
+
+SaveFOTBuilder::Call::~Call()
+{
+}
+
+void SaveFOTBuilder::NoArgCall::emit(FOTBuilder &fotb)
+{
+  (fotb.*func)();
+}
+
+void SaveFOTBuilder::LongArgCall::emit(FOTBuilder &fotb)
+{
+  (fotb.*func)(arg);
+}
+
+void SaveFOTBuilder::ExtensionLongArgCall::emit(FOTBuilder &fotb)
+{
+  fotb.extensionSet(func, arg);
+}
+
+void SaveFOTBuilder::BoolArgCall::emit(FOTBuilder &fotb)
+{
+  (fotb.*func)(arg);
+}
+
+void SaveFOTBuilder::ExtensionBoolArgCall::emit(FOTBuilder &fotb)
+{
+  fotb.extensionSet(func, arg);
+}
+
+void SaveFOTBuilder::SymbolArgCall::emit(FOTBuilder &fotb)
+{
+  (fotb.*func)(arg);
+}
+
+void SaveFOTBuilder::PublicIdArgCall::emit(FOTBuilder &fotb)
+{
+  (fotb.*func)(arg);
+}
+
+void SaveFOTBuilder::UnsignedArgCall::emit(FOTBuilder &fotb)
+{
+  (fotb.*func)(arg);
+}
+
+void SaveFOTBuilder::InlineSpaceArgCall::emit(FOTBuilder &fotb)
+{
+  (fotb.*func)(arg);
+}
+
+void SaveFOTBuilder::StringArgCall::emit(FOTBuilder &fotb)
+{
+  (fotb.*func)(arg);
+}
+
+void SaveFOTBuilder::ExtensionStringArgCall::emit(FOTBuilder &fotb)
+{
+  fotb.extensionSet(func, arg);
+}
+
+void SaveFOTBuilder::CharArgCall::emit(FOTBuilder &fotb)
+{
+  (fotb.*func)(arg);
+}
+
+void SaveFOTBuilder::LengthSpecArgCall::emit(FOTBuilder &fotb)
+{
+  (fotb.*func)(arg);
+}
+
+void SaveFOTBuilder::OptLengthSpecArgCall::emit(FOTBuilder &fotb)
+{
+  (fotb.*func)(arg);
+}
+
+void SaveFOTBuilder::NodePtrArgCall::emit(FOTBuilder &fotb)
+{
+  (fotb.*func)(arg);
+}
+
+void SaveFOTBuilder::DeviceRGBColorArgCall::emit(FOTBuilder &fotb)
+{
+  (fotb.*func)(arg);
+}
+
+void SaveFOTBuilder::charactersFromNode(const NodePtr &node, const Char *s, size_t n)
+{
+  *tail_ = new CharactersFromNodeCall(node, s, n);
+  tail_ = &(*tail_)->next;
+}
+
+SaveFOTBuilder::CharactersFromNodeCall::CharactersFromNodeCall(const NodePtr &nd,
+                                                              const Char *s, size_t n)
+  : data(s), size(n), node(nd)
+{
+}
+
+void SaveFOTBuilder::CharactersFromNodeCall::emit(FOTBuilder &fotb)
+{
+  fotb.charactersFromNode(node, data, size);
+}
+
+void SaveFOTBuilder::characters(const Char *s, size_t n)
+{
+  *tail_ = new CharactersCall(s, n);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::CharacterCall::emit(FOTBuilder &fotb)
+{
+  fotb.character(arg);
+}
+
+void SaveFOTBuilder::character(const CharacterNIC &nic)
+{
+  *tail_ = new CharacterCall(nic);
+  tail_ = &(*tail_)->next;
+}
+
+SaveFOTBuilder::StartNodeCall::StartNodeCall(const NodePtr &nd,
+                                            const StringC &m)
+: node(nd), mode(m)
+{
+}
+
+void SaveFOTBuilder::StartNodeCall::emit(FOTBuilder &fotb)
+{
+  fotb.startNode(node, mode);
+}
+
+void SaveFOTBuilder::startNode(const NodePtr &node, const StringC &mode)
+{
+  *tail_ = new StartNodeCall(node, mode);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::currentNodePageNumber(const NodePtr &node)
+{
+  *tail_ = new NodePtrArgCall(&FOTBuilder::currentNodePageNumber, node);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::setColor(const DeviceRGBColor &color)
+{
+  *tail_ = new DeviceRGBColorArgCall(&FOTBuilder::setColor, color);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::setBackgroundColor(const DeviceRGBColor &color)
+{
+  DeviceRGBColorArgCall::FuncPtr f = &FOTBuilder::setBackgroundColor;
+  *tail_ = new DeviceRGBColorArgCall(f, color);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::setBackgroundColor()
+{
+  NoArgCall::FuncPtr f = &FOTBuilder::setBackgroundColor;
+  *tail_ = new NoArgCall(f);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::startParagraph(const ParagraphNIC &nic)
+
+{
+  *tail_ = new StartParagraphCall(nic);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::paragraphBreak(const ParagraphNIC &nic)
+
+{
+  *tail_ = new ParagraphBreakCall(nic);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::startDisplayGroup(const DisplayGroupNIC &nic)
+{
+  *tail_ = new StartDisplayGroupCall(nic);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::externalGraphic(const ExternalGraphicNIC &nic)
+{
+  *tail_ = new ExternalGraphicCall(nic);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::rule(const RuleNIC &nic)
+{
+  *tail_ = new RuleCall(nic);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::startLeader(const LeaderNIC &nic)
+{
+  *tail_ = new StartLeaderCall(nic);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::startLink(const Address &addr)
+{
+  *tail_ = new StartLinkCall(addr);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::startScore(Symbol type)
+{
+  SymbolArgCall::FuncPtr func = &FOTBuilder::startScore;
+  *tail_ = new SymbolArgCall(func, type);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::startScore(Char c)
+{
+  CharArgCall::FuncPtr func = &FOTBuilder::startScore;
+  *tail_ = new CharArgCall(func, c);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::startScore(const LengthSpec &len)
+{
+  LengthSpecArgCall::FuncPtr func = &FOTBuilder::startScore;
+  *tail_ = new LengthSpecArgCall(func, len);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::startLineField(const LineFieldNIC &nic)
+{
+  *tail_ = new StartLineFieldCall(nic);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::startBox(const BoxNIC &nic)
+{
+  *tail_ = new StartBoxCall(nic);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::startSimplePageSequence(FOTBuilder* headerFooter[nHF])
+{
+  *tail_ = new StartSimplePageSequenceCall(headerFooter);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::startTable(const TableNIC &nic)
+{
+  *tail_ = new StartTableCall(nic);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::startTablePart(const TablePartNIC &nic, FOTBuilder *&header, FOTBuilder *&footer)
+{
+  *tail_ = new StartTablePartCall(nic, header, footer);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::tableColumn(const TableColumnNIC &nic)
+{
+  *tail_ = new TableColumnCall(nic);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::startTableCell(const TableCellNIC &nic)
+{
+  *tail_ = new StartTableCellCall(nic);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::startFraction(FOTBuilder *&numerator, FOTBuilder *&denominator)
+{
+  *tail_ = new StartFractionCall(numerator, denominator);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::startScript(FOTBuilder *&preSup,
+                                FOTBuilder *&preSub,
+                                FOTBuilder *&postSup,
+                                FOTBuilder *&postSub,
+                                FOTBuilder *&midSup,
+                                FOTBuilder *&midSub)
+{
+  *tail_ = new StartScriptCall(preSup, preSub,
+                              postSup, postSub,
+                              midSup, midSub);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::startMark(FOTBuilder *&overMark, FOTBuilder *&underMark)
+{
+  *tail_ = new StartMarkCall(overMark, underMark);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::startFence(FOTBuilder *&open, FOTBuilder *&close)
+{
+  *tail_ = new StartFenceCall(open, close);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::startRadical(FOTBuilder *&degree)
+{
+  *tail_ = new StartRadicalCall(degree);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::radicalRadical(const CharacterNIC &nic)
+{
+  *tail_ = new RadicalRadicalCall(nic);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::startMathOperator(FOTBuilder *&oper,
+                                      FOTBuilder *&lowerLimit,
+                                      FOTBuilder *&upperLimit)
+{
+  *tail_ = new StartMathOperatorCall(oper, lowerLimit, upperLimit);
+  tail_ = &(*tail_)->next;
+}
+void SaveFOTBuilder::startGrid(const GridNIC &nic)
+{
+  *tail_ = new StartGridCall(nic);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::startGridCell(const GridCellNIC &nic)
+{
+  *tail_ = new StartGridCellCall(nic);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::startMultiMode(const MultiMode *principalMode,
+                                   const Vector<MultiMode> &namedModes,
+                                   Vector<FOTBuilder *> &namedPorts)
+{
+  *tail_ = new StartMultiModeCall(principalMode, namedModes, namedPorts);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::setGlyphSubstTable(const Vector<ConstPtr<GlyphSubstTable> > &tables)
+{
+  *tail_ = new SetGlyphSubstTableCall(tables);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::extensionSet(void (FOTBuilder::*func)(bool), bool arg)
+{
+  *tail_ = new ExtensionBoolArgCall(func, arg);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::extensionSet(void (FOTBuilder::*func)(const StringC &), const StringC &arg)
+{
+  *tail_ = new ExtensionStringArgCall(func, arg);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::extensionSet(void (FOTBuilder::*func)(long), long arg)
+{
+  *tail_ = new ExtensionLongArgCall(func, arg);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::startExtension(const CompoundExtensionFlowObj &fo,
+                                   const NodePtr &node,
+                                   Vector<FOTBuilder *> &ports)
+{
+  *tail_ = new StartExtensionCall(fo, node, ports);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::endExtension(const CompoundExtensionFlowObj &fo)
+{
+  *tail_ = new EndExtensionCall(fo);
+  tail_ = &(*tail_)->next;
+}
+
+void SaveFOTBuilder::extension(const ExtensionFlowObj &fo, const NodePtr &node)
+{
+  *tail_ = new ExtensionCall(fo, node);
+  tail_ = &(*tail_)->next;
+}
+
+SaveFOTBuilder::CharactersCall::CharactersCall(const Char *s, size_t n)
+: str(s, n)
+{
+}
+
+void SaveFOTBuilder::CharactersCall::emit(FOTBuilder &fotb)
+{
+  fotb.characters(str.data(), str.size());
+}
+
+StartSimplePageSequenceCall::StartSimplePageSequenceCall(FOTBuilder* hf[FOTBuilder::nHF])
+{
+  for ( unsigned i = 0; i < FOTBuilder::nHF; ++i )
+    hf[i] = &headerFooter[i];
+}
+
+void StartSimplePageSequenceCall::emit(FOTBuilder& fotb)
+{
+  FOTBuilder* hf[FOTBuilder::nHF];
+  fotb.startSimplePageSequence(hf);
+  for ( unsigned i = 0; i < FOTBuilder::nHF; ++i )
+    headerFooter[i].emit(*hf[i]);
+}
+
+StartFractionCall::StartFractionCall(FOTBuilder *&n, FOTBuilder *&d)
+{
+  n = &numerator;
+  d = &denominator;
+}
+
+void StartFractionCall::emit(FOTBuilder &fotb)
+{
+  FOTBuilder *n, *d;
+  fotb.startFraction(n, d);
+  numerator.emit(*n);
+  denominator.emit(*d);
+}
+
+StartScriptCall::StartScriptCall(FOTBuilder *&p0,
+                                FOTBuilder *&p1,
+                                FOTBuilder *&p2,
+                                FOTBuilder *&p3,
+                                FOTBuilder *&p4,
+                                FOTBuilder *&p5)
+{
+  p0 = &preSup;
+  p1 = &preSub;
+  p2 = &postSup;
+  p3 = &postSub;
+  p4 = &midSup;
+  p5 = &midSub;
+}
+
+void StartScriptCall::emit(FOTBuilder &fotb)
+{
+  FOTBuilder *v[6];
+  fotb.startScript(v[0], v[1], v[2], v[3], v[4], v[5]);
+  preSup.emit(*v[0]);
+  preSub.emit(*v[1]);
+  postSup.emit(*v[2]);
+  postSub.emit(*v[3]);
+  midSup.emit(*v[4]);
+  midSub.emit(*v[5]);
+}
+
+StartMarkCall::StartMarkCall(FOTBuilder *&o, FOTBuilder *&u)
+{
+  o = &overMark;
+  u = &underMark;
+}
+
+void StartMarkCall::emit(FOTBuilder &fotb)
+{
+  FOTBuilder *o, *u;
+  fotb.startMark(o, u);
+  overMark.emit(*o);
+  underMark.emit(*u);
+}
+
+StartFenceCall::StartFenceCall(FOTBuilder *&o, FOTBuilder *&c)
+{
+  o = &open;
+  c = &close;
+}
+
+void StartFenceCall::emit(FOTBuilder &fotb)
+{
+  FOTBuilder *o, *c;
+  fotb.startFence(o, c);
+  open.emit(*o);
+  close.emit(*c);
+}
+
+StartRadicalCall::StartRadicalCall(FOTBuilder *&d)
+{
+  d = &degree;
+}
+
+void StartRadicalCall::emit(FOTBuilder &fotb)
+{
+  FOTBuilder *d;
+  fotb.startRadical(d);
+  degree.emit(*d);
+}
+
+StartMathOperatorCall::StartMathOperatorCall(FOTBuilder *&o,
+                                            FOTBuilder *&l,
+                                            FOTBuilder *&u)
+{
+  o = &oper;
+  l = &lowerLimit;
+  u = &upperLimit;
+}
+
+void StartMathOperatorCall::emit(FOTBuilder &fotb)
+{
+  FOTBuilder *o, *l, *u;
+  fotb.startMathOperator(o, l, u);
+  oper.emit(*o);
+  lowerLimit.emit(*l);
+  upperLimit.emit(*u);
+}
+
+StartMultiModeCall::StartMultiModeCall(const FOTBuilder::MultiMode *pm,
+                                      const Vector<FOTBuilder::MultiMode> &nm,
+                                      Vector<FOTBuilder *> &v)
+: namedModes(nm)
+{
+  if (pm) {
+    hasPrincipalMode = 1;
+    principalMode = *pm;
+  }
+  else
+    hasPrincipalMode = 0;
+  for (size_t i = v.size(); i > 0; i--) {
+    ports.insert(new SaveFOTBuilder);
+    v[i - 1] = ports.head();
+  }
+}
+
+void StartMultiModeCall::emit(FOTBuilder &fotb)
+{
+  Vector<FOTBuilder *> v(namedModes.size());
+  fotb.startMultiMode(hasPrincipalMode ? &principalMode : 0, namedModes, v);
+  for (size_t i = 0; i < v.size(); i++) {
+    Owner<SaveFOTBuilder> tem(ports.get());
+    tem->emit(*v[i]);
+  }
+}
+
+void SaveFOTBuilder::StartTableCall::emit(FOTBuilder &fotb)
+{
+  fotb.startTable(arg);
+}
+
+void SaveFOTBuilder::TableColumnCall::emit(FOTBuilder &fotb)
+{
+  fotb.tableColumn(arg);
+}
+
+void SaveFOTBuilder::StartTableCellCall::emit(FOTBuilder &fotb)
+{
+  fotb.startTableCell(arg);
+}
+
+StartTablePartCall::StartTablePartCall(const SaveFOTBuilder::TablePartNIC &nic,
+                                      FOTBuilder *&h, FOTBuilder *&f)
+: arg(nic)
+{
+  h = &header;
+  f = &footer;
+}
+
+void StartTablePartCall::emit(FOTBuilder &fotb)
+{
+  FOTBuilder *h, *f;
+  fotb.startTablePart(arg, h, f);
+  header.emit(*h);
+  footer.emit(*f);
+}
+
+SaveFOTBuilder::StartParagraphCall::StartParagraphCall(const ParagraphNIC &nic)
+: arg(nic)
+{
+}
+
+void SaveFOTBuilder::StartParagraphCall::emit(FOTBuilder &fotb)
+{
+  fotb.startParagraph(arg);
+}
+
+SaveFOTBuilder::ParagraphBreakCall::ParagraphBreakCall(const ParagraphNIC &nic)
+: arg(nic)
+{
+}
+
+void SaveFOTBuilder::ParagraphBreakCall::emit(FOTBuilder &fotb)
+{
+  fotb.paragraphBreak(arg);
+}
+
+SaveFOTBuilder
+::StartDisplayGroupCall::StartDisplayGroupCall(const DisplayGroupNIC &nic)
+: arg(nic)
+{
+}
+
+void SaveFOTBuilder::StartDisplayGroupCall::emit(FOTBuilder &fotb)
+{
+  fotb.startDisplayGroup(arg);
+}
+
+void SaveFOTBuilder::ExternalGraphicCall::emit(FOTBuilder &fotb)
+{
+  fotb.externalGraphic(arg);
+}
+
+void SaveFOTBuilder::RuleCall::emit(FOTBuilder &fotb)
+{
+  fotb.rule(arg);
+}
+
+void SaveFOTBuilder::StartLeaderCall::emit(FOTBuilder &fotb)
+{
+  fotb.startLeader(arg);
+}
+
+void SaveFOTBuilder::StartBoxCall::emit(FOTBuilder &fotb)
+{
+  fotb.startBox(arg);
+}
+
+void SaveFOTBuilder::StartLineFieldCall::emit(FOTBuilder &fotb)
+{
+  fotb.startLineField(arg);
+}
+
+void SaveFOTBuilder::StartLinkCall::emit(FOTBuilder &fotb)
+{
+  fotb.startLink(arg);
+}
+
+void SaveFOTBuilder::SetGlyphSubstTableCall::emit(FOTBuilder &fotb)
+{
+  fotb.setGlyphSubstTable(arg);
+}
+
+void SaveFOTBuilder::StartGridCall::emit(FOTBuilder &fotb)
+{
+  fotb.startGrid(arg);
+}
+
+void SaveFOTBuilder::StartGridCellCall::emit(FOTBuilder &fotb)
+{
+  fotb.startGridCell(arg);
+}
+
+void SaveFOTBuilder::RadicalRadicalCall::emit(FOTBuilder &fotb)
+{
+  fotb.radicalRadical(arg);
+}
+
+void SaveFOTBuilder::ExtensionCall::emit(FOTBuilder &fotb)
+{
+  fotb.extension(*arg, node);
+}
+
+void SaveFOTBuilder::EndExtensionCall::emit(FOTBuilder &fotb)
+{
+  fotb.endExtension(*arg);
+}
+
+StartExtensionCall::StartExtensionCall(const FOTBuilder::CompoundExtensionFlowObj &fo,
+                                      const NodePtr &nd,
+                                      Vector<FOTBuilder *> &v)
+: flowObj(fo.copy()->asCompoundExtensionFlowObj()), node(nd)
+{
+  for (size_t i = v.size(); i > 0; i--) {
+    ports.insert(new SaveFOTBuilder);
+    v[i - 1] = ports.head();
+  }
+}
+
+void StartExtensionCall::emit(FOTBuilder &fotb)
+{
+  Vector<StringC> portNames;
+  flowObj->portNames(portNames);
+  Vector<FOTBuilder *> v(portNames.size());
+  fotb.startExtension(*flowObj, node, v);
+  for (size_t i = 0; i < v.size(); i++) {
+    Owner<SaveFOTBuilder> tem(ports.get());
+    tem->emit(*v[i]);
+  }
+}
+
+SerialFOTBuilder::SerialFOTBuilder()
+{
+}
+
+void SerialFOTBuilder::startSimplePageSequence(FOTBuilder* headerFooter[FOTBuilder::nHF])
+{
+  for ( unsigned i = 0; i < nHF; ++i ) {
+    save_.insert(new SaveFOTBuilder);
+    headerFooter[nHF-1-i] = save_.head();
+  }
+  startSimplePageSequenceSerial();
+}
+
+void SerialFOTBuilder::endSimplePageSequenceHeaderFooter()
+{
+  Owner<SaveFOTBuilder> hf[nHF];  
+  for ( unsigned k = 0; k < nHF; ++k ) 
+    hf[k] = save_.get();
+  // output all 24 parts, but in same order as 1.2.1, for regression testing
+  // replace with single loop later.
+  // sorry about all those constants :(
+  for (int i = 0; i < (1 << 2); i++) {
+    for (int j = 0; j < 6; j++) {
+      unsigned k = i | (j << 2);
+      startSimplePageSequenceHeaderFooter(k);
+      hf[k]->emit(*this);
+      endSimplePageSequenceHeaderFooter(k);
+    }
+  }
+  endAllSimplePageSequenceHeaderFooter();
+}
+
+void SerialFOTBuilder::endSimplePageSequence()
+{
+  endSimplePageSequenceSerial();
+}
+
+
+void SerialFOTBuilder::startFraction(FOTBuilder *&numerator, FOTBuilder *&denominator)
+{
+  save_.insert(new SaveFOTBuilder);
+  denominator = save_.head();
+  save_.insert(new SaveFOTBuilder);
+  numerator = save_.head();
+  startFractionSerial();
+}
+
+void SerialFOTBuilder::endFraction()
+{
+  {
+    Owner<SaveFOTBuilder> numerator(save_.get());
+    startFractionNumerator();
+    numerator->emit(*this);
+    endFractionNumerator();
+  }
+  {
+    Owner<SaveFOTBuilder> denominator(save_.get());
+    startFractionDenominator();
+    denominator->emit(*this);
+    endFractionDenominator();
+  }
+  endFractionSerial();
+}
+
+void SerialFOTBuilder::startScript(FOTBuilder *&preSup,
+                                  FOTBuilder *&preSub,
+                                  FOTBuilder *&postSup,
+                                  FOTBuilder *&postSub,
+                                  FOTBuilder *&midSup,
+                                  FOTBuilder *&midSub)
+{
+  save_.insert(new SaveFOTBuilder);
+  midSub = save_.head();
+  save_.insert(new SaveFOTBuilder);
+  midSup = save_.head();
+  save_.insert(new SaveFOTBuilder);
+  postSub = save_.head();
+  save_.insert(new SaveFOTBuilder);
+  postSup = save_.head();
+  save_.insert(new SaveFOTBuilder);
+  preSub = save_.head();
+  save_.insert(new SaveFOTBuilder);
+  preSup = save_.head();
+  startScriptSerial();
+}
+
+void SerialFOTBuilder::endScript()
+{
+  {
+    Owner<SaveFOTBuilder> tem(save_.get());
+    startScriptPreSup();
+    tem->emit(*this);
+    endScriptPreSup();
+  }
+  {
+    Owner<SaveFOTBuilder> tem(save_.get());
+    startScriptPreSub();
+    tem->emit(*this);
+    endScriptPreSub();
+  }
+  {
+    Owner<SaveFOTBuilder> tem(save_.get());
+    startScriptPostSup();
+    tem->emit(*this);
+    endScriptPostSup();
+  }
+  {
+    Owner<SaveFOTBuilder> tem(save_.get());
+    startScriptPostSub();
+    tem->emit(*this);
+    endScriptPostSub();
+  }
+  {
+    Owner<SaveFOTBuilder> tem(save_.get());
+    startScriptMidSup();
+    tem->emit(*this);
+    endScriptMidSup();
+  }
+  {
+    Owner<SaveFOTBuilder> tem(save_.get());
+    startScriptMidSub();
+    tem->emit(*this);
+    endScriptMidSub();
+  }
+  endScriptSerial();
+}
+
+void SerialFOTBuilder::startMark(FOTBuilder *&overMark, FOTBuilder *&underMark)
+{
+  save_.insert(new SaveFOTBuilder);
+  underMark = save_.head();
+  save_.insert(new SaveFOTBuilder);
+  overMark = save_.head();
+  startMarkSerial();
+}
+
+void SerialFOTBuilder::endMark()
+{
+  {
+    Owner<SaveFOTBuilder> tem(save_.get());
+    startMarkOver();
+    tem->emit(*this);
+    endMarkOver();
+  }
+  {
+    Owner<SaveFOTBuilder> tem(save_.get());
+    startMarkUnder();
+    tem->emit(*this);
+    endMarkUnder();
+  }
+  endMarkSerial();
+}
+
+void SerialFOTBuilder::startFence(FOTBuilder *&open, FOTBuilder *&close)
+{
+  save_.insert(new SaveFOTBuilder);
+  close = save_.head();
+  save_.insert(new SaveFOTBuilder);
+  open = save_.head();
+  startFenceSerial();
+}
+
+void SerialFOTBuilder::endFence()
+{
+  {
+    Owner<SaveFOTBuilder> tem(save_.get());
+    startFenceOpen();
+    tem->emit(*this);
+    endFenceOpen();
+  }
+  {
+    Owner<SaveFOTBuilder> tem(save_.get());
+    startFenceClose();
+    tem->emit(*this);
+    endFenceClose();
+  }
+  endFenceSerial();
+}
+
+void SerialFOTBuilder::startRadical(FOTBuilder *&degree)
+{
+  save_.insert(new SaveFOTBuilder);
+  degree = save_.head();
+  startRadicalSerial();
+}
+
+void SerialFOTBuilder::endRadical()
+{
+  Owner<SaveFOTBuilder> tem(save_.get());
+  startRadicalDegree();
+  tem->emit(*this);
+  endRadicalDegree();
+  endRadicalSerial();
+}
+
+void SerialFOTBuilder::startMathOperator(FOTBuilder *&oper,
+                                        FOTBuilder *&lowerLimit,
+                                        FOTBuilder *&upperLimit)
+{
+  save_.insert(new SaveFOTBuilder);
+  upperLimit = save_.head();
+  save_.insert(new SaveFOTBuilder);
+  lowerLimit = save_.head();
+  save_.insert(new SaveFOTBuilder);
+  oper = save_.head();
+  startMathOperatorSerial();
+}
+
+void SerialFOTBuilder::endMathOperator()
+{
+  {
+    Owner<SaveFOTBuilder> tem(save_.get());
+    startMathOperatorOperator();
+    tem->emit(*this);
+    endMathOperatorOperator();
+  }
+  {
+    Owner<SaveFOTBuilder> tem(save_.get());
+    startMathOperatorLowerLimit();
+    tem->emit(*this);
+    endMathOperatorLowerLimit();
+  }
+  {
+    Owner<SaveFOTBuilder> tem(save_.get());
+    startMathOperatorUpperLimit();
+    tem->emit(*this);
+    endMathOperatorUpperLimit();
+  }
+  endMathOperatorSerial();
+}
+
+void SerialFOTBuilder::startSimplePageSequenceSerial()
+{
+  start();
+}
+
+void SerialFOTBuilder::endSimplePageSequenceSerial()
+{
+  end();
+}
+
+void SerialFOTBuilder::startSimplePageSequenceHeaderFooter(unsigned)
+{
+  start();
+}
+
+void SerialFOTBuilder::endSimplePageSequenceHeaderFooter(unsigned)
+{
+  end();
+}
+
+void SerialFOTBuilder::endAllSimplePageSequenceHeaderFooter()
+{
+}
+
+void SerialFOTBuilder::startFractionSerial()
+{
+  start();
+}
+
+void SerialFOTBuilder::endFractionSerial()
+{
+  end();
+}
+
+void SerialFOTBuilder::startFractionNumerator()
+{
+}
+
+void SerialFOTBuilder::endFractionNumerator()
+{
+}
+
+void SerialFOTBuilder::startFractionDenominator()
+{
+}
+
+void SerialFOTBuilder::endFractionDenominator()
+{
+}
+
+void SerialFOTBuilder::startScriptSerial()
+{
+  start();
+}
+
+void SerialFOTBuilder::endScriptSerial()
+{
+  end();
+}
+
+void SerialFOTBuilder::startScriptPreSup()
+{
+}
+
+void SerialFOTBuilder::endScriptPreSup()
+{
+}
+
+void SerialFOTBuilder::startScriptPreSub()
+{
+}
+
+void SerialFOTBuilder::endScriptPreSub()
+{
+}
+
+void SerialFOTBuilder::startScriptPostSup()
+{
+}
+
+void SerialFOTBuilder::endScriptPostSup()
+{
+}
+
+void SerialFOTBuilder::startScriptPostSub()
+{
+}
+
+void SerialFOTBuilder::endScriptPostSub()
+{
+}
+
+void SerialFOTBuilder::startScriptMidSup()
+{
+}
+
+void SerialFOTBuilder::endScriptMidSup()
+{
+}
+
+void SerialFOTBuilder::startScriptMidSub()
+{
+}
+
+void SerialFOTBuilder::endScriptMidSub()
+{
+}
+
+void SerialFOTBuilder::startMarkSerial()
+{
+  start();
+}
+
+void SerialFOTBuilder::endMarkSerial()
+{
+  end();
+}
+
+void SerialFOTBuilder::startMarkOver()
+{
+}
+
+void SerialFOTBuilder::endMarkOver()
+{
+}
+
+void SerialFOTBuilder::startMarkUnder()
+{
+}
+
+void SerialFOTBuilder::endMarkUnder()
+{
+}
+
+void SerialFOTBuilder::startFenceSerial()
+{
+  start();
+}
+
+void SerialFOTBuilder::endFenceSerial()
+{
+  end();
+}
+
+void SerialFOTBuilder::startFenceOpen()
+{
+}
+
+void SerialFOTBuilder::endFenceOpen()
+{
+}
+
+void SerialFOTBuilder::startFenceClose()
+{
+}
+
+void SerialFOTBuilder::endFenceClose()
+{
+}
+
+void SerialFOTBuilder::startRadicalSerial()
+{
+  start();
+}
+
+void SerialFOTBuilder::endRadicalSerial()
+{
+  end();
+}
+
+void SerialFOTBuilder::startRadicalDegree()
+{
+}
+
+void SerialFOTBuilder::endRadicalDegree()
+{
+}
+
+void SerialFOTBuilder::startMathOperatorSerial()
+{
+  start();
+}
+
+void SerialFOTBuilder::endMathOperatorSerial()
+{
+  end();
+}
+
+void SerialFOTBuilder::startMathOperatorOperator()
+{
+}
+
+void SerialFOTBuilder::endMathOperatorOperator()
+{
+}
+
+void SerialFOTBuilder::startMathOperatorLowerLimit()
+{
+}
+
+void SerialFOTBuilder::endMathOperatorLowerLimit()
+{
+}
+
+void SerialFOTBuilder::startMathOperatorUpperLimit()
+{
+}
+
+void SerialFOTBuilder::endMathOperatorUpperLimit()
+{
+}
+
+void SerialFOTBuilder::startTablePart(const FOTBuilder::TablePartNIC &nic,
+                                     FOTBuilder *&header, FOTBuilder *&footer)
+{
+  save_.insert(new SaveFOTBuilder);
+  footer = save_.head();
+  save_.insert(new SaveFOTBuilder);
+  header = save_.head();
+  startTablePartSerial(nic);
+}
+
+void SerialFOTBuilder::endTablePart()
+{
+  Owner<SaveFOTBuilder> header(save_.get());
+  startTablePartHeader();
+  header->emit(*this);
+  endTablePartHeader();
+  Owner<SaveFOTBuilder> footer(save_.get());
+  startTablePartFooter();
+  footer->emit(*this);
+  endTablePartFooter();
+  endTablePartSerial();
+}
+
+void SerialFOTBuilder::startTablePartSerial(const TablePartNIC &)
+{
+  start();
+}
+
+void SerialFOTBuilder::endTablePartSerial()
+{
+  end();
+}
+
+void SerialFOTBuilder::startTablePartHeader()
+{
+}
+
+void SerialFOTBuilder::endTablePartHeader()
+{
+}
+
+void SerialFOTBuilder::startTablePartFooter()
+{
+}
+
+void SerialFOTBuilder::endTablePartFooter()
+{
+}
+
+void SerialFOTBuilder::startMultiMode(const MultiMode *principalMode,
+                                     const Vector<MultiMode> &namedModes,
+                                     Vector<FOTBuilder *> &namedPorts)
+{
+  for (size_t i = namedModes.size(); i > 0; i--) {
+    save_.insert(new SaveFOTBuilder);
+    namedPorts[i - 1] = save_.head();
+  }
+  multiModeStack_.push_back(namedModes);
+  startMultiModeSerial(principalMode);
+}
+
+void SerialFOTBuilder::endMultiMode()
+{
+  const Vector<MultiMode> &namedModes = multiModeStack_.back();
+  for (size_t i = 0; i < namedModes.size(); i++) {
+    Owner<SaveFOTBuilder> mode(save_.get());
+    startMultiModeMode(namedModes[i]);
+    mode->emit(*this);
+    endMultiModeMode();
+  }
+  endMultiModeSerial();
+  multiModeStack_.resize(multiModeStack_.size() - 1);
+}
+
+void SerialFOTBuilder::startMultiModeSerial(const MultiMode *)
+{
+  start();
+}
+
+void SerialFOTBuilder::endMultiModeSerial()
+{
+  end();
+}
+
+void SerialFOTBuilder::startMultiModeMode(const MultiMode &)
+{
+}
+
+void SerialFOTBuilder::endMultiModeMode()
+{
+}
+
+void SerialFOTBuilder::startExtension(const CompoundExtensionFlowObj &flowObj,
+                                     const NodePtr &nd,
+                                     Vector<FOTBuilder *> &ports)
+{
+  for (size_t i = ports.size(); i > 0; i--) {
+    save_.insert(new SaveFOTBuilder);
+    ports[i - 1] = save_.head();
+  }
+  startExtensionSerial(flowObj, nd);
+}
+
+void SerialFOTBuilder::endExtension(const CompoundExtensionFlowObj &flowObj)
+{
+  Vector<StringC> portNames;
+  flowObj.portNames(portNames);
+  for (size_t i = 0; i < portNames.size(); i++) {
+    Owner<SaveFOTBuilder> stream(save_.get());
+    startExtensionStream(portNames[i]);
+    stream->emit(*this);
+    endExtensionStream(portNames[i]);
+  }
+  endExtensionSerial(flowObj);
+}
+
+void SerialFOTBuilder::startExtensionSerial(const CompoundExtensionFlowObj &, const NodePtr &)
+{
+  start();
+}
+
+void SerialFOTBuilder::endExtensionSerial(const CompoundExtensionFlowObj &)
+{
+  end();
+}
+
+void SerialFOTBuilder::startExtensionStream(const StringC &)
+{
+}
+
+void SerialFOTBuilder::endExtensionStream(const StringC &)
+{
+}
+
+FOTBuilder::ExtensionFlowObj::~ExtensionFlowObj()
+{
+}
+
+FOTBuilder::CompoundExtensionFlowObj *
+FOTBuilder::ExtensionFlowObj::asCompoundExtensionFlowObj()
+{
+  return 0;
+}
+
+const FOTBuilder::CompoundExtensionFlowObj *
+FOTBuilder::ExtensionFlowObj::asCompoundExtensionFlowObj() const
+{
+  return 0;
+}
+
+bool FOTBuilder::ExtensionFlowObj::hasNIC(const StringC &) const
+{
+  return 0;
+}
+
+void FOTBuilder::ExtensionFlowObj::setNIC(const StringC &, const Value &)
+{
+  CANNOT_HAPPEN();
+}
+
+FOTBuilder::CompoundExtensionFlowObj *
+FOTBuilder::CompoundExtensionFlowObj::asCompoundExtensionFlowObj()
+{
+  return this;
+}
+
+const FOTBuilder::CompoundExtensionFlowObj *
+FOTBuilder::CompoundExtensionFlowObj::asCompoundExtensionFlowObj() const
+{
+  return this;
+}
+
+bool FOTBuilder::CompoundExtensionFlowObj::hasPrincipalPort() const
+{
+  return 1;
+}
+void FOTBuilder::CompoundExtensionFlowObj::portNames(Vector<StringC> &) const
+{
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
diff --git a/style/FOTBuilder.h b/style/FOTBuilder.h
new file mode 100644 (file)
index 0000000..e4a7c20
--- /dev/null
@@ -0,0 +1,1404 @@
+// Copyright (c) 1996, 1997 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef FOTBuilder_INCLUDED
+#define FOTBuilder_INCLUDED 1
+
+#include "types.h"
+#include "StringC.h"
+#include "Boolean.h"
+#include "Node.h"
+#include "Link.h"
+#include "IList.h"
+#include "Vector.h"
+#include "Resource.h"
+#include "Ptr.h"
+#include "Owner.h"
+#include <stddef.h>
+#include <string.h>
+#include "dsssl_ns.h"
+
+// This is a work around for a bug in Sun C++ 4.1.
+// The class local typedef of PublicId will cause it to reject a
+// subsequent declaration of the class PublicId, but it's happy
+// if it sees the class first.
+#ifdef __SUNPRO_CC
+#include "ExternalId.h"
+#endif
+
+#ifdef SP_USE_DLL
+#ifdef BUILD_LIBSTYLE
+#define STYLE_API SP_DLLEXPORT
+#else
+#define STYLE_API SP_DLLIMPORT
+#endif
+#else /* not SP_USE_DLL */
+#define STYLE_API /* as nothing */
+#endif /* not SP_USE_DLL */
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class SaveFOTBuilder;
+
+class STYLE_API FOTBuilder {
+public:
+  enum Symbol {
+    symbolFalse,
+    symbolTrue,
+    symbolNotApplicable,
+    // These are guaranteed to be in increasing order of weight,
+    // and expansion.
+    symbolUltraCondensed,
+    symbolExtraCondensed,
+    symbolCondensed,
+    symbolSemiCondensed,
+    symbolUltraLight,
+    symbolExtraLight,
+    symbolLight,
+    symbolSemiLight,
+    symbolMedium,
+    symbolSemiExpanded,
+    symbolExpanded,
+    symbolExtraExpanded,
+    symbolUltraExpanded,
+    symbolSemiBold,
+    symbolBold,
+    symbolExtraBold,
+    symbolUltraBold,
+    symbolUpright,
+    symbolOblique,
+    symbolBackSlantedOblique,
+    symbolItalic,
+    symbolBackSlantedItalic,
+    symbolStart,
+    symbolEnd,
+    symbolCenter,
+    symbolJustify,
+    symbolSpreadInside,
+    symbolSpreadOutside,
+    symbolPageInside,
+    symbolPageOutside,
+    symbolWrap,
+    symbolAsis,
+    symbolAsisWrap,
+    symbolAsisTruncate,
+    symbolNone,
+    symbolBefore,
+    symbolThrough,
+    symbolAfter,
+    symbolTopToBottom,
+    symbolLeftToRight,
+    symbolBottomToTop,
+    symbolRightToLeft,
+    symbolInside,
+    symbolOutside,
+    symbolHorizontal,
+    symbolVertical,
+    symbolEscapement,
+    symbolLineProgression,
+    symbolMath,
+    symbolOrdinary,
+    symbolOperator,
+    symbolBinary,
+    symbolRelation,
+    symbolOpening,
+    symbolClosing,
+    symbolPunctuation,
+    symbolInner,
+    symbolSpace,
+    symbolPage,
+    symbolPageRegion,
+    symbolColumnSet,
+    symbolColumn,
+    symbolMax,
+    symbolMaxUniform,
+    symbolMiter,
+    symbolRound,
+    symbolBevel,
+    symbolButt,
+    symbolSquare,
+    symbolLoose,
+    symbolNormal,
+    symbolKern,
+    symbolTight,
+    symbolTouch,
+    symbolPreserve,
+    symbolCollapse,
+    symbolIgnore,
+    symbolRelative,
+    symbolDisplay,
+    symbolInline,
+    symbolBorder,
+    symbolBackground,
+    symbolBoth,
+    symbolBase,
+    symbolFont,
+    symbolTop,
+    symbolBottom,
+    symbolSpread,
+    symbolSolid,
+    symbolOutline,
+    symbolWith,
+    symbolAgainst,
+    symbolForce,
+    symbolIndependent,
+    symbolPile,
+    symbolSupOut,
+    symbolSubOut,
+    symbolLeadEdge,
+    symbolTrailEdge,
+    symbolExplicit,
+    symbolRowMajor,
+    symbolColumnMajor
+  };
+  enum { nSymbols = symbolColumnMajor + 1 };
+  typedef const char *PublicId;
+  struct GlyphId {
+    GlyphId() : publicId(0), suffix(0) { }
+    GlyphId(const char *s, unsigned long n = 0) : publicId(s), suffix(n) { }
+    PublicId publicId;
+    // If suffix is non-zero, then add a double-colon plus
+    // the suffix in decimal onto publicId to get the complete
+    // public identifier of the glyph id.
+    unsigned long suffix;
+  };
+  struct GlyphSubstTable : public Resource {
+    unsigned uniqueId;
+    Vector<GlyphId> pairs;
+    GlyphId subst(const GlyphId &) const;
+  };
+  // SP_LETTER2('U', 'K')
+#define SP_LETTER2(c1, c2) (((c1) << 8) | (c2))
+  typedef unsigned Letter2;
+  typedef long Length;
+  struct LengthSpec {
+    LengthSpec(long len = 0) : length(len), displaySizeFactor(0.0) { }
+    long length;
+    double displaySizeFactor;
+    operator bool() const { return length != 0 || displaySizeFactor != 0.0; }
+  };
+  struct TableLengthSpec : LengthSpec {
+    TableLengthSpec() : tableUnitFactor(0.0) { }
+    double tableUnitFactor;
+  };
+  struct OptLengthSpec {
+    OptLengthSpec() : hasLength(0) { }
+    bool hasLength;
+    LengthSpec length;
+  };
+  struct DisplaySpace {
+    DisplaySpace() : priority(0), conditional(1), force(0) { }
+    LengthSpec nominal;
+    LengthSpec min;
+    LengthSpec max;
+    long priority;
+    bool conditional;
+    bool force;
+  };
+  struct InlineSpace {
+    LengthSpec nominal;
+    LengthSpec min;
+    LengthSpec max;
+  };
+  struct OptInlineSpace {
+    OptInlineSpace() : hasSpace(0) { }
+    bool hasSpace;
+    InlineSpace space;
+  };
+  // non-inherited characteristics for all displayed flow objects
+  struct DisplayNIC {
+    DisplayNIC();
+    DisplaySpace spaceBefore;
+    DisplaySpace spaceAfter;
+    Symbol positionPreference;
+    Symbol keep;
+    Symbol breakBefore;
+    Symbol breakAfter;
+    bool keepWithPrevious;
+    bool keepWithNext;
+    bool mayViolateKeepBefore;
+    bool mayViolateKeepAfter;
+  };
+  struct InlineNIC {
+    InlineNIC();
+    long breakBeforePriority;
+    long breakAfterPriority;
+  };
+  struct DisplayGroupNIC : DisplayNIC {
+    DisplayGroupNIC();
+    bool hasCoalesceId;
+    StringC coalesceId;
+  };
+  struct ExternalGraphicNIC : DisplayNIC, InlineNIC {
+    ExternalGraphicNIC();
+    bool isDisplay;
+    Symbol scaleType; // symbolFalse if not a symbol
+    double scale[2]; // if scaleType == symbolFalse
+    StringC entitySystemId;
+    StringC notationSystemId;
+    bool hasMaxWidth;
+    LengthSpec maxWidth;
+    bool hasMaxHeight;
+    LengthSpec maxHeight;
+    // These apply only if !isDisplay
+    // symbolFalse if no escapementDirection
+    Symbol escapementDirection;
+    LengthSpec positionPointX;
+    LengthSpec positionPointY;
+  };
+  struct BoxNIC : DisplayNIC, InlineNIC {
+    BoxNIC();
+    bool isDisplay;
+  };
+  struct RuleNIC : DisplayNIC, InlineNIC {
+    RuleNIC();
+    Symbol orientation;
+    bool hasLength;
+    LengthSpec length;
+  };
+  struct LeaderNIC : InlineNIC {
+    LeaderNIC();
+    bool hasLength;
+    LengthSpec length;
+  };
+  // A paragraph has the same non-inherited characteristics
+  // as a display-group.
+  typedef DisplayNIC ParagraphNIC;
+  struct CharacterNIC {
+    CharacterNIC();
+    enum {
+      cIsDropAfterLineBreak,
+      cIsDropUnlessBeforeLineBreak,
+      cIsPunct,
+      cIsInputWhitespace,
+      cIsInputTab,
+      cIsRecordEnd,
+      cIsSpace,
+      cChar,
+      cGlyphId,
+      cScript,
+      cMathClass,
+      cMathFontPosture,
+      cBreakBeforePriority,
+      cBreakAfterPriority
+    };
+    bool valid;
+    unsigned specifiedC;
+    Char ch;
+    GlyphId glyphId;
+    long breakBeforePriority;
+    long breakAfterPriority;
+    Symbol mathClass;
+    Symbol mathFontPosture;
+    PublicId script;
+    bool isDropAfterLineBreak;
+    bool isDropUnlessBeforeLineBreak;
+    bool isPunct;
+    bool isInputWhitespace;
+    bool isInputTab;
+    bool isRecordEnd;
+    bool isSpace;
+    // This doesn't have a flag in specifiedC,
+    // because it has a fixed default.
+    double stretchFactor;
+  };
+  typedef InlineNIC LineFieldNIC;
+  struct TableNIC : public DisplayNIC {
+    TableNIC();
+    enum WidthType {
+      widthFull,
+      widthMinimum,
+      widthExplicit
+    };
+    WidthType widthType;
+    LengthSpec width;
+  };
+  typedef DisplayNIC TablePartNIC;
+  struct TableColumnNIC {
+    TableColumnNIC();
+    unsigned columnIndex;  // zero-based
+    unsigned nColumnsSpanned;
+    bool hasWidth;
+    TableLengthSpec width;
+  };
+  struct TableCellNIC {
+    TableCellNIC();
+    // If true, this isn't a real table cell.
+    // Rather it's one that can be used to fill in cells missing in this row.
+    bool missing;
+    unsigned columnIndex;  // zero-based
+    unsigned nColumnsSpanned;
+    unsigned nRowsSpanned;
+  };
+  struct DeviceRGBColor {
+    unsigned char red;
+    unsigned char green;
+    unsigned char blue;
+  };
+  struct MultiMode {
+    MultiMode();
+    bool hasDesc;
+    StringC name;
+    StringC desc;
+  };
+  struct Address {
+    enum Type {
+      // An address of #f
+      none,
+      // An address that was resolved by the front-end to a node
+      // Only the node member is valid.
+      resolvedNode,
+      // node contains current node, params[0] is string.
+      idref,
+      entity,
+      sgmlDocument,
+      hytimeLinkend,
+      tei,
+      html
+    };
+    Type type;
+    // Gives current node or resolved node.
+    NodePtr node;
+    StringC params[3];
+  };
+  virtual SaveFOTBuilder *asSaveFOTBuilder();
+  virtual ~FOTBuilder();
+  // Default for compound flow objects
+  virtual void start();
+  virtual void end();
+  // Default for atomic flow objects: defaults to start(); end();
+  virtual void atomic();
+  // Atomic flow objects
+  virtual void characters(const Char *, size_t);
+  // Like characters(), but data comes from charChunk() on a NodePtr.
+  // If you are building a tree, then the NodePtr can be saved instead
+  // of the data.  The default implementation calls characters().
+  virtual void charactersFromNode(const NodePtr &, const Char *, size_t);
+  virtual void character(const CharacterNIC &);
+  virtual void paragraphBreak(const ParagraphNIC &);
+  virtual void externalGraphic(const ExternalGraphicNIC &);
+  virtual void rule(const RuleNIC &);
+  virtual void alignmentPoint();
+  // For flow object class public id
+  // "UNREGISTERED::James Clark//Flow Object Class::formatting-instruction"
+  virtual void formattingInstruction(const StringC &);
+  // Non-atomic flow objects
+  virtual void startSequence();
+  virtual void endSequence();
+  virtual void startLineField(const LineFieldNIC &);
+  virtual void endLineField();
+  virtual void startParagraph(const ParagraphNIC &);
+  virtual void endParagraph();
+  virtual void startDisplayGroup(const DisplayGroupNIC &);
+  virtual void endDisplayGroup();
+  virtual void startScroll();
+  virtual void endScroll();
+  virtual void startLink(const Address &);
+  virtual void endLink();
+  virtual void startMarginalia();
+  virtual void endMarginalia();
+  virtual void startMultiMode(const MultiMode *principalPort,  // null if no principal port
+                             const Vector<MultiMode> &namedPorts,
+                             Vector<FOTBuilder *> &);
+  virtual void endMultiMode();
+  virtual void startScore(Char);
+  virtual void startScore(const LengthSpec &);
+  virtual void startScore(Symbol);
+  virtual void endScore();
+  virtual void startLeader(const LeaderNIC &);
+  virtual void endLeader();
+  virtual void startSideline();
+  virtual void endSideline();
+  virtual void startBox(const BoxNIC &);
+  virtual void endBox();
+  // Tables
+  virtual void startTable(const TableNIC &);
+  virtual void endTable();
+  // A call for each border is made immediately
+  // after startTable(), each preceded by any appropriate set*() calls.
+  virtual void tableBeforeRowBorder();
+  virtual void tableAfterRowBorder();
+  virtual void tableBeforeColumnBorder();
+  virtual void tableAfterColumnBorder();
+  virtual void startTablePart(const TablePartNIC &, FOTBuilder *&header, FOTBuilder *&footer);
+  virtual void endTablePart();
+  virtual void tableColumn(const TableColumnNIC &);
+  virtual void startTableRow();
+  virtual void endTableRow();
+  virtual void startTableCell(const TableCellNIC &);
+  virtual void endTableCell();
+  virtual void tableCellBeforeRowBorder();
+  virtual void tableCellAfterRowBorder();
+  virtual void tableCellBeforeColumnBorder();
+  virtual void tableCellAfterColumnBorder();
+  // Implementation must set numerator and denominator
+  // must be set to non-null values.
+  virtual void startMathSequence();
+  virtual void endMathSequence();
+  virtual void startFraction(FOTBuilder *&numerator, FOTBuilder *&denominator);
+  // startFraction is followed by call to fractionBar with set...() calls
+  // intervening
+  virtual void fractionBar();
+  virtual void endFraction();
+  virtual void startUnmath();
+  virtual void endUnmath();
+  virtual void startSuperscript();
+  virtual void endSuperscript();
+  virtual void startSubscript();
+  virtual void endSubscript();
+  virtual void startScript(FOTBuilder *&preSup,
+                           FOTBuilder *&preSub,
+                           FOTBuilder *&postSup,
+                           FOTBuilder *&postSub,
+                           FOTBuilder *&midSup,
+                           FOTBuilder *&midSub);
+  virtual void endScript();
+  virtual void startMark(FOTBuilder *&overMark, FOTBuilder *&underMark);
+  virtual void endMark();
+  virtual void startFence(FOTBuilder *&open, FOTBuilder *&close);
+  virtual void endFence();
+  virtual void startRadical(FOTBuilder *&degree);
+  // startRadical is followed by one of the following
+  virtual void radicalRadical(const CharacterNIC &);
+  virtual void radicalRadicalDefaulted();
+  virtual void endRadical();
+  virtual void startMathOperator(FOTBuilder *&oper,
+                                 FOTBuilder *&lowerLimit,
+                                 FOTBuilder *&upperLimit);
+  virtual void endMathOperator();
+  
+  struct GridNIC {
+    GridNIC();
+    unsigned nColumns;
+    unsigned nRows;
+  };
+  virtual void startGrid(const GridNIC &);
+  virtual void endGrid();
+
+  struct GridCellNIC {
+    GridCellNIC();
+    unsigned columnNumber;
+    unsigned rowNumber;
+  };
+  virtual void startGridCell(const GridCellNIC &);
+  virtual void endGridCell();
+
+  // Simple page
+  // Headers and footers are treated like a separate port.
+  // There are 24 different parts to the headers and footers
+  // numbered 0 to 027; the numbers are computed by or'ing the
+  // following flags.
+  enum HF {
+    // first page or other page
+    firstHF = 01,
+    otherHF = 0,
+    // front page or back page
+    frontHF = 02,
+    backHF = 0,
+    // header or footer
+    headerHF = 04,
+    footerHF = 0,
+    // left, center or right part of header
+    leftHF = 0,
+    centerHF = 010,
+    rightHF = 020,
+    // number of different HF calls
+    nHF = 030
+  };
+  virtual void startSimplePageSequence(FOTBuilder* headerFooter[nHF]);
+  virtual void endSimplePageSequenceHeaderFooter();
+  virtual void endSimplePageSequence();
+
+  // page-number sosofo
+  virtual void pageNumber();
+  // Inherited characteristics
+  // Set the value of the characteristic for the next flow object.
+  // Inherited characteristics that are not explicitly set have
+  // the same value as the parent flow object.
+  virtual void setFontSize(Length);
+  virtual void setFontFamilyName(const StringC &);
+  virtual void setFontWeight(Symbol);
+  virtual void setFontPosture(Symbol);
+  virtual void setStartIndent(const LengthSpec &);
+  virtual void setEndIndent(const LengthSpec &);
+  virtual void setFirstLineStartIndent(const LengthSpec &);
+  virtual void setLastLineEndIndent(const LengthSpec &);
+  virtual void setLineSpacing(const LengthSpec &);
+  virtual void setFieldWidth(const LengthSpec &);
+  virtual void setMarginaliaSep(const LengthSpec &);
+  virtual void setLines(Symbol);
+  virtual void setQuadding(Symbol);
+  virtual void setDisplayAlignment(Symbol);
+  virtual void setFieldAlign(Symbol);
+  virtual void setColor(const DeviceRGBColor &);
+  virtual void setBackgroundColor(); // background of #f
+  virtual void setBackgroundColor(const DeviceRGBColor &);
+  virtual void setBorderPresent(bool);
+  virtual void setLineThickness(Length);
+  virtual void setCellBeforeRowMargin(Length);
+  virtual void setCellAfterRowMargin(Length);
+  virtual void setCellBeforeColumnMargin(Length);
+  virtual void setCellAfterColumnMargin(Length);
+  virtual void setLineSep(Length);
+  virtual void setBoxSizeBefore(Length);
+  virtual void setBoxSizeAfter(Length);
+  virtual void setPositionPointShift(const LengthSpec &);
+  virtual void setStartMargin(const LengthSpec &);
+  virtual void setEndMargin(const LengthSpec &);
+  virtual void setSidelineSep(const LengthSpec &);
+  virtual void setAsisWrapIndent(const LengthSpec &);
+  virtual void setLineNumberSep(const LengthSpec &);
+  virtual void setLastLineJustifyLimit(const LengthSpec &);
+  virtual void setJustifyGlyphSpaceMaxAdd(const LengthSpec &);
+  virtual void setJustifyGlyphSpaceMaxRemove(const LengthSpec &);
+  virtual void setTableCornerRadius(const LengthSpec &);
+  virtual void setBoxCornerRadius(const LengthSpec &);
+  virtual void setMinPreLineSpacing(const OptLengthSpec &);
+  virtual void setMinPostLineSpacing(const OptLengthSpec &);
+  virtual void setMinLeading(const OptLengthSpec &);
+  virtual void setInhibitLineBreaks(bool);
+  virtual void setHyphenate(bool);
+  virtual void setKern(bool);
+  virtual void setLigature(bool);
+  virtual void setScoreSpaces(bool);
+  virtual void setFloatOutMarginalia(bool);
+  virtual void setFloatOutSidelines(bool);
+  virtual void setFloatOutLineNumbers(bool);
+  virtual void setCellBackground(bool);
+  virtual void setSpanWeak(bool);
+  virtual void setIgnoreRecordEnd(bool);
+  virtual void setNumberedLines(bool);
+  virtual void setHangingPunct(bool);
+  virtual void setBoxOpenEnd(bool);
+  virtual void setTruncateLeader(bool);
+  virtual void setAlignLeader(bool);
+  virtual void setTablePartOmitMiddleHeader(bool);
+  virtual void setTablePartOmitMiddleFooter(bool);
+  virtual void setBorderOmitAtBreak(bool);
+  virtual void setPrincipalModeSimultaneous(bool);
+  virtual void setMarginaliaKeepWithPrevious(bool);
+  virtual void setGridEquidistantRows(bool);
+  virtual void setGridEquidistantColumns(bool);
+  virtual void setLineJoin(Symbol);
+  virtual void setLineCap(Symbol);
+  virtual void setLineNumberSide(Symbol);
+  virtual void setKernMode(Symbol);
+  virtual void setInputWhitespaceTreatment(Symbol);
+  virtual void setFillingDirection(Symbol);
+  virtual void setWritingMode(Symbol);
+  virtual void setLastLineQuadding(Symbol);
+  virtual void setMathDisplayMode(Symbol);
+  virtual void setScriptPreAlign(Symbol);
+  virtual void setScriptPostAlign(Symbol);
+  virtual void setScriptMidSupAlign(Symbol);
+  virtual void setScriptMidSubAlign(Symbol);
+  virtual void setNumeratorAlign(Symbol);
+  virtual void setDenominatorAlign(Symbol);
+  virtual void setGridPositionCellType(Symbol);
+  virtual void setGridColumnAlignment(Symbol);
+  virtual void setGridRowAlignment(Symbol);
+  virtual void setBoxType(Symbol);
+  virtual void setGlyphAlignmentMode(Symbol);
+  virtual void setBoxBorderAlignment(Symbol);
+  virtual void setCellRowAlignment(Symbol);
+  virtual void setBorderAlignment(Symbol);
+  virtual void setSidelineSide(Symbol);
+  virtual void setHyphenationKeep(Symbol);
+  virtual void setFontStructure(Symbol);
+  virtual void setFontProportionateWidth(Symbol);
+  virtual void setCellCrossed(Symbol);
+  virtual void setMarginaliaSide(Symbol);
+  virtual void setLayer(long);
+  virtual void setBackgroundLayer(long);
+  virtual void setBorderPriority(long);
+  virtual void setLineRepeat(long);
+  virtual void setSpan(long);
+  virtual void setMinLeaderRepeat(long);
+  virtual void setHyphenationRemainCharCount(long);
+  virtual void setHyphenationPushCharCount(long);
+  virtual void setWidowCount(long);
+  virtual void setOrphanCount(long);
+  // 0 means #f
+  virtual void setExpandTabs(long);
+  virtual void setHyphenationLadderCount(long);
+  // public id or #f
+  virtual void setBackgroundTile(PublicId);
+  virtual void setLineBreakingMethod(PublicId);
+  virtual void setLineCompositionMethod(PublicId);
+  virtual void setImplicitBidiMethod(PublicId);
+  virtual void setGlyphSubstMethod(PublicId);
+  virtual void setGlyphReorderMethod(PublicId);
+  virtual void setHyphenationMethod(PublicId);
+  virtual void setTableAutoWidthMethod(PublicId);
+  virtual void setFontName(PublicId);
+  // Two-letter code
+  virtual void setLanguage(Letter2);
+  virtual void setCountry(Letter2);
+  virtual void setEscapementSpaceBefore(const InlineSpace &);
+  virtual void setEscapementSpaceAfter(const InlineSpace &);
+  virtual void setInlineSpaceSpace(const OptInlineSpace &);
+  // For simple page sequence
+  virtual void setPageWidth(Length);
+  virtual void setPageHeight(Length);
+  virtual void setLeftMargin(Length);
+  virtual void setRightMargin(Length);
+  virtual void setTopMargin(Length);
+  virtual void setBottomMargin(Length);
+  virtual void setHeaderMargin(Length);
+  virtual void setFooterMargin(Length);
+  // Others
+  virtual void setGlyphSubstTable(const Vector<ConstPtr<GlyphSubstTable> > &);
+  // Backlinks
+  // processingMode is empty for initial processing mode.
+  virtual void startNode(const NodePtr &, const StringC &processingMode);
+  virtual void endNode();
+  virtual void currentNodePageNumber(const NodePtr &);
+
+  class CompoundExtensionFlowObj;
+  class STYLE_API ExtensionFlowObj {
+  public:
+    virtual ~ExtensionFlowObj();
+    class Value {
+    public:
+      virtual bool convertString(StringC &) const = 0;
+      virtual bool convertStringPairList(Vector<StringC> &) const = 0;
+      virtual bool convertStringList(Vector<StringC> &) const = 0;
+      virtual bool convertBoolean(bool &) const = 0;
+    };
+    virtual CompoundExtensionFlowObj *asCompoundExtensionFlowObj();
+    virtual const CompoundExtensionFlowObj *asCompoundExtensionFlowObj() const;
+    virtual bool hasNIC(const StringC &) const;
+    virtual void setNIC(const StringC &, const Value &);
+    virtual ExtensionFlowObj *copy() const = 0;
+  };
+  class STYLE_API CompoundExtensionFlowObj : public ExtensionFlowObj {
+  public:
+    CompoundExtensionFlowObj *asCompoundExtensionFlowObj();
+    const CompoundExtensionFlowObj *asCompoundExtensionFlowObj() const;
+    virtual bool hasPrincipalPort() const;
+    virtual void portNames(Vector<StringC> &) const;
+  };
+
+  // extension inherited characteristics
+
+  virtual void extensionSet(void (FOTBuilder::*)(bool), bool);
+  virtual void extensionSet(void (FOTBuilder::*)(const StringC &), const StringC &);
+  virtual void extensionSet(void (FOTBuilder::*)(long), long);
+  
+  // extension flow objects
+  virtual void extension(const ExtensionFlowObj &, const NodePtr &);
+  virtual void startExtension(const CompoundExtensionFlowObj &,
+                             const NodePtr &,
+                             Vector<FOTBuilder *> &ports);
+  virtual void endExtension(const CompoundExtensionFlowObj &);
+
+  struct Extension {
+    const char *pubid;
+    void (FOTBuilder::*boolSetter)(bool);
+    void (FOTBuilder::*stringSetter)(const StringC &);
+    void (FOTBuilder::*integerSetter)(long);
+    void (FOTBuilder::*lengthSetter)(Length);
+    const ExtensionFlowObj *flowObj;
+  };
+
+  static const char *symbolName(Symbol);
+};
+
+class STYLE_API SaveFOTBuilder : public Link, public FOTBuilder {
+public:
+  SaveFOTBuilder();
+  SaveFOTBuilder(const NodePtr &, const StringC &processingMode);
+ ~SaveFOTBuilder();
+  SaveFOTBuilder *asSaveFOTBuilder();
+  void emit(FOTBuilder &);
+  void characters(const Char *, size_t);
+  void charactersFromNode(const NodePtr &, const Char *, size_t);
+  void character(const CharacterNIC &);
+  void paragraphBreak(const ParagraphNIC &);
+  void externalGraphic(const ExternalGraphicNIC &);
+  void rule(const RuleNIC &);
+  void alignmentPoint();
+  void formattingInstruction(const StringC &);
+  void startSequence();
+  void endSequence();
+  void startLineField(const LineFieldNIC &);
+  void endLineField();
+  void startParagraph(const ParagraphNIC &);
+  void endParagraph();
+  void startDisplayGroup(const DisplayGroupNIC &);
+  void endDisplayGroup();
+  void startScroll();
+  void endScroll();
+  void startLink(const Address &);
+  void endLink();
+  void startMultiMode(const MultiMode *principalPort,
+                      const Vector<MultiMode> &namedPorts,
+                     Vector<FOTBuilder *> &);
+  void endMultiMode();
+  void startMarginalia();
+  void endMarginalia();
+  void startScore(Char);
+  void startScore(const LengthSpec &);
+  void startScore(Symbol);
+  void endScore();
+  void startLeader(const LeaderNIC &);
+  void endLeader();
+  void startSideline();
+  void endSideline();
+  void startBox(const BoxNIC &);
+  void endBox();
+  void startSimplePageSequence(FOTBuilder* headerFooter[nHF]);
+  void endSimplePageSequenceHeaderFooter();
+  void endSimplePageSequence();
+  // page-number sosofo
+  void pageNumber();
+  // math
+  void startMathSequence();
+  void endMathSequence();
+  void startFraction(FOTBuilder *&numerator, FOTBuilder *&denominator);
+  void fractionBar();
+  void endFraction();
+  void startUnmath();
+  void endUnmath();
+  void startSuperscript();
+  void endSuperscript();
+  void startSubscript();
+  void endSubscript();
+  void startScript(FOTBuilder *&preSup,
+                   FOTBuilder *&preSub,
+                   FOTBuilder *&postSup,
+                   FOTBuilder *&postSub,
+                   FOTBuilder *&midSup,
+                   FOTBuilder *&midSub);
+  void endScript();
+  void startMark(FOTBuilder *&overMark, FOTBuilder *&underMark);
+  void endMark();
+  void startFence(FOTBuilder *&open, FOTBuilder *&close);
+  void endFence();
+  void startRadical(FOTBuilder *&degree);
+  void endRadical();
+  void radicalRadical(const CharacterNIC &);
+  void radicalRadicalDefaulted();
+  void startMathOperator(FOTBuilder *&oper,
+                         FOTBuilder *&lowerLimit,
+                         FOTBuilder *&upperLimit);
+  void endMathOperator();
+  void startGrid(const GridNIC &);
+  void endGrid();
+  void startGridCell(const GridCellNIC &);
+  void endGridCell();
+
+  // Tables
+  void startTable(const TableNIC &);
+  void endTable();
+  void tableBeforeRowBorder();
+  void tableAfterRowBorder();
+  void tableBeforeColumnBorder();
+  void tableAfterColumnBorder();
+  void startTablePart(const TablePartNIC &, FOTBuilder *&header, FOTBuilder *&footer);
+  void endTablePart();
+  void tableColumn(const TableColumnNIC &);
+  void startTableRow();
+  void endTableRow();
+  void startTableCell(const TableCellNIC &);
+  void endTableCell();
+  void tableCellBeforeRowBorder();
+  void tableCellAfterRowBorder();
+  void tableCellBeforeColumnBorder();
+  void tableCellAfterColumnBorder();
+  // Inherited characteristics
+  void setFontSize(Length);
+  void setFontFamilyName(const StringC &);
+  void setFontWeight(Symbol);
+  void setFontPosture(Symbol);
+  void setStartIndent(const LengthSpec &);
+  void setEndIndent(const LengthSpec &);
+  void setFirstLineStartIndent(const LengthSpec &);
+  void setLastLineEndIndent(const LengthSpec &);
+  void setLineSpacing(const LengthSpec &);
+  void setFieldWidth(const LengthSpec &);
+  void setLines(Symbol);
+  void setQuadding(Symbol);
+  void setDisplayAlignment(Symbol);
+  void setFieldAlign(Symbol);
+  void setColor(const DeviceRGBColor &);
+  void setBackgroundColor(const DeviceRGBColor &);
+  void setBackgroundColor();
+  void setPageWidth(Length);
+  void setPageHeight(Length);
+  void setLeftMargin(Length);
+  void setRightMargin(Length);
+  void setTopMargin(Length);
+  void setBottomMargin(Length);
+  void setHeaderMargin(Length);
+  void setFooterMargin(Length);
+  void setBorderPresent(bool);
+  void setLineThickness(Length);
+  void setCellBeforeRowMargin(Length);
+  void setCellAfterRowMargin(Length);
+  void setCellBeforeColumnMargin(Length);
+  void setCellAfterColumnMargin(Length);
+  void setLineSep(Length);
+  void setBoxSizeBefore(Length);
+  void setBoxSizeAfter(Length);
+  void setPositionPointShift(const LengthSpec &);
+  void setStartMargin(const LengthSpec &);
+  void setEndMargin(const LengthSpec &);
+  void setSidelineSep(const LengthSpec &);
+  void setAsisWrapIndent(const LengthSpec &);
+  void setLineNumberSep(const LengthSpec &);
+  void setLastLineJustifyLimit(const LengthSpec &);
+  void setJustifyGlyphSpaceMaxAdd(const LengthSpec &);
+  void setJustifyGlyphSpaceMaxRemove(const LengthSpec &);
+  void setTableCornerRadius(const LengthSpec &);
+  void setBoxCornerRadius(const LengthSpec &);
+  void setMarginaliaSep(const LengthSpec &);
+  void setMinPreLineSpacing(const OptLengthSpec &);
+  void setMinPostLineSpacing(const OptLengthSpec &);
+  void setMinLeading(const OptLengthSpec &);
+  void setInhibitLineBreaks(bool);
+  void setHyphenate(bool);
+  void setKern(bool);
+  void setLigature(bool);
+  void setScoreSpaces(bool);
+  void setFloatOutMarginalia(bool);
+  void setFloatOutSidelines(bool);
+  void setFloatOutLineNumbers(bool);
+  void setCellBackground(bool);
+  void setSpanWeak(bool);
+  void setIgnoreRecordEnd(bool);
+  void setNumberedLines(bool);
+  void setHangingPunct(bool);
+  void setBoxOpenEnd(bool);
+  void setTruncateLeader(bool);
+  void setAlignLeader(bool);
+  void setTablePartOmitMiddleHeader(bool);
+  void setTablePartOmitMiddleFooter(bool);
+  void setBorderOmitAtBreak(bool);
+  void setPrincipalModeSimultaneous(bool);
+  void setMarginaliaKeepWithPrevious(bool);
+  void setGridEquidistantRows(bool);
+  void setGridEquidistantColumns(bool);
+  void setLineJoin(Symbol);
+  void setLineCap(Symbol);
+  void setLineNumberSide(Symbol);
+  void setKernMode(Symbol);
+  void setInputWhitespaceTreatment(Symbol);
+  void setFillingDirection(Symbol);
+  void setWritingMode(Symbol);
+  void setLastLineQuadding(Symbol);
+  void setMathDisplayMode(Symbol);
+  void setScriptPreAlign(Symbol);
+  void setScriptPostAlign(Symbol);
+  void setScriptMidSupAlign(Symbol);
+  void setScriptMidSubAlign(Symbol);
+  void setNumeratorAlign(Symbol);
+  void setDenominatorAlign(Symbol);
+  void setGridPositionCellType(Symbol);
+  void setGridColumnAlignment(Symbol);
+  void setGridRowAlignment(Symbol);
+  void setBoxType(Symbol);
+  void setGlyphAlignmentMode(Symbol);
+  void setBoxBorderAlignment(Symbol);
+  void setCellRowAlignment(Symbol);
+  void setBorderAlignment(Symbol);
+  void setSidelineSide(Symbol);
+  void setHyphenationKeep(Symbol);
+  void setFontStructure(Symbol);
+  void setFontProportionateWidth(Symbol);
+  void setCellCrossed(Symbol);
+  void setMarginaliaSide(Symbol);
+  void setLayer(long);
+  void setBackgroundLayer(long);
+  void setBorderPriority(long);
+  void setLineRepeat(long);
+  void setSpan(long);
+  void setMinLeaderRepeat(long);
+  void setHyphenationRemainCharCount(long);
+  void setHyphenationPushCharCount(long);
+  void setWidowCount(long);
+  void setOrphanCount(long);
+  void setExpandTabs(long);
+  void setHyphenationLadderCount(long);
+  void setBackgroundTile(PublicId);
+  void setLineBreakingMethod(PublicId);
+  void setLineCompositionMethod(PublicId);
+  void setImplicitBidiMethod(PublicId);
+  void setGlyphSubstMethod(PublicId);
+  void setGlyphReorderMethod(PublicId);
+  void setHyphenationMethod(PublicId);
+  void setTableAutoWidthMethod(PublicId);
+  void setFontName(PublicId);
+  void setLanguage(Letter2);
+  void setCountry(Letter2);
+  void setEscapementSpaceBefore(const InlineSpace &);
+  void setEscapementSpaceAfter(const InlineSpace &);
+  void setGlyphSubstTable(const Vector<ConstPtr<GlyphSubstTable> > &);
+  void startNode(const NodePtr &, const StringC &processingMode);
+  void endNode();
+  void currentNodePageNumber(const NodePtr &);
+  void extensionSet(void (FOTBuilder::*)(bool), bool);
+  void extensionSet(void (FOTBuilder::*)(const StringC &), const StringC &);
+  void extensionSet(void (FOTBuilder::*)(long), long);
+  void extension(const ExtensionFlowObj &, const NodePtr &);
+  void startExtension(const CompoundExtensionFlowObj &,
+                     const NodePtr &,
+                     Vector<FOTBuilder *> &ports);
+  void endExtension(const CompoundExtensionFlowObj &);
+
+  struct Call {
+    virtual ~Call();
+    virtual void emit(FOTBuilder &) = 0;
+    Call *next;
+  };
+private:
+  SaveFOTBuilder(const SaveFOTBuilder &); // undefined
+  void operator=(const SaveFOTBuilder &); // undefined
+  struct NoArgCall : Call {
+    typedef void (FOTBuilder::*FuncPtr)();
+    NoArgCall(FuncPtr f) : func(f) { }
+    void emit(FOTBuilder &);
+    FuncPtr func;
+  };
+  struct LongArgCall : Call {
+    typedef void (FOTBuilder::*FuncPtr)(long);
+    LongArgCall(FuncPtr f, long n) : func(f), arg(n) { }
+    void emit(FOTBuilder &);
+    FuncPtr func;
+    long arg;
+  };
+  struct ExtensionLongArgCall : Call {
+    typedef void (FOTBuilder::*FuncPtr)(long);
+    ExtensionLongArgCall(FuncPtr f, long n) : func(f), arg(n) { }
+    void emit(FOTBuilder &);
+    FuncPtr func;
+    long arg;
+  };
+  struct LengthSpecArgCall : Call {
+    typedef void (FOTBuilder::*FuncPtr)(const LengthSpec &);
+    LengthSpecArgCall(FuncPtr f, const LengthSpec &ls) : func(f), arg(ls) { }
+    void emit(FOTBuilder &);
+    FuncPtr func;
+    LengthSpec arg;
+  };
+  struct OptLengthSpecArgCall : Call {
+    typedef void (FOTBuilder::*FuncPtr)(const OptLengthSpec &);
+    OptLengthSpecArgCall(FuncPtr f, const OptLengthSpec &ols) : func(f), arg(ols) { }
+    void emit(FOTBuilder &);
+    FuncPtr func;
+    OptLengthSpec arg;
+  };
+  struct NodePtrArgCall : Call {
+    typedef void (FOTBuilder::*FuncPtr)(const NodePtr &);
+    NodePtrArgCall(FuncPtr f, const NodePtr &nd) : func(f), arg(nd) { }
+    void emit(FOTBuilder &);
+    FuncPtr func;
+    NodePtr arg;
+  };
+  struct StringArgCall : Call {
+    typedef void (FOTBuilder::*FuncPtr)(const StringC &);
+    StringArgCall(FuncPtr f, const StringC &s) : func(f), arg(s) { }
+    void emit(FOTBuilder &);
+    FuncPtr func;
+    StringC arg;
+  };
+  struct ExtensionStringArgCall : Call {
+    typedef void (FOTBuilder::*FuncPtr)(const StringC &);
+    ExtensionStringArgCall(FuncPtr f, const StringC &s) : func(f), arg(s) { }
+    void emit(FOTBuilder &);
+    FuncPtr func;
+    StringC arg;
+  };
+   struct CharArgCall : Call {
+    typedef void (FOTBuilder::*FuncPtr)(Char);
+    CharArgCall(FuncPtr f, Char c) : func(f), arg(c) { }
+    void emit(FOTBuilder &);
+    FuncPtr func;
+    Char arg;
+  };
+  struct BoolArgCall : Call {
+    typedef void (FOTBuilder::*FuncPtr)(bool);
+    BoolArgCall(FuncPtr f, bool b) : func(f), arg(b) { }
+    void emit(FOTBuilder &);
+    FuncPtr func;
+    bool arg;
+  };
+  struct ExtensionBoolArgCall : Call {
+    typedef void (FOTBuilder::*FuncPtr)(bool);
+    ExtensionBoolArgCall(FuncPtr f, bool b) : func(f), arg(b) { }
+    void emit(FOTBuilder &);
+    FuncPtr func;
+    bool arg;
+  };
+  struct SymbolArgCall : Call {
+    typedef void (FOTBuilder::*FuncPtr)(Symbol);
+    SymbolArgCall(FuncPtr f, Symbol sym) : func(f), arg(sym) { }
+    void emit(FOTBuilder &);
+    FuncPtr func;
+    Symbol arg;
+  };
+  struct PublicIdArgCall : Call {
+    typedef void (FOTBuilder::*FuncPtr)(PublicId);
+    PublicIdArgCall(FuncPtr f, PublicId pubid) : func(f), arg(pubid) { }
+    void emit(FOTBuilder &);
+    FuncPtr func;
+    PublicId arg;
+  };
+  struct UnsignedArgCall : Call {
+    typedef void (FOTBuilder::*FuncPtr)(unsigned);
+    UnsignedArgCall(FuncPtr f, unsigned n) : func(f), arg(n) { }
+    void emit(FOTBuilder &);
+    FuncPtr func;
+    unsigned arg;
+  };
+  struct DeviceRGBColorArgCall : Call {
+    typedef void (FOTBuilder::*FuncPtr)(const DeviceRGBColor &);
+    DeviceRGBColorArgCall(FuncPtr f, const DeviceRGBColor &color) : func(f), arg(color) { }
+    void emit(FOTBuilder &);
+    FuncPtr func;
+    DeviceRGBColor arg;
+  };
+  struct InlineSpaceArgCall : Call {
+    typedef void (FOTBuilder::*FuncPtr)(const InlineSpace &);
+    InlineSpaceArgCall(FuncPtr f, InlineSpace is) : func(f), arg(is) { }
+    void emit(FOTBuilder &);
+    FuncPtr func;
+    InlineSpace arg;
+  };
+  struct CharactersFromNodeCall : Call {
+    CharactersFromNodeCall(const NodePtr &, const Char *, size_t);
+    void emit(FOTBuilder &);
+    const Char *data;
+    size_t size;
+    NodePtr node;
+  };
+  struct CharactersCall : Call {
+    CharactersCall(const Char *, size_t);
+    void emit(FOTBuilder &);
+    StringC str;
+  };
+  struct CharacterCall : Call {
+    CharacterCall(const CharacterNIC &nic) : arg(nic) { }
+    void emit(FOTBuilder &);
+    CharacterNIC arg;
+  };
+  struct StartNodeCall : Call {
+    StartNodeCall(const NodePtr &, const StringC &);
+    void emit(FOTBuilder &);
+    NodePtr node;
+    StringC mode;
+  };
+  struct StartParagraphCall : Call {
+    StartParagraphCall(const ParagraphNIC &nic);
+    void emit(FOTBuilder &);
+    ParagraphNIC arg;
+  };
+  struct ParagraphBreakCall : Call {
+    ParagraphBreakCall(const ParagraphNIC &nic);
+    void emit(FOTBuilder &);
+    ParagraphNIC arg;
+  };
+  struct StartDisplayGroupCall : Call {
+    StartDisplayGroupCall(const DisplayGroupNIC &nic);
+    void emit(FOTBuilder &);
+    DisplayGroupNIC arg;
+  };
+  struct StartBoxCall : Call {
+    StartBoxCall(const BoxNIC &nic) : arg(nic) { }
+    void emit(FOTBuilder &);
+    BoxNIC arg;
+  };
+  struct StartLineFieldCall : Call {
+    StartLineFieldCall(const LineFieldNIC &nic) : arg(nic) { }
+    void emit(FOTBuilder &);
+    LineFieldNIC arg;
+  };
+  struct ExternalGraphicCall : Call {
+    ExternalGraphicCall(const ExternalGraphicNIC &nic) : arg(nic) { }
+    void emit(FOTBuilder &);
+    ExternalGraphicNIC arg;
+  };
+  struct RuleCall : Call {
+    RuleCall(const RuleNIC &nic) : arg(nic) { }
+    void emit(FOTBuilder &);
+    RuleNIC arg;
+  };
+  struct StartLeaderCall : Call {
+    StartLeaderCall(const LeaderNIC &nic) : arg(nic) { }
+    void emit(FOTBuilder &);
+    LeaderNIC arg;
+  };
+  struct StartTableCall : Call {
+    StartTableCall(const TableNIC &nic) : arg(nic) { }
+    void emit(FOTBuilder &);
+    TableNIC arg;
+  };
+  struct TableColumnCall : Call {
+    TableColumnCall(const TableColumnNIC &nic) : arg(nic) { }
+    void emit(FOTBuilder &);
+    TableColumnNIC arg;
+  };
+  struct StartTableCellCall : Call {
+    StartTableCellCall(const TableCellNIC &nic) : arg(nic) { }
+    void emit(FOTBuilder &);
+    TableCellNIC arg;
+  };
+  struct StartLinkCall : Call {
+    StartLinkCall(const Address &addr) : arg(addr) { }
+    void emit(FOTBuilder &);
+    Address arg;
+  };
+  struct SetGlyphSubstTableCall : Call {
+    SetGlyphSubstTableCall(const Vector<ConstPtr<GlyphSubstTable> > &tables) : arg(tables) { }
+    void emit(FOTBuilder &);
+    Vector<ConstPtr<GlyphSubstTable> > arg;
+  };
+  struct StartGridCall : Call {
+    StartGridCall(const GridNIC &nic) : arg(nic) { }
+    void emit(FOTBuilder &);
+    GridNIC arg;
+  };
+  struct StartGridCellCall : Call {
+    StartGridCellCall(const GridCellNIC &nic) : arg(nic) { }
+    void emit(FOTBuilder &);
+    GridCellNIC arg;
+  };
+  struct RadicalRadicalCall : Call {
+    RadicalRadicalCall(const CharacterNIC &nic) : arg(nic) { }
+    void emit(FOTBuilder &);
+    CharacterNIC arg;
+  };
+  struct ExtensionCall : Call {
+    ExtensionCall(const ExtensionFlowObj &fo, const NodePtr &nd)
+      : arg(fo.copy()), node(nd) { }
+    void emit(FOTBuilder &);
+    Owner<ExtensionFlowObj> arg;
+    NodePtr node;
+  };
+  struct EndExtensionCall : Call {
+    EndExtensionCall(const CompoundExtensionFlowObj &fo)
+      : arg(fo.copy()->asCompoundExtensionFlowObj()) { }
+    void emit(FOTBuilder &);
+    Owner<CompoundExtensionFlowObj> arg;
+  };
+  Call *calls_;
+  Call **tail_;
+  NodePtr currentNode_;
+  StringC processingMode_;
+};
+
+// Would like to make this a member of SaveFOTBuilder, but can't because
+// it has members that are instances of SaveFOTBuilder.
+
+struct StartSimplePageSequenceCall : SaveFOTBuilder::Call {
+  StartSimplePageSequenceCall(FOTBuilder* headerFooter[FOTBuilder::nHF]);
+  void emit(FOTBuilder&);
+  SaveFOTBuilder headerFooter[FOTBuilder::nHF];
+};
+
+struct StartFractionCall : SaveFOTBuilder::Call {
+  StartFractionCall(FOTBuilder *&numerator, FOTBuilder *&denominator);
+  void emit(FOTBuilder &);
+  SaveFOTBuilder numerator;
+  SaveFOTBuilder denominator;
+};
+
+struct StartScriptCall : SaveFOTBuilder::Call {
+  StartScriptCall(FOTBuilder *&preSup,
+                  FOTBuilder *&preSub,
+                  FOTBuilder *&postSup,
+                  FOTBuilder *&postSub,
+                  FOTBuilder *&midSup,
+                  FOTBuilder *&midSub);
+  void emit(FOTBuilder &);
+  SaveFOTBuilder preSup;
+  SaveFOTBuilder preSub;
+  SaveFOTBuilder postSup;
+  SaveFOTBuilder postSub;
+  SaveFOTBuilder midSup;
+  SaveFOTBuilder midSub;
+};
+
+struct StartMarkCall : public SaveFOTBuilder::Call {
+  StartMarkCall(FOTBuilder *&overMark, FOTBuilder *&underMark);
+  void emit(FOTBuilder &);
+  SaveFOTBuilder overMark;
+  SaveFOTBuilder underMark;
+};
+
+struct StartFenceCall : public SaveFOTBuilder::Call {
+  StartFenceCall(FOTBuilder *&open, FOTBuilder *&close);
+  void emit(FOTBuilder &);
+  SaveFOTBuilder open;
+  SaveFOTBuilder close;
+};
+
+struct StartRadicalCall : public SaveFOTBuilder::Call {
+  StartRadicalCall(FOTBuilder *&degree);
+  void emit(FOTBuilder &);
+  SaveFOTBuilder degree;
+};
+
+struct StartMathOperatorCall : public SaveFOTBuilder::Call {
+  StartMathOperatorCall(FOTBuilder *&oper,
+                        FOTBuilder *&lowerLimit,
+                        FOTBuilder *&upperLimit);
+  void emit(FOTBuilder &);
+  SaveFOTBuilder oper;
+  SaveFOTBuilder lowerLimit;
+  SaveFOTBuilder upperLimit;
+};
+
+struct StartTablePartCall : SaveFOTBuilder::Call {
+  StartTablePartCall(const FOTBuilder::TablePartNIC &nic, FOTBuilder *&header, FOTBuilder *&footer);
+  void emit(FOTBuilder &);
+  FOTBuilder::TablePartNIC arg;
+  SaveFOTBuilder header;
+  SaveFOTBuilder footer;
+};
+
+struct StartMultiModeCall : SaveFOTBuilder::Call {
+  StartMultiModeCall(const FOTBuilder::MultiMode *principalMode,
+                    const Vector<FOTBuilder::MultiMode> &namedModes,
+                    Vector<FOTBuilder *> &ports);
+  void emit(FOTBuilder &);
+  FOTBuilder::MultiMode principalMode;
+  bool hasPrincipalMode;
+  Vector<FOTBuilder::MultiMode> namedModes;
+  IList<SaveFOTBuilder> ports;
+};
+
+struct StartExtensionCall : SaveFOTBuilder::Call {
+  StartExtensionCall(const FOTBuilder::CompoundExtensionFlowObj &,
+                    const NodePtr &,
+                    Vector<FOTBuilder *> &);
+  void emit(FOTBuilder &);
+  IList<SaveFOTBuilder> ports;
+  NodePtr node;
+  Owner<FOTBuilder::CompoundExtensionFlowObj> flowObj;
+};
+
+// This uses SaveFOTBuilder to provide a serial view of multi-port objects.
+
+class STYLE_API SerialFOTBuilder : public FOTBuilder {
+public:
+  SerialFOTBuilder();
+  // Instead of overriding these
+  void startSimplePageSequence(FOTBuilder* headerFooter[nHF]);
+  void endSimplePageSequenceHeaderFooter();
+  void endSimplePageSequence();
+  void startTablePart(const TablePartNIC &,
+                      FOTBuilder *&header, FOTBuilder *&footer);
+  void endTablePart();
+  void startFraction(FOTBuilder *&numerator, FOTBuilder *&denominator);
+  void endFraction();
+  void startScript(FOTBuilder *&preSup,
+                   FOTBuilder *&preSub,
+                   FOTBuilder *&postSup,
+                   FOTBuilder *&postSub,
+                   FOTBuilder *&midSup,
+                   FOTBuilder *&midSub);
+  void endScript();
+  void startMark(FOTBuilder *&overMark, FOTBuilder *&underMark);
+  void endMark();
+  void startFence(FOTBuilder *&open, FOTBuilder *&close);
+  void endFence();
+  void startRadical(FOTBuilder *&degree);
+  void endRadical();
+  void startMathOperator(FOTBuilder *&oper,
+                         FOTBuilder *&lowerLimit,
+                         FOTBuilder *&upperLimit);
+  void endMathOperator();
+  void startMultiMode(const MultiMode *,
+                      const Vector<MultiMode> &,
+                     Vector<FOTBuilder *> &);
+  void endMultiMode();
+  void startExtension(const CompoundExtensionFlowObj &,
+                     const NodePtr &,
+                     Vector<FOTBuilder *> &ports);
+  void endExtension(const CompoundExtensionFlowObj &);
+  // Override these
+  virtual void startSimplePageSequenceSerial();
+  virtual void endSimplePageSequenceSerial();
+  virtual void startSimplePageSequenceHeaderFooter(unsigned);
+  virtual void endSimplePageSequenceHeaderFooter(unsigned);
+  virtual void endAllSimplePageSequenceHeaderFooter();
+  virtual void startFractionSerial();
+  virtual void endFractionSerial();
+  virtual void startFractionNumerator();
+  virtual void endFractionNumerator();
+  virtual void startFractionDenominator();
+  virtual void endFractionDenominator();
+  virtual void startScriptSerial();
+  virtual void endScriptSerial();
+  virtual void startScriptPreSup();
+  virtual void endScriptPreSup();
+  virtual void startScriptPreSub();
+  virtual void endScriptPreSub();
+  virtual void startScriptPostSup();
+  virtual void endScriptPostSup();
+  virtual void startScriptPostSub();
+  virtual void endScriptPostSub();
+  virtual void startScriptMidSup();
+  virtual void endScriptMidSup();
+  virtual void startScriptMidSub();
+  virtual void endScriptMidSub();
+  virtual void startMarkSerial();
+  virtual void endMarkSerial();
+  virtual void startMarkOver();
+  virtual void endMarkOver();
+  virtual void startMarkUnder();
+  virtual void endMarkUnder();
+  virtual void startFenceSerial();
+  virtual void endFenceSerial();
+  virtual void startFenceOpen();
+  virtual void endFenceOpen();
+  virtual void startFenceClose();
+  virtual void endFenceClose();
+  virtual void startRadicalSerial();
+  virtual void endRadicalSerial();
+  virtual void startRadicalDegree();
+  virtual void endRadicalDegree();
+  virtual void startMathOperatorSerial();
+  virtual void endMathOperatorSerial();
+  virtual void startMathOperatorOperator();
+  virtual void endMathOperatorOperator();
+  virtual void startMathOperatorLowerLimit();
+  virtual void endMathOperatorLowerLimit();
+  virtual void startMathOperatorUpperLimit();
+  virtual void endMathOperatorUpperLimit();
+  virtual void startTablePartSerial(const TablePartNIC &);
+  virtual void endTablePartSerial();
+  virtual void startTablePartHeader();
+  virtual void endTablePartHeader();
+  virtual void startTablePartFooter();
+  virtual void endTablePartFooter();
+  virtual void startMultiModeSerial(const MultiMode *);
+  virtual void endMultiModeSerial();
+  virtual void startMultiModeMode(const MultiMode &);
+  virtual void endMultiModeMode();
+  virtual void startExtensionSerial(const CompoundExtensionFlowObj &, const NodePtr &);
+  virtual void endExtensionSerial(const CompoundExtensionFlowObj &);
+  virtual void startExtensionStream(const StringC &);
+  virtual void endExtensionStream(const StringC &);
+private:
+  IList<SaveFOTBuilder> save_;
+  Vector<Vector<MultiMode> > multiModeStack_;
+};
+
+inline
+bool operator==(const FOTBuilder::GlyphId &g1, const FOTBuilder::GlyphId &g2)
+{
+  return g1.publicId == g2.publicId && g1.suffix == g2.suffix;
+}
+
+bool STYLE_API operator==(const StringC &, const char *);
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not FOTBuilder_INCLUDED */
+
diff --git a/style/FlowObj.cxx b/style/FlowObj.cxx
new file mode 100644 (file)
index 0000000..de23e0e
--- /dev/null
@@ -0,0 +1,3046 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#include "stylelib.h"
+#include "ProcessContext.h"
+#include "Interpreter.h"
+#include "InterpreterMessages.h"
+#include "SosofoObj.h"
+#include "macros.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+FlowObj::FlowObj()
+: style_(0)
+{
+  hasSubObjects_ = 1;
+}
+
+void FlowObj::process(ProcessContext &context)
+{
+  context.startFlowObj();
+  unsigned flags = 0;
+  pushStyle(context, flags);
+  processInner(context);
+  popStyle(context, flags);
+  context.endFlowObj();
+}
+
+void FlowObj::pushStyle(ProcessContext &context, unsigned &)
+{
+  if (style_)
+    context.currentStyleStack().push(style_, context.vm(), context.currentFOTBuilder());
+  else
+    context.currentStyleStack().pushEmpty();
+}
+
+void FlowObj::popStyle(ProcessContext &context, unsigned)
+{
+  if (style_)
+    context.currentStyleStack().pop();
+  else
+    context.currentStyleStack().popEmpty();
+}
+
+void FlowObj::traceSubObjects(Collector &c) const
+{
+  c.trace(style_);
+}
+
+CompoundFlowObj *FlowObj::asCompoundFlowObj()
+{
+  return 0;
+}
+
+bool FlowObj::hasNonInheritedC(const Identifier *) const
+{
+  return 0;
+}
+
+bool FlowObj::hasPseudoNonInheritedC(const Identifier *) const
+{
+  return 0;
+}
+
+void FlowObj::setNonInheritedC(const Identifier *, ELObj *, const Location &, Interpreter &)
+{
+  CANNOT_HAPPEN();
+}
+
+bool FlowObj::isDisplayNIC(const Identifier *ident)
+{
+  Identifier::SyntacticKey key;
+  if (ident->syntacticKey(key)) {
+    switch (key) {
+    case Identifier::keyPositionPreference:
+    case Identifier::keyIsKeepWithPrevious:
+    case Identifier::keyIsKeepWithNext:
+    case Identifier::keyKeep:
+    case Identifier::keyBreakBefore:
+    case Identifier::keyBreakAfter:
+    case Identifier::keyIsMayViolateKeepBefore:
+    case Identifier::keyIsMayViolateKeepAfter:
+    case Identifier::keySpaceBefore:
+    case Identifier::keySpaceAfter:
+      return 1;
+    default:
+      break;
+    }
+  }
+  return 0;
+}
+
+bool FlowObj::setDisplayNIC(FOTBuilder::DisplayNIC &nic,
+                           const Identifier *ident, ELObj *obj,
+                           const Location &loc, Interpreter &interp)
+{
+  static FOTBuilder::Symbol breakVals[] = {
+    FOTBuilder::symbolFalse,
+    FOTBuilder::symbolPage,
+    FOTBuilder::symbolColumnSet,
+    FOTBuilder::symbolColumn
+  };
+  Identifier::SyntacticKey key;
+  if (ident->syntacticKey(key)) {
+    switch (key) {
+    case Identifier::keyPositionPreference:
+      {
+       static FOTBuilder::Symbol vals[] = {
+         FOTBuilder::symbolFalse,
+         FOTBuilder::symbolTop,
+         FOTBuilder::symbolBottom,
+       };
+       interp.convertEnumC(vals, SIZEOF(vals), obj, ident, loc, nic.positionPreference);
+      }
+      return 1;
+    case Identifier::keyIsKeepWithPrevious:
+      interp.convertBooleanC(obj, ident, loc, nic.keepWithPrevious);
+      return 1;
+    case Identifier::keyIsKeepWithNext:
+      interp.convertBooleanC(obj, ident, loc, nic.keepWithNext);
+      return 1;
+    case Identifier::keyKeep:
+      {
+       static FOTBuilder::Symbol vals[] = {
+         FOTBuilder::symbolFalse,
+         FOTBuilder::symbolTrue,
+         FOTBuilder::symbolPage,
+         FOTBuilder::symbolColumnSet,
+         FOTBuilder::symbolColumn
+       };
+       interp.convertEnumC(vals, SIZEOF(vals), obj, ident, loc, nic.keep);
+      }
+      return 1;
+    case Identifier::keyBreakBefore:
+      interp.convertEnumC(breakVals, SIZEOF(breakVals), obj, ident, loc, nic.breakBefore);
+      return 1;
+    case Identifier::keyBreakAfter:
+       interp.convertEnumC(breakVals, SIZEOF(breakVals), obj, ident, loc, nic.breakAfter);
+     return 1;
+    case Identifier::keyIsMayViolateKeepBefore:
+      interp.convertBooleanC(obj, ident, loc, nic.mayViolateKeepBefore);
+      return 1;
+    case Identifier::keyIsMayViolateKeepAfter:
+      interp.convertBooleanC(obj, ident, loc, nic.mayViolateKeepAfter);
+      return 1;
+    case Identifier::keySpaceBefore:
+    case Identifier::keySpaceAfter:
+      {
+       FOTBuilder::DisplaySpace &ds = (key == Identifier::keySpaceBefore
+                                       ? nic.spaceBefore
+                                       : nic.spaceAfter);
+       DisplaySpaceObj *dso = obj->asDisplaySpace();
+       if (dso)
+         ds = dso->displaySpace();
+       else if (interp.convertLengthSpecC(obj, ident, loc, ds.nominal)) {
+         ds.max = ds.nominal;
+         ds.min = ds.nominal;
+       }
+      }
+      return 1;
+    default:
+      break;
+    }
+  }
+  return 0;
+}
+
+
+void CompoundFlowObj::processInner(ProcessContext &context)
+{
+  if (content_)
+    content_->process(context);
+  else
+    context.processChildren(context.vm().interp->initialProcessingMode());
+}
+
+void CompoundFlowObj::traceSubObjects(Collector &c) const
+{
+  c.trace(content_);
+  FlowObj::traceSubObjects(c);
+}
+
+CompoundFlowObj *CompoundFlowObj::asCompoundFlowObj()
+{
+  return this;
+}
+
+class DisplayGroupFlowObj : public CompoundFlowObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  DisplayGroupFlowObj();
+  DisplayGroupFlowObj(const DisplayGroupFlowObj &);
+  void processInner(ProcessContext &);
+  FlowObj *copy(Collector &) const;
+  void setNonInheritedC(const Identifier *, ELObj *,
+                       const Location &, Interpreter &);
+  bool hasNonInheritedC(const Identifier *) const;
+protected:
+  Owner<FOTBuilder::DisplayGroupNIC> nic_;
+};
+
+DisplayGroupFlowObj::DisplayGroupFlowObj()
+: nic_(new FOTBuilder::DisplayGroupNIC)
+{
+}
+
+DisplayGroupFlowObj::DisplayGroupFlowObj(const DisplayGroupFlowObj &fo)
+: CompoundFlowObj(fo), nic_(new FOTBuilder::DisplayGroupNIC(*fo.nic_))
+{
+}
+
+void DisplayGroupFlowObj::processInner(ProcessContext &context)
+{
+  FOTBuilder &fotb = context.currentFOTBuilder();
+  fotb.startDisplayGroup(*nic_);
+  CompoundFlowObj::processInner(context);
+  fotb.endDisplayGroup();
+}
+
+bool DisplayGroupFlowObj::hasNonInheritedC(const Identifier *ident) const
+{
+  Identifier::SyntacticKey key;
+  if (ident->syntacticKey(key) && key == Identifier::keyCoalesceId)
+    return 1;
+  return isDisplayNIC(ident);
+}
+
+void DisplayGroupFlowObj::setNonInheritedC(const Identifier *ident, ELObj *obj,
+                                          const Location &loc, Interpreter &interp)
+{
+  if (!setDisplayNIC(*nic_, ident, obj, loc, interp)) {
+    const Char *s;
+    size_t n;
+    if (!obj->stringData(s, n)) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::invalidCharacteristicValue,
+                    StringMessageArg(ident->name()));
+    }
+    nic_->hasCoalesceId = 1;
+    nic_->coalesceId.assign(s, n);
+  }
+}
+
+FlowObj *DisplayGroupFlowObj::copy(Collector &c) const
+{
+  return new (c) DisplayGroupFlowObj(*this);
+}
+
+class ParagraphFlowObj : public CompoundFlowObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  ParagraphFlowObj();
+  ParagraphFlowObj(const ParagraphFlowObj &);
+  void processInner(ProcessContext &);
+  FlowObj *copy(Collector &) const;
+  void setNonInheritedC(const Identifier *, ELObj *,
+                       const Location &, Interpreter &);
+  bool hasNonInheritedC(const Identifier *) const;
+private:
+  Owner<FOTBuilder::ParagraphNIC> nic_;
+};
+
+
+ParagraphFlowObj::ParagraphFlowObj()
+: nic_(new FOTBuilder::ParagraphNIC)
+{
+}
+
+ParagraphFlowObj::ParagraphFlowObj(const ParagraphFlowObj &fo)
+: CompoundFlowObj(fo), nic_(new FOTBuilder::ParagraphNIC(*fo.nic_))
+{
+}
+
+void ParagraphFlowObj::processInner(ProcessContext &context)
+{
+  FOTBuilder &fotb = context.currentFOTBuilder();
+  fotb.startParagraph(*nic_);
+  CompoundFlowObj::processInner(context);
+  fotb.endParagraph();
+}
+
+void ParagraphFlowObj::setNonInheritedC(const Identifier *ident, ELObj *obj,
+                                       const Location &loc, Interpreter &interp)
+{
+  setDisplayNIC(*nic_, ident, obj, loc, interp);
+}
+
+bool ParagraphFlowObj::hasNonInheritedC(const Identifier *ident) const
+{
+  return isDisplayNIC(ident);
+}
+
+FlowObj *ParagraphFlowObj::copy(Collector &c) const
+{
+  return new (c) ParagraphFlowObj(*this);
+}
+
+class ParagraphBreakFlowObj : public FlowObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  ParagraphBreakFlowObj();
+  ParagraphBreakFlowObj(const ParagraphBreakFlowObj &);
+  FlowObj *copy(Collector &) const;
+  void processInner(ProcessContext &);
+  void setNonInheritedC(const Identifier *, ELObj *,
+                       const Location &, Interpreter &);
+  bool hasNonInheritedC(const Identifier *) const;
+private:
+  Owner<FOTBuilder::ParagraphNIC> nic_;
+};
+
+
+ParagraphBreakFlowObj::ParagraphBreakFlowObj()
+: nic_(new FOTBuilder::ParagraphNIC)
+{
+}
+
+ParagraphBreakFlowObj::ParagraphBreakFlowObj(const ParagraphBreakFlowObj &fo)
+: FlowObj(fo), nic_(new FOTBuilder::ParagraphNIC(*fo.nic_))
+{
+}
+
+FlowObj *ParagraphBreakFlowObj::copy(Collector &c) const
+{
+  return new (c) ParagraphBreakFlowObj(*this);
+}
+
+void ParagraphBreakFlowObj::processInner(ProcessContext &context)
+{
+  context.currentFOTBuilder().paragraphBreak(*nic_);
+}
+
+void ParagraphBreakFlowObj::setNonInheritedC(const Identifier *ident, ELObj *obj,
+                                            const Location &loc, Interpreter &interp)
+{
+  setDisplayNIC(*nic_, ident, obj, loc, interp);
+}
+
+bool ParagraphBreakFlowObj::hasNonInheritedC(const Identifier *ident) const
+{
+  return isDisplayNIC(ident);
+}
+
+class ExternalGraphicFlowObj : public FlowObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  ExternalGraphicFlowObj();
+  ExternalGraphicFlowObj(const ExternalGraphicFlowObj &);
+  void processInner(ProcessContext &);
+  FlowObj *copy(Collector &) const;
+  void setNonInheritedC(const Identifier *, ELObj *,
+                       const Location &, Interpreter &);
+  bool hasNonInheritedC(const Identifier *) const;
+private:
+  Owner<FOTBuilder::ExternalGraphicNIC> nic_;
+};
+
+
+ExternalGraphicFlowObj::ExternalGraphicFlowObj()
+: nic_(new FOTBuilder::ExternalGraphicNIC)
+{
+}
+
+ExternalGraphicFlowObj::ExternalGraphicFlowObj(const ExternalGraphicFlowObj &fo)
+: FlowObj(fo), nic_(new FOTBuilder::ExternalGraphicNIC(*fo.nic_))
+{
+}
+
+void ExternalGraphicFlowObj::processInner(ProcessContext &context)
+{
+  context.currentFOTBuilder().externalGraphic(*nic_);
+}
+
+void ExternalGraphicFlowObj::setNonInheritedC(const Identifier *ident, ELObj *obj,
+                                             const Location &loc, Interpreter &interp)
+{
+  if (!setDisplayNIC(*nic_, ident, obj, loc, interp)) {
+    Identifier::SyntacticKey key;
+    if (ident->syntacticKey(key)) {
+      switch (key) {
+      case Identifier::keyIsDisplay:
+       interp.convertBooleanC(obj, ident, loc, nic_->isDisplay);
+       return;
+      case Identifier::keyScale:
+       {
+         double d;
+         if (obj->realValue(d)) {
+           nic_->scaleType = FOTBuilder::symbolFalse;
+           nic_->scale[0] = nic_->scale[1] = d;
+         }
+         else if (obj->asSymbol()) {
+           static FOTBuilder::Symbol vals[] = {
+             FOTBuilder::symbolMax,
+             FOTBuilder::symbolMaxUniform
+           };
+           interp.convertEnumC(vals, 2, obj, ident, loc, nic_->scaleType);
+         }
+         else {
+           PairObj *pair = obj->asPair();
+           if (pair
+               && pair->car()->realValue(nic_->scale[0])
+               && (pair = pair->cdr()->asPair()) != 0
+               && pair->car()->realValue(nic_->scale[1])
+               && pair->cdr()->isNil()) {
+             nic_->scaleType = FOTBuilder::symbolFalse;
+           }
+           else
+             interp.invalidCharacteristicValue(ident, loc);
+         }
+       }
+       return;
+      case Identifier::keyMaxWidth:
+       if (interp.convertLengthSpecC(obj, ident, loc, nic_->maxWidth))
+         nic_->hasMaxWidth = 1;
+       return;
+      case Identifier::keyMaxHeight:
+       if (interp.convertLengthSpecC(obj, ident, loc, nic_->maxHeight))
+         nic_->hasMaxHeight = 1;
+       return;
+      case Identifier::keyEntitySystemId:
+       interp.convertStringC(obj, ident, loc, nic_->entitySystemId);
+       return;
+      case Identifier::keyNotationSystemId:
+       interp.convertStringC(obj, ident, loc, nic_->notationSystemId);
+       return;
+      case Identifier::keyPositionPointX:
+       interp.convertLengthSpecC(obj, ident, loc, nic_->positionPointX);
+       return;
+      case Identifier::keyPositionPointY:
+       interp.convertLengthSpecC(obj, ident, loc, nic_->positionPointY);
+       return;
+      case Identifier::keyEscapementDirection:
+       {
+         static FOTBuilder::Symbol vals[] = {
+           FOTBuilder::symbolTopToBottom,
+           FOTBuilder::symbolLeftToRight,
+           FOTBuilder::symbolBottomToTop,
+           FOTBuilder::symbolRightToLeft
+         };
+         interp.convertEnumC(vals, SIZEOF(vals), obj, ident, loc, nic_->escapementDirection);
+       }
+       return;
+      case Identifier::keyBreakBeforePriority:
+       interp.convertIntegerC(obj, ident, loc, nic_->breakBeforePriority);
+       return;
+      case Identifier::keyBreakAfterPriority:
+       interp.convertIntegerC(obj, ident, loc, nic_->breakAfterPriority);
+       return;
+      default:
+       break;
+      }
+    }
+    CANNOT_HAPPEN();
+  }
+}
+
+bool ExternalGraphicFlowObj::hasNonInheritedC(const Identifier *ident) const
+{
+  Identifier::SyntacticKey key;
+  if (ident->syntacticKey(key)) {
+    switch (key) {
+    case Identifier::keyIsDisplay:
+    case Identifier::keyScale:
+    case Identifier::keyMaxWidth:
+    case Identifier::keyMaxHeight:
+    case Identifier::keyEntitySystemId:
+    case Identifier::keyNotationSystemId:
+    case Identifier::keyPositionPointX:
+    case Identifier::keyPositionPointY:
+    case Identifier::keyEscapementDirection:
+    case Identifier::keyBreakBeforePriority:
+    case Identifier::keyBreakAfterPriority:
+      return 1;
+    default:
+      break;
+    }
+  }
+  return isDisplayNIC(ident);
+}
+
+FlowObj *ExternalGraphicFlowObj::copy(Collector &c) const
+{
+  return new (c) ExternalGraphicFlowObj(*this);
+}
+
+class RuleFlowObj : public FlowObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  RuleFlowObj();
+  RuleFlowObj(const RuleFlowObj &);
+  void processInner(ProcessContext &);
+  FlowObj *copy(Collector &) const;
+  void setNonInheritedC(const Identifier *, ELObj *,
+                       const Location &, Interpreter &);
+  bool hasNonInheritedC(const Identifier *) const;
+  bool ruleStyle(ProcessContext &, StyleObj *&style) {
+    style = style_;
+    return 1;
+  }
+  bool isRule() { return 1; }
+private:
+  Owner<FOTBuilder::RuleNIC> nic_;
+};
+
+RuleFlowObj::RuleFlowObj()
+: nic_(new FOTBuilder::RuleNIC)
+{
+}
+
+RuleFlowObj::RuleFlowObj(const RuleFlowObj &fo)
+: FlowObj(fo), nic_(new FOTBuilder::RuleNIC(*fo.nic_))
+{
+}
+
+void RuleFlowObj::processInner(ProcessContext &context)
+{
+  context.currentFOTBuilder().rule(*nic_);
+}
+
+void RuleFlowObj::setNonInheritedC(const Identifier *ident, ELObj *obj,
+                                             const Location &loc, Interpreter &interp)
+{
+  if (setDisplayNIC(*nic_, ident, obj, loc, interp))
+    return;
+  Identifier::SyntacticKey key;
+  if (ident->syntacticKey(key)) {
+    switch (key) {
+    case Identifier::keyOrientation:
+      {
+       static FOTBuilder::Symbol vals[] = {
+         FOTBuilder::symbolHorizontal,
+         FOTBuilder::symbolVertical,
+         FOTBuilder::symbolEscapement,
+         FOTBuilder::symbolLineProgression
+       };
+       interp.convertEnumC(vals, SIZEOF(vals), obj, ident, loc, nic_->orientation);
+      }
+      return;
+    case Identifier::keyLength:
+      if (interp.convertLengthSpecC(obj, ident, loc, nic_->length))
+       nic_->hasLength = 1;
+      return;
+    case Identifier::keyBreakBeforePriority:
+      interp.convertIntegerC(obj, ident, loc, nic_->breakBeforePriority);
+      return;
+    case Identifier::keyBreakAfterPriority:
+      interp.convertIntegerC(obj, ident, loc, nic_->breakAfterPriority);
+      return;
+    default:
+      break;
+    }
+  }
+  CANNOT_HAPPEN();
+}
+
+bool RuleFlowObj::hasNonInheritedC(const Identifier *ident) const
+{
+  Identifier::SyntacticKey key;
+  if (ident->syntacticKey(key)) {
+    switch (key) {
+    case Identifier::keyOrientation:
+    case Identifier::keyLength:
+    case Identifier::keyBreakBeforePriority:
+    case Identifier::keyBreakAfterPriority:
+      return 1;
+    default:
+      break;
+    }
+  }
+  return isDisplayNIC(ident);
+}
+
+FlowObj *RuleFlowObj::copy(Collector &c) const
+{
+  return new (c) RuleFlowObj(*this);
+}
+
+class AlignmentPointFlowObj : public FlowObj {
+public:
+  AlignmentPointFlowObj() { }
+  FlowObj *copy(Collector &) const;
+  void processInner(ProcessContext &);
+};
+
+FlowObj *AlignmentPointFlowObj::copy(Collector &c) const
+{
+  return new (c) AlignmentPointFlowObj(*this);
+}
+
+void AlignmentPointFlowObj::processInner(ProcessContext &context)
+{
+  context.currentFOTBuilder().alignmentPoint();
+}
+
+class SidelineFlowObj : public CompoundFlowObj {
+public:
+  SidelineFlowObj() { }
+  FlowObj *copy(Collector &) const;
+  void processInner(ProcessContext &);
+};
+
+FlowObj *SidelineFlowObj::copy(Collector &c) const
+{
+  return new (c) SidelineFlowObj(*this);
+}
+
+void SidelineFlowObj::processInner(ProcessContext &context)
+{
+  FOTBuilder &fotb = context.currentFOTBuilder();
+  fotb.startSideline();
+  CompoundFlowObj::processInner(context);
+  fotb.endSideline();
+}
+void SequenceFlowObj::processInner(ProcessContext &context)
+{
+  FOTBuilder &fotb = context.currentFOTBuilder();
+  fotb.startSequence();
+  CompoundFlowObj::processInner(context);
+  fotb.endSequence();
+}
+
+FlowObj *SequenceFlowObj::copy(Collector &c) const
+{
+  return new (c) SequenceFlowObj(*this);
+}
+
+class LineFieldFlowObj : public CompoundFlowObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  LineFieldFlowObj() : nic_(new FOTBuilder::LineFieldNIC) { }
+  LineFieldFlowObj(const LineFieldFlowObj &fo)
+    : CompoundFlowObj(fo), nic_(new FOTBuilder::LineFieldNIC(*fo.nic_)) { }
+  void processInner(ProcessContext &);
+  FlowObj *copy(Collector &) const;
+  bool hasNonInheritedC(const Identifier *ident) const;
+  void setNonInheritedC(const Identifier *ident, ELObj *obj,
+                       const Location &loc, Interpreter &interp);
+private:
+  Owner<FOTBuilder::LineFieldNIC> nic_;
+};
+
+FlowObj *LineFieldFlowObj::copy(Collector &c) const
+{
+  return new (c) LineFieldFlowObj(*this);
+}
+
+void LineFieldFlowObj::processInner(ProcessContext &context)
+{
+  FOTBuilder &fotb = context.currentFOTBuilder();
+  fotb.startLineField(*nic_);
+  CompoundFlowObj::processInner(context);
+  fotb.endLineField();
+}
+
+void LineFieldFlowObj::setNonInheritedC(const Identifier *ident, ELObj *obj,
+                                       const Location &loc, Interpreter &interp)
+{
+  Identifier::SyntacticKey key;
+  if (ident->syntacticKey(key)) {
+    switch (key) {
+    case Identifier::keyBreakBeforePriority:
+      interp.convertIntegerC(obj, ident, loc, nic_->breakBeforePriority);
+      return;
+    case Identifier::keyBreakAfterPriority:
+      interp.convertIntegerC(obj, ident, loc, nic_->breakAfterPriority);
+      return;
+    default:
+      break;
+    }
+  }
+  CANNOT_HAPPEN();
+}
+
+bool LineFieldFlowObj::hasNonInheritedC(const Identifier *ident) const
+{
+  Identifier::SyntacticKey key;
+  if (ident->syntacticKey(key)) {
+    switch (key) {
+    case Identifier::keyBreakBeforePriority:
+    case Identifier::keyBreakAfterPriority:
+      return 1;
+    default:
+      break;
+    }
+  }
+  return 0;
+}
+
+class SimplePageSequenceFlowObj : public CompoundFlowObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  struct HeaderFooter {
+    enum { nParts = 6 };
+    HeaderFooter();
+    SosofoObj *part[nParts];
+  };
+  SimplePageSequenceFlowObj();
+  SimplePageSequenceFlowObj(const SimplePageSequenceFlowObj &);
+  void processInner(ProcessContext &);
+  FlowObj *copy(Collector &) const;
+  bool hasNonInheritedC(const Identifier *) const;
+  void setNonInheritedC(const Identifier *, ELObj *,
+                       const Location &, Interpreter &);
+  void traceSubObjects(Collector &) const;
+private:
+  enum { nPageTypeBits = 2 };
+  Owner<HeaderFooter> hf_;
+};
+
+
+SimplePageSequenceFlowObj::SimplePageSequenceFlowObj()
+: hf_(new HeaderFooter)
+{
+  hasSubObjects_ = 1;
+}
+
+SimplePageSequenceFlowObj::SimplePageSequenceFlowObj(const SimplePageSequenceFlowObj &fo)
+: CompoundFlowObj(fo), hf_(new HeaderFooter(*fo.hf_))
+{
+}
+
+void SimplePageSequenceFlowObj::traceSubObjects(Collector &c) const
+{
+  for (int i = 0; i < HeaderFooter::nParts; i++)
+    c.trace(hf_->part[i]);
+  CompoundFlowObj::traceSubObjects(c);
+}
+
+void SimplePageSequenceFlowObj::processInner(ProcessContext &context)
+{
+  FOTBuilder &fotb = context.currentFOTBuilder();
+  FOTBuilder* hf_fotb[FOTBuilder::nHF];
+  fotb.startSimplePageSequence(hf_fotb);
+  for (int i = 0; i < (1 << nPageTypeBits); i++) {
+    context.setPageType(i);
+    for (int j = 0; j < HeaderFooter::nParts; j++) {
+      if (hf_->part[j]) {
+        context.pushPrincipalPort(hf_fotb[i | (j << nPageTypeBits)]);
+       hf_->part[j]->process(context);
+        context.popPrincipalPort();
+    }
+  }
+  }
+  fotb.endSimplePageSequenceHeaderFooter();
+  CompoundFlowObj::processInner(context);
+  fotb.endSimplePageSequence();
+}
+
+void SimplePageSequenceFlowObj::setNonInheritedC(const Identifier *ident,
+                                                ELObj *obj,
+                                                const Location &loc,
+                                                Interpreter &interp)
+{
+  SosofoObj *sosofo = obj->asSosofo();
+  if (!sosofo) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::invalidCharacteristicValue,
+                  StringMessageArg(ident->name()));
+    return;
+  }
+  Identifier::SyntacticKey key;
+  if (ident->syntacticKey(key)) {
+    switch (key) {
+    case Identifier::keyLeftHeader:
+      hf_->part[(FOTBuilder::leftHF | FOTBuilder::headerHF) >> nPageTypeBits] = sosofo;
+      return;
+    case Identifier::keyCenterHeader:
+      hf_->part[(FOTBuilder::centerHF | FOTBuilder::headerHF) >> nPageTypeBits] = sosofo;
+      return;
+    case Identifier::keyRightHeader:
+      hf_->part[(FOTBuilder::rightHF | FOTBuilder::headerHF) >> nPageTypeBits] = sosofo;
+      return;
+    case Identifier::keyLeftFooter:
+      hf_->part[(FOTBuilder::leftHF | FOTBuilder::footerHF) >> nPageTypeBits] = sosofo;
+      return;
+    case Identifier::keyCenterFooter:
+      hf_->part[(FOTBuilder::centerHF | FOTBuilder::footerHF) >> nPageTypeBits] = sosofo;
+      return;
+    case Identifier::keyRightFooter:
+      hf_->part[(FOTBuilder::rightHF | FOTBuilder::footerHF) >> nPageTypeBits] = sosofo;
+      return;
+    default:
+      break;
+    }
+  }
+  CANNOT_HAPPEN();
+}
+
+bool SimplePageSequenceFlowObj::hasNonInheritedC(const Identifier *ident) const
+{
+  Identifier::SyntacticKey key;
+  if (ident->syntacticKey(key)) {
+    switch (key) {
+    case Identifier::keyLeftHeader:
+    case Identifier::keyCenterHeader:
+    case Identifier::keyRightHeader:
+    case Identifier::keyLeftFooter:
+    case Identifier::keyCenterFooter:
+    case Identifier::keyRightFooter:
+      return 1;
+    default:
+      break;
+    }
+  }
+  return 0;
+}
+
+FlowObj *SimplePageSequenceFlowObj::copy(Collector &c) const
+{
+  return new (c) SimplePageSequenceFlowObj(*this);
+}
+
+SimplePageSequenceFlowObj::HeaderFooter::HeaderFooter()
+{
+  for (int i = 0; i < nParts; i++)
+    part[i] = 0;
+}
+
+class LinkFlowObj : public CompoundFlowObj {
+public:
+  LinkFlowObj();
+  FlowObj *copy(Collector &) const;
+  void processInner(ProcessContext &);
+  void traceSubObjects(Collector &) const;
+  bool hasNonInheritedC(const Identifier *) const;
+  void setNonInheritedC(const Identifier *, ELObj *,
+                       const Location &, Interpreter &);
+private:
+  AddressObj *addressObj_;
+};
+
+LinkFlowObj::LinkFlowObj()
+: addressObj_(0)
+{
+}
+
+void LinkFlowObj::processInner(ProcessContext &context)
+{
+  FOTBuilder &fotb = context.currentFOTBuilder();
+  if (!addressObj_) {
+    FOTBuilder::Address addr;
+    addr.type = FOTBuilder::Address::none;
+    fotb.startLink(addr);
+  }
+  else
+    fotb.startLink(addressObj_->address());
+  CompoundFlowObj::processInner(context);
+  fotb.endLink();
+}
+
+FlowObj *LinkFlowObj::copy(Collector &c) const
+{
+  return new (c) LinkFlowObj(*this);
+}
+
+void LinkFlowObj::traceSubObjects(Collector &c) const
+{
+  CompoundFlowObj::traceSubObjects(c);
+  c.trace(addressObj_);
+}
+
+bool LinkFlowObj::hasNonInheritedC(const Identifier *ident) const
+{
+  Identifier::SyntacticKey key;
+  return ident->syntacticKey(key) && key == Identifier::keyDestination;
+}
+
+void LinkFlowObj::setNonInheritedC(const Identifier *ident, ELObj *obj,
+                                  const Location &loc, Interpreter &interp)
+{
+  AddressObj *address = obj->asAddress();
+  if (!address) {
+    if (obj != interp.makeFalse()) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::invalidCharacteristicValue,
+                     StringMessageArg(ident->name()));
+    }
+    else
+      address = interp.makeAddressNone();
+  }
+  addressObj_ = address;
+}
+
+class ScrollFlowObj : public CompoundFlowObj {
+public:
+  ScrollFlowObj() { }
+  void processInner(ProcessContext &);
+  FlowObj *copy(Collector &) const;
+};
+
+void ScrollFlowObj::processInner(ProcessContext &context)
+{
+  FOTBuilder &fotb = context.currentFOTBuilder();
+  fotb.startScroll();
+  CompoundFlowObj::processInner(context);
+  fotb.endScroll();
+}
+
+FlowObj *ScrollFlowObj::copy(Collector &c) const
+{
+  return new (c) ScrollFlowObj(*this);
+}
+
+class MarginaliaFlowObj : public CompoundFlowObj {
+public:
+  MarginaliaFlowObj() { }
+  void processInner(ProcessContext &);
+  FlowObj *copy(Collector &) const;
+};
+
+void MarginaliaFlowObj::processInner(ProcessContext &context)
+{
+  FOTBuilder &fotb = context.currentFOTBuilder();
+  fotb.startMarginalia();
+  CompoundFlowObj::processInner(context);
+  fotb.endMarginalia();
+}
+
+FlowObj *MarginaliaFlowObj::copy(Collector &c) const
+{
+  return new (c) MarginaliaFlowObj(*this);
+}
+
+class MultiModeFlowObj : public CompoundFlowObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  MultiModeFlowObj();
+  MultiModeFlowObj(const MultiModeFlowObj &);
+  void processInner(ProcessContext &);
+  FlowObj *copy(Collector &) const;
+  bool hasNonInheritedC(const Identifier *) const;
+  void setNonInheritedC(const Identifier *, ELObj *,
+                       const Location &, Interpreter &);
+  struct NIC {
+    NIC() : hasPrincipalMode(0) { }
+    bool hasPrincipalMode;
+    FOTBuilder::MultiMode principalMode;
+    Vector<FOTBuilder::MultiMode> namedModes;
+  };
+private:
+  bool handleMultiModesMember(const Identifier *, ELObj *obj,
+                             const Location &, Interpreter &);
+  Owner<NIC> nic_;
+};
+
+MultiModeFlowObj::MultiModeFlowObj()
+: nic_(new NIC)
+{
+}
+
+MultiModeFlowObj::MultiModeFlowObj(const MultiModeFlowObj &fo)
+: CompoundFlowObj(fo), nic_(new NIC(*fo.nic_))
+{
+}
+
+void MultiModeFlowObj::processInner(ProcessContext &context)
+{
+  FOTBuilder &fotb = context.currentFOTBuilder();
+  Vector<FOTBuilder *> fotbs(nic_->namedModes.size());
+  fotb.startMultiMode(nic_->hasPrincipalMode ? &nic_->principalMode : 0,
+                     nic_->namedModes,
+                     fotbs);
+  Vector<SymbolObj *> portSyms(nic_->namedModes.size());
+  for (size_t i = 0; i < portSyms.size(); i++)
+    portSyms[i] = context.vm().interp->makeSymbol(nic_->namedModes[i].name);
+  context.pushPorts(nic_->hasPrincipalMode, portSyms, fotbs);
+  CompoundFlowObj::processInner(context);
+  context.popPorts();
+  fotb.endMultiMode();
+}
+
+FlowObj *MultiModeFlowObj::copy(Collector &c) const
+{
+  return new (c) MultiModeFlowObj(*this);
+}
+
+bool MultiModeFlowObj::hasNonInheritedC(const Identifier *ident) const
+{
+  Identifier::SyntacticKey key;
+  return ident->syntacticKey(key) && key == Identifier::keyMultiModes;
+}
+
+void MultiModeFlowObj::setNonInheritedC(const Identifier *ident, ELObj *obj,
+                                       const Location &loc, Interpreter &interp)
+{
+  while (!obj->isNil()) {
+    PairObj *pair = obj->asPair();
+    if (!pair || !handleMultiModesMember(ident, pair->car(), loc, interp)) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::invalidCharacteristicValue,
+                    StringMessageArg(ident->name()));
+      return;
+    }
+    obj = pair->cdr();
+  }
+}
+
+bool MultiModeFlowObj::handleMultiModesMember(const Identifier *, ELObj *obj,
+                                             const Location &loc, Interpreter &interp)
+{
+  if (obj == interp.makeFalse()) {
+    nic_->hasPrincipalMode = 1;
+    return 1;
+  }
+  SymbolObj *sym = obj->asSymbol();
+  if (sym) {
+    nic_->namedModes.resize(nic_->namedModes.size() + 1);
+    nic_->namedModes.back().name = *sym->name();
+    return 1;
+  }
+  PairObj *pair = obj->asPair();
+  if (!pair)
+    return 0;
+  ELObj *spec = pair->car();
+  pair = pair->cdr()->asPair();
+  if (!pair || !pair->cdr()->isNil())
+    return 0;
+  const Char *s;
+  size_t n;
+  if (!pair->car()->stringData(s, n))
+    return 0;
+  if (spec == interp.makeFalse()) {
+    nic_->hasPrincipalMode = 1;
+    nic_->principalMode.hasDesc = 1;
+    nic_->principalMode.desc.assign(s, n);
+    return 1;
+  }
+  sym = spec->asSymbol();
+  if (!sym)
+    return 0;
+  nic_->namedModes.resize(nic_->namedModes.size() + 1);
+  nic_->namedModes.back().name = *sym->name();
+  nic_->namedModes.back().desc.assign(s, n);
+  nic_->namedModes.back().hasDesc = 1;
+  return 1;
+}
+
+
+class ScoreFlowObj : public CompoundFlowObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  ScoreFlowObj();
+  FlowObj *copy(Collector &) const;
+  void processInner(ProcessContext &);
+  bool hasNonInheritedC(const Identifier *) const;
+  void setNonInheritedC(const Identifier *, ELObj *,
+                       const Location &, Interpreter &);
+  class Type {
+  public:
+    virtual ~Type();
+    virtual void start(FOTBuilder &) = 0;
+    virtual Type *copy() const = 0;
+  };
+private:
+  class SymbolType : public Type {
+  public:
+    SymbolType(FOTBuilder::Symbol type) : type_(type) { }
+    void start(FOTBuilder &);
+    Type *copy() const;
+  private:
+    FOTBuilder::Symbol type_;
+  };
+  class LengthSpecType : public Type {
+  public:
+    LengthSpecType(long n) : len_(n) { }
+    void start(FOTBuilder &);
+    Type *copy() const;
+  private:
+    FOTBuilder::LengthSpec len_;
+  };
+  class CharType : public Type {
+  public:
+    CharType(Char c) : c_(c) { }
+    void start(FOTBuilder &);
+    Type *copy() const;
+  private:
+    Char c_;
+  };
+  CopyOwner<Type> type_;
+};
+
+ScoreFlowObj::ScoreFlowObj()
+{
+}
+
+FlowObj *ScoreFlowObj::copy(Collector &c) const
+{
+  return new (c) ScoreFlowObj(*this);
+}
+
+void ScoreFlowObj::processInner(ProcessContext &context)
+{
+  FOTBuilder &fotb = context.currentFOTBuilder();
+  if (type_)
+    type_->start(fotb);
+  else
+    fotb.startSequence();
+  CompoundFlowObj::processInner(context);
+  if (type_)
+    fotb.endScore();
+  else
+    fotb.endSequence();
+}
+
+bool ScoreFlowObj::hasNonInheritedC(const Identifier *ident) const
+{
+  Identifier::SyntacticKey key;
+  return ident->syntacticKey(key) && key == Identifier::keyType;
+}
+
+void ScoreFlowObj::setNonInheritedC(const Identifier *ident, ELObj *obj,
+                                   const Location &loc, Interpreter &interp)
+{
+  Char c;
+  if (obj->charValue(c)) {
+    type_ = new CharType(c);
+    return;
+  }
+  double d;
+  long n;
+  int dim;
+  switch (obj->quantityValue(n, d, dim)) {
+  case longQuantity:
+    if (dim == 1) {
+      type_ = new LengthSpecType(n);
+      return;
+    }
+    break;
+  case doubleQuantity:
+    if (dim == 1) {
+      type_ = new LengthSpecType(long(d));
+      return;
+    }
+    break;
+  default:
+    break;
+  }
+  static FOTBuilder::Symbol vals[] = {
+    FOTBuilder::symbolBefore,
+    FOTBuilder::symbolThrough,
+    FOTBuilder::symbolAfter
+  };
+  FOTBuilder::Symbol sym;
+  if (interp.convertEnumC(vals, SIZEOF(vals), obj, ident, loc, sym))
+    type_ = new SymbolType(sym);
+}
+
+ScoreFlowObj::Type::~Type()
+{
+}
+
+void ScoreFlowObj::SymbolType::start(FOTBuilder &fotb)
+{
+  fotb.startScore(type_);
+}
+
+void ScoreFlowObj::CharType::start(FOTBuilder &fotb)
+{
+  fotb.startScore(c_);
+}
+
+void ScoreFlowObj::LengthSpecType::start(FOTBuilder &fotb)
+{
+  fotb.startScore(len_);
+}
+
+ScoreFlowObj::Type *ScoreFlowObj::SymbolType::copy() const
+{
+  return new SymbolType(*this);
+}
+
+ScoreFlowObj::Type *ScoreFlowObj::LengthSpecType::copy() const
+{
+  return new LengthSpecType(*this);
+}
+
+ScoreFlowObj::Type *ScoreFlowObj::CharType::copy() const
+{
+  return new CharType(*this);
+}
+
+class BoxFlowObj : public CompoundFlowObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  BoxFlowObj();
+  BoxFlowObj(const BoxFlowObj &);
+  FlowObj *copy(Collector &) const;
+  void processInner(ProcessContext &);
+  bool hasNonInheritedC(const Identifier *) const;
+  void setNonInheritedC(const Identifier *, ELObj *,
+                       const Location &, Interpreter &);
+private:
+  Owner<FOTBuilder::BoxNIC> nic_;
+};
+
+BoxFlowObj::BoxFlowObj()
+: nic_(new FOTBuilder::BoxNIC)
+{
+}
+
+BoxFlowObj::BoxFlowObj(const BoxFlowObj &fo)
+: CompoundFlowObj(fo), nic_(new FOTBuilder::BoxNIC(*fo.nic_))
+{
+}
+
+void BoxFlowObj::processInner(ProcessContext &context)
+{
+  FOTBuilder &fotb = context.currentFOTBuilder();
+  fotb.startBox(*nic_);
+  CompoundFlowObj::processInner(context);
+  fotb.endBox();
+}
+
+void BoxFlowObj::setNonInheritedC(const Identifier *ident, ELObj *obj,
+                                             const Location &loc, Interpreter &interp)
+{
+  if (setDisplayNIC(*nic_, ident, obj, loc, interp))
+    return;
+  Identifier::SyntacticKey key;
+  if (ident->syntacticKey(key)) {
+    switch (key) {
+    case Identifier::keyIsDisplay:
+      interp.convertBooleanC(obj, ident, loc, nic_->isDisplay);
+      return;
+    case Identifier::keyBreakBeforePriority:
+      interp.convertIntegerC(obj, ident, loc, nic_->breakBeforePriority);
+      return;
+    case Identifier::keyBreakAfterPriority:
+      interp.convertIntegerC(obj, ident, loc, nic_->breakAfterPriority);
+      return;
+    default:
+      break;
+    }
+  }
+  CANNOT_HAPPEN();
+}
+
+bool BoxFlowObj::hasNonInheritedC(const Identifier *ident) const
+{
+  Identifier::SyntacticKey key;
+  if (ident->syntacticKey(key)) {
+    switch (key) {
+    case Identifier::keyIsDisplay:
+    case Identifier::keyBreakBeforePriority:
+    case Identifier::keyBreakAfterPriority:
+      return 1;
+    default:
+      break;
+    }
+  }
+  return isDisplayNIC(ident);
+}
+
+FlowObj *BoxFlowObj::copy(Collector &c) const
+{
+  return new (c) BoxFlowObj(*this);
+}
+
+class LeaderFlowObj : public CompoundFlowObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  LeaderFlowObj();
+  LeaderFlowObj(const LeaderFlowObj &);
+  void processInner(ProcessContext &);
+  FlowObj *copy(Collector &) const;
+  void setNonInheritedC(const Identifier *, ELObj *,
+                       const Location &, Interpreter &);
+  bool hasNonInheritedC(const Identifier *) const;
+private:
+  Owner<FOTBuilder::LeaderNIC> nic_;
+};
+
+LeaderFlowObj::LeaderFlowObj()
+: nic_(new FOTBuilder::LeaderNIC)
+{
+}
+
+LeaderFlowObj::LeaderFlowObj(const LeaderFlowObj &fo)
+: CompoundFlowObj(fo), nic_(new FOTBuilder::LeaderNIC(*fo.nic_))
+{
+}
+
+void LeaderFlowObj::processInner(ProcessContext &context)
+{
+  FOTBuilder &fotb = context.currentFOTBuilder();
+  fotb.startLeader(*nic_);
+  CompoundFlowObj::processInner(context);
+  fotb.endLeader();
+}
+
+void LeaderFlowObj::setNonInheritedC(const Identifier *ident, ELObj *obj,
+                                    const Location &loc, Interpreter &interp)
+{
+  Identifier::SyntacticKey key;
+  if (ident->syntacticKey(key)) {
+    switch (key) {
+    case Identifier::keyLength:
+      if (interp.convertLengthSpecC(obj, ident, loc, nic_->length))
+       nic_->hasLength = 1;
+      return;
+    case Identifier::keyBreakBeforePriority:
+      interp.convertIntegerC(obj, ident, loc, nic_->breakBeforePriority);
+      return;
+    case Identifier::keyBreakAfterPriority:
+      interp.convertIntegerC(obj, ident, loc, nic_->breakAfterPriority);
+      return;
+    default:
+      break;
+    }
+  }
+  CANNOT_HAPPEN();
+}
+
+bool LeaderFlowObj::hasNonInheritedC(const Identifier *ident) const
+{
+  Identifier::SyntacticKey key;
+  if (ident->syntacticKey(key)) {
+    switch (key) {
+    case Identifier::keyLength:
+    case Identifier::keyBreakBeforePriority:
+    case Identifier::keyBreakAfterPriority:
+      return 1;
+    default:
+      break;
+    }
+  }
+  return 0;
+}
+
+FlowObj *LeaderFlowObj::copy(Collector &c) const
+{
+  return new (c) LeaderFlowObj(*this);
+}
+
+class CharacterFlowObj : public FlowObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  CharacterFlowObj();
+  CharacterFlowObj(const CharacterFlowObj &);
+  void processInner(ProcessContext &);
+  FlowObj *copy(Collector &) const;
+  void setNonInheritedC(const Identifier *, ELObj *,
+                       const Location &, Interpreter &);
+  bool setImplicitChar(ELObj *, const Location &, Interpreter &);
+  bool hasNonInheritedC(const Identifier *) const;
+  bool characterStyle(ProcessContext &, StyleObj *&style, FOTBuilder::CharacterNIC &nic) {
+    style = style_;
+    nic = *nic_;
+    return 1;
+  }
+  bool isCharacter() { return 1; }
+private:
+  Owner<FOTBuilder::CharacterNIC> nic_;
+};
+
+CharacterFlowObj::CharacterFlowObj()
+: nic_(new FOTBuilder::CharacterNIC)
+{
+}
+
+CharacterFlowObj::CharacterFlowObj(const CharacterFlowObj &fo)
+: FlowObj(fo), nic_(new FOTBuilder::CharacterNIC(*fo.nic_))
+{
+}
+
+void CharacterFlowObj::processInner(ProcessContext &context)
+{
+  context.currentFOTBuilder().character(*nic_);
+}
+
+bool FlowObj::setImplicitChar(ELObj *obj, const Location &loc, 
+                                       Interpreter &interp)
+{
+  CANNOT_HAPPEN();
+  return false;
+}
+
+
+bool CharacterFlowObj::setImplicitChar(ELObj *obj, const Location &loc, 
+                                       Interpreter &interp)
+{
+  Identifier *ident = interp.lookup(interp.makeStringC("char")); 
+  if (!(nic_->specifiedC & (1 << FOTBuilder::CharacterNIC::cChar))
+      && interp.convertCharC(obj, ident, loc, nic_->ch)) {
+    nic_->valid = 1;
+    
+    if (!(nic_->specifiedC & (1 << FOTBuilder::CharacterNIC::cIsSpace)))  
+      interp.convertBooleanC(
+                            interp.charProperty(interp.makeStringC("space?"), 
+                                                nic_->ch, loc, 0),  
+                            ident, loc, nic_->isSpace);
+    
+    if (!(nic_->specifiedC & (1 << FOTBuilder::CharacterNIC::cIsRecordEnd)))  
+      interp.convertBooleanC(
+                            interp.charProperty(interp.makeStringC("record-end?"), 
+                                                nic_->ch, loc, 0),
+                            ident, loc, nic_->isRecordEnd);
+    
+    if (!(nic_->specifiedC & (1 << FOTBuilder::CharacterNIC::cIsInputTab))) 
+      interp.convertBooleanC(
+                            interp.charProperty(interp.makeStringC("input-tab?"), 
+                                                nic_->ch, loc, 0),
+                            ident, loc, nic_->isInputTab);
+    
+    if (!(nic_->specifiedC & (1 << FOTBuilder::CharacterNIC::cIsInputWhitespace)))  
+      interp.convertBooleanC(
+                            interp.charProperty(interp.makeStringC("input-whitespace?"), 
+                                                nic_->ch, loc, 0),
+                            ident, loc, nic_->isInputWhitespace);
+    
+    if (!(nic_->specifiedC & (1 << FOTBuilder::CharacterNIC::cIsPunct)))  
+      interp.convertBooleanC(
+                            interp.charProperty(interp.makeStringC("punct?"), 
+                                                nic_->ch, loc, 0),
+                            ident, loc, nic_->isPunct);
+    
+    if (!(nic_->specifiedC & (1 << FOTBuilder::CharacterNIC::cIsDropAfterLineBreak)))  
+      interp.convertBooleanC(
+                            interp.charProperty(interp.makeStringC("drop-after-line-break?"), 
+                                                nic_->ch, loc, 0),
+                            ident, loc, nic_->isDropAfterLineBreak); 
+    
+    if (!(nic_->specifiedC & (1 << FOTBuilder::CharacterNIC::cIsDropUnlessBeforeLineBreak)))  
+      interp.convertBooleanC(
+                            interp.charProperty(interp.makeStringC("drop-unless-before-line-break?"), 
+                                                nic_->ch, loc, 0),
+                            ident, loc, nic_->isDropUnlessBeforeLineBreak); 
+    
+    if (!(nic_->specifiedC & (1 << FOTBuilder::CharacterNIC::cBreakBeforePriority))) 
+      interp.convertIntegerC(
+                            interp.charProperty(interp.makeStringC("break-before-priority"), 
+                                                nic_->ch, loc, 0),
+                            ident, loc, nic_->breakBeforePriority);  
+    
+    if (!(nic_->specifiedC & (1 << FOTBuilder::CharacterNIC::cBreakAfterPriority))) 
+      interp.convertIntegerC(
+                            interp.charProperty(interp.makeStringC("break-after-priority"), 
+                                                nic_->ch, loc, 0),
+                            ident, loc, nic_->breakAfterPriority);  
+    
+    if (!(nic_->specifiedC & (1 << FOTBuilder::CharacterNIC::cScript))) {
+      ELObj *prop = interp.charProperty(interp.makeStringC("script"), 
+                                        nic_->ch, loc, 0);
+      if (prop == interp.makeFalse())
+        nic_->script = 0;
+      else {
+        StringC tem;
+        if (interp.convertStringC(prop, ident, loc, tem))
+         nic_->script = interp.storePublicId(tem.data(), tem.size(), loc);
+      }
+    }
+    
+    if (!(nic_->specifiedC & (1 << FOTBuilder::CharacterNIC::cGlyphId))) {
+      ELObj *prop = interp.charProperty(interp.makeStringC("glyph-id"), 
+                                        nic_->ch, loc, 0);
+      if (prop == interp.makeFalse()) 
+        nic_->glyphId = FOTBuilder::GlyphId();
+      else {
+        const FOTBuilder::GlyphId *p = prop->glyphId();
+        if (p) 
+          nic_->glyphId = *p;
+      }
+    }
+    
+    if (!(nic_->specifiedC & (1 << FOTBuilder::CharacterNIC::cMathFontPosture))) {
+      ELObj *prop = interp.charProperty(interp.makeStringC("math-font-posture"), 
+                                        nic_->ch, loc, 0);
+      static FOTBuilder::Symbol vals[] = {
+        FOTBuilder::symbolFalse,
+        FOTBuilder::symbolNotApplicable,
+        FOTBuilder::symbolUpright,
+        FOTBuilder::symbolOblique,
+        FOTBuilder::symbolBackSlantedOblique,
+        FOTBuilder::symbolItalic,
+        FOTBuilder::symbolBackSlantedItalic,
+      };
+      interp.convertEnumC(vals, SIZEOF(vals), prop, ident, loc, nic_->mathFontPosture);
+    }
+    
+    if (!(nic_->specifiedC & (1 << FOTBuilder::CharacterNIC::cMathClass))) {
+      ELObj *prop = interp.charProperty(interp.makeStringC("math-class"), 
+                                        nic_->ch, loc, 0);
+      static FOTBuilder::Symbol vals[] = {
+        FOTBuilder::symbolOrdinary,
+        FOTBuilder::symbolOperator,
+        FOTBuilder::symbolBinary,
+        FOTBuilder::symbolRelation,
+        FOTBuilder::symbolOpening,
+        FOTBuilder::symbolClosing,
+        FOTBuilder::symbolPunctuation,
+        FOTBuilder::symbolInner,
+        FOTBuilder::symbolSpace,
+      };
+      interp.convertEnumC(vals, SIZEOF(vals), prop, ident, loc, nic_->mathClass);
+    }
+    
+    return 1;
+  }
+  else 
+    return 0; 
+}
+
+void CharacterFlowObj::setNonInheritedC(const Identifier *ident, ELObj *obj,
+                                       const Location &loc, Interpreter &interp)
+{
+  Identifier::SyntacticKey key;
+  if (ident->syntacticKey(key)) {
+    switch (key) {
+    case Identifier::keyIsSpace:
+      if (interp.convertBooleanC(obj, ident, loc, nic_->isSpace))
+        nic_->specifiedC |= (1 << FOTBuilder::CharacterNIC::cIsSpace);
+      return;
+    case Identifier::keyIsRecordEnd:
+      if (interp.convertBooleanC(obj, ident, loc, nic_->isRecordEnd))
+        nic_->specifiedC |= (1 << FOTBuilder::CharacterNIC::cIsRecordEnd);
+      return;
+    case Identifier::keyIsInputTab:
+      if (interp.convertBooleanC(obj, ident, loc, nic_->isInputTab))
+        nic_->specifiedC |= (1 << FOTBuilder::CharacterNIC::cIsInputTab);
+      return;
+    case Identifier::keyIsInputWhitespace:
+      if (interp.convertBooleanC(obj, ident, loc, nic_->isInputWhitespace))
+        nic_->specifiedC |= (1 << FOTBuilder::CharacterNIC::cIsInputWhitespace);
+      return;
+    case Identifier::keyIsPunct:
+      if (interp.convertBooleanC(obj, ident, loc, nic_->isPunct))
+        nic_->specifiedC |= (1 << FOTBuilder::CharacterNIC::cIsPunct);
+      return;
+    case Identifier::keyIsDropAfterLineBreak:
+      if (interp.convertBooleanC(obj, ident, loc, nic_->isDropAfterLineBreak))
+        nic_->specifiedC |= (1 << FOTBuilder::CharacterNIC::cIsDropAfterLineBreak);
+      return;
+    case Identifier::keyIsDropUnlessBeforeLineBreak:
+      if (interp.convertBooleanC(obj, ident, loc, nic_->isDropUnlessBeforeLineBreak))
+        nic_->specifiedC |= (1 << FOTBuilder::CharacterNIC::cIsDropUnlessBeforeLineBreak);
+      return;
+    case Identifier::keyBreakBeforePriority:
+      if (interp.convertIntegerC(obj, ident, loc, nic_->breakBeforePriority))
+        nic_->specifiedC |= (1 << FOTBuilder::CharacterNIC::cBreakBeforePriority);
+      return;
+    case Identifier::keyBreakAfterPriority:
+      if (interp.convertIntegerC(obj, ident, loc, nic_->breakAfterPriority))
+        nic_->specifiedC |= (1 << FOTBuilder::CharacterNIC::cBreakAfterPriority);
+      return;
+    case Identifier::keyScript:
+      {
+       if (obj == interp.makeFalse())
+         nic_->script = 0;
+       else {
+         StringC tem;
+         if (!interp.convertStringC(obj, ident, loc, tem))
+           return;
+         nic_->script = interp.storePublicId(tem.data(), tem.size(), loc);
+       }
+        nic_->specifiedC |= (1 << FOTBuilder::CharacterNIC::cScript);
+      }
+      return;
+    case Identifier::keyChar:
+      if (setImplicitChar(obj, loc, interp)) { 
+        nic_->specifiedC |= (1 << FOTBuilder::CharacterNIC::cChar);
+        if (!(nic_->specifiedC & (1 << FOTBuilder::CharacterNIC::cIsInputTab))) 
+          nic_->isInputTab = 0;
+        if (!(nic_->specifiedC & (1 << FOTBuilder::CharacterNIC::cIsInputWhitespace))) 
+          nic_->isInputWhitespace = 0;
+      }
+      return;
+    case Identifier::keyGlyphId:
+      {
+       if (obj == interp.makeFalse()) {
+         nic_->glyphId = FOTBuilder::GlyphId();
+         nic_->specifiedC |= (1 << FOTBuilder::CharacterNIC::cGlyphId);
+         return;
+       }
+       const FOTBuilder::GlyphId *p = obj->glyphId();
+       if (!p) {
+         interp.setNextLocation(loc);
+         interp.message(InterpreterMessages::invalidCharacteristicValue,
+                        StringMessageArg(ident->name()));
+         return;
+       }
+       nic_->glyphId = *p;
+       nic_->specifiedC |= (1 << FOTBuilder::CharacterNIC::cGlyphId);
+      }
+      return;
+    case Identifier::keyMathFontPosture:
+      {
+       static FOTBuilder::Symbol vals[] = {
+         FOTBuilder::symbolFalse,
+         FOTBuilder::symbolNotApplicable,
+         FOTBuilder::symbolUpright,
+         FOTBuilder::symbolOblique,
+         FOTBuilder::symbolBackSlantedOblique,
+         FOTBuilder::symbolItalic,
+         FOTBuilder::symbolBackSlantedItalic,
+       };
+       if (interp.convertEnumC(vals, SIZEOF(vals), obj, ident, loc, nic_->mathFontPosture))
+         nic_->specifiedC |= (1 << FOTBuilder::CharacterNIC::cMathFontPosture);
+      }
+      return;
+    case Identifier::keyMathClass:
+      {
+       static FOTBuilder::Symbol vals[] = {
+         FOTBuilder::symbolOrdinary,
+         FOTBuilder::symbolOperator,
+         FOTBuilder::symbolBinary,
+         FOTBuilder::symbolRelation,
+         FOTBuilder::symbolOpening,
+         FOTBuilder::symbolClosing,
+         FOTBuilder::symbolPunctuation,
+         FOTBuilder::symbolInner,
+         FOTBuilder::symbolSpace,
+       };
+       if (interp.convertEnumC(vals, SIZEOF(vals), obj, ident, loc, nic_->mathClass))
+         nic_->specifiedC |= (1 << FOTBuilder::CharacterNIC::cMathClass);
+      }
+      return;
+    case Identifier::keyStretchFactor:
+      interp.convertRealC(obj, ident, loc, nic_->stretchFactor);
+      return;
+    default:
+      break;
+    }
+  }
+  else {
+    unsigned part;
+    Location loc;
+    if (ident->charNICDefined(part, loc))
+      return;
+  }
+  CANNOT_HAPPEN();
+}
+
+bool CharacterFlowObj::hasNonInheritedC(const Identifier *ident) const
+{
+  Identifier::SyntacticKey key;
+  if (ident->syntacticKey(key)) {
+    switch (key) {
+    case Identifier::keyChar:
+    case Identifier::keyGlyphId:
+    case Identifier::keyIsSpace:
+    case Identifier::keyIsRecordEnd:
+    case Identifier::keyIsInputTab:
+    case Identifier::keyIsInputWhitespace:
+    case Identifier::keyIsPunct:
+    case Identifier::keyIsDropAfterLineBreak:
+    case Identifier::keyIsDropUnlessBeforeLineBreak:
+    case Identifier::keyScript:
+    case Identifier::keyMathClass:
+    case Identifier::keyMathFontPosture:
+    case Identifier::keyStretchFactor:
+    case Identifier::keyBreakBeforePriority:
+    case Identifier::keyBreakAfterPriority:
+      return 1;
+    default:
+      break;
+    }
+  } 
+  unsigned part;
+  Location loc;
+  if (ident->charNICDefined(part, loc))
+    return 1;
+  return 0;
+}
+
+FlowObj *CharacterFlowObj::copy(Collector &c) const
+{
+  return new (c) CharacterFlowObj(*this);
+}
+
+class MathSequenceFlowObj : public CompoundFlowObj {
+public:
+  MathSequenceFlowObj() { }
+  void processInner(ProcessContext &context) {
+    FOTBuilder &fotb = context.currentFOTBuilder();
+    fotb.startMathSequence();
+    CompoundFlowObj::processInner(context);
+    fotb.endMathSequence();
+  }
+  FlowObj *copy(Collector &c) const {
+    return new (c) MathSequenceFlowObj(*this);
+  }
+};
+
+class FractionFlowObj : public CompoundFlowObj {
+public:
+  FractionFlowObj() { }
+  void processInner(ProcessContext &);
+  FlowObj *copy(Collector &) const;
+};
+
+void FractionFlowObj::processInner(ProcessContext &context)
+{
+  FOTBuilder &fotb = context.currentFOTBuilder();
+  Vector<FOTBuilder *> fotbs(2);
+  fotb.startFraction(fotbs[0], fotbs[1]);
+  Vector<size_t> dep;
+  StyleObj *fractionBarStyle = 0;
+  SosofoObj *sosofo
+    = context.currentStyleStack().actual(context.vm().interp->fractionBarC(),
+                                        *context.vm().interp, dep)->asSosofo();
+  if (sosofo)
+    sosofo->ruleStyle(context, fractionBarStyle);
+  if (fractionBarStyle)
+    context.currentStyleStack().push(fractionBarStyle, context.vm(), fotb);
+  fotb.fractionBar();
+  if (fractionBarStyle)
+    context.currentStyleStack().pop();
+  Vector<SymbolObj *> labels(2);
+  labels[0] = context.vm().interp->portName(Interpreter::portNumerator);
+  labels[1] = context.vm().interp->portName(Interpreter::portDenominator);
+  context.pushPorts(0, labels, fotbs);
+  // Fraction flow object doesn't have principal port,
+  // so clear the current connection.
+  CompoundFlowObj::processInner(context);
+  context.popPorts();
+  fotb.endFraction();
+}
+
+FlowObj *FractionFlowObj::copy(Collector &c) const
+{
+  return new (c) FractionFlowObj(*this);
+}
+
+class UnmathFlowObj : public CompoundFlowObj {
+public:
+  UnmathFlowObj() { }
+  void processInner(ProcessContext &context) {
+    FOTBuilder &fotb = context.currentFOTBuilder();
+    fotb.startUnmath();
+    CompoundFlowObj::processInner(context);
+    fotb.endUnmath();
+  }
+  FlowObj *copy(Collector &c) const {
+    return new (c) UnmathFlowObj(*this);
+  }
+};
+
+class SuperscriptFlowObj : public CompoundFlowObj {
+public:
+  SuperscriptFlowObj() { }
+  void processInner(ProcessContext &context) {
+    FOTBuilder &fotb = context.currentFOTBuilder();
+    fotb.startSuperscript();
+    CompoundFlowObj::processInner(context);
+    fotb.endSuperscript();
+  }
+  FlowObj *copy(Collector &c) const {
+    return new (c) SuperscriptFlowObj(*this);
+  }
+};
+
+class SubscriptFlowObj : public CompoundFlowObj {
+public:
+  SubscriptFlowObj() { }
+  void processInner(ProcessContext &context) {
+    FOTBuilder &fotb = context.currentFOTBuilder();
+    fotb.startSubscript();
+    CompoundFlowObj::processInner(context);
+    fotb.endSubscript();
+  }
+  FlowObj *copy(Collector &c) const {
+    return new (c) SubscriptFlowObj(*this);
+  }
+};
+
+class ScriptFlowObj : public CompoundFlowObj {
+public:
+  ScriptFlowObj() { }
+  void processInner(ProcessContext &);
+  FlowObj *copy(Collector &c) const {
+    return new (c) ScriptFlowObj(*this);
+  }
+
+};
+
+void ScriptFlowObj::processInner(ProcessContext &context)
+{
+  FOTBuilder &fotb = context.currentFOTBuilder();
+  Vector<FOTBuilder *> fotbs(6);
+  fotb.startScript(fotbs[0], fotbs[1], fotbs[2], fotbs[3],
+                   fotbs[4], fotbs[5]);
+  Vector<SymbolObj *> labels(6);
+  labels[0] = context.vm().interp->portName(Interpreter::portPreSup);
+  labels[1] = context.vm().interp->portName(Interpreter::portPreSub);
+  labels[2] = context.vm().interp->portName(Interpreter::portPostSup);
+  labels[3] = context.vm().interp->portName(Interpreter::portPostSub);
+  labels[4] = context.vm().interp->portName(Interpreter::portMidSup);
+  labels[5] = context.vm().interp->portName(Interpreter::portMidSub);
+  context.pushPorts(1, labels, fotbs);
+  CompoundFlowObj::processInner(context);
+  context.popPorts();
+  fotb.endScript();
+}
+
+class MarkFlowObj : public CompoundFlowObj {
+public:
+  MarkFlowObj() { }
+  void processInner(ProcessContext &);
+  FlowObj *copy(Collector &c) const {
+    return new (c) MarkFlowObj(*this);
+  }
+};
+
+void MarkFlowObj::processInner(ProcessContext &context)
+{
+  FOTBuilder &fotb = context.currentFOTBuilder();
+  Vector<FOTBuilder *> fotbs(2);
+  fotb.startMark(fotbs[0], fotbs[1]);
+  Vector<SymbolObj *> labels(2);
+  labels[0] = context.vm().interp->portName(Interpreter::portOverMark);
+  labels[1] = context.vm().interp->portName(Interpreter::portUnderMark);
+  context.pushPorts(1, labels, fotbs);
+  CompoundFlowObj::processInner(context);
+  context.popPorts();
+  fotb.endMark();
+}
+
+class FenceFlowObj : public CompoundFlowObj {
+public:
+  FenceFlowObj() { }
+  void processInner(ProcessContext &);
+  FlowObj *copy(Collector &c) const {
+    return new (c) FenceFlowObj(*this);
+  }
+};
+
+void FenceFlowObj::processInner(ProcessContext &context)
+{
+  FOTBuilder &fotb = context.currentFOTBuilder();
+  Vector<FOTBuilder *> fotbs(2);
+  fotb.startFence(fotbs[0], fotbs[1]);
+  Vector<SymbolObj *> labels(2);
+  labels[0] = context.vm().interp->portName(Interpreter::portOpen);
+  labels[1] = context.vm().interp->portName(Interpreter::portClose);
+  context.pushPorts(1, labels, fotbs);
+  CompoundFlowObj::processInner(context);
+  context.popPorts();
+  fotb.endFence();
+}
+
+class RadicalFlowObj : public CompoundFlowObj {
+public:
+  RadicalFlowObj() : radical_(0) { }
+  void processInner(ProcessContext &);
+  FlowObj *copy(Collector &c) const {
+    return new (c) RadicalFlowObj(*this);
+  }
+  void setNonInheritedC(const Identifier *, ELObj *,
+                       const Location &, Interpreter &);
+  bool hasNonInheritedC(const Identifier *) const;
+  void traceSubObjects(Collector &c) const {
+    c.trace(radical_);
+    CompoundFlowObj::traceSubObjects(c);
+  }
+private:
+  SosofoObj *radical_;
+};
+
+void RadicalFlowObj::processInner(ProcessContext &context)
+{
+  FOTBuilder &fotb = context.currentFOTBuilder();
+  Vector<FOTBuilder *> fotbs(1);
+  fotb.startRadical(fotbs[0]);
+  StyleObj *style;
+  FOTBuilder::CharacterNIC nic;
+  if (radical_ && radical_->characterStyle(context, style, nic)) {
+    if (style)
+      context.currentStyleStack().push(style, context.vm(), fotb);
+    fotb.radicalRadical(nic);
+    if (style)
+      context.currentStyleStack().pop();
+  }
+  else 
+    fotb.radicalRadicalDefaulted();
+  Vector<SymbolObj *> labels(1);
+  labels[0] = context.vm().interp->portName(Interpreter::portDegree);
+  context.pushPorts(1, labels, fotbs);
+  CompoundFlowObj::processInner(context);
+  context.popPorts();
+  fotb.endRadical();
+}
+
+bool RadicalFlowObj::hasNonInheritedC(const Identifier *ident) const
+{
+  Identifier::SyntacticKey key;
+  return ident->syntacticKey(key) && key == Identifier::keyRadical;
+}
+
+void RadicalFlowObj::setNonInheritedC(const Identifier *ident, ELObj *obj,
+                                     const Location &loc, Interpreter &interp)
+{
+  radical_ = obj->asSosofo();
+  if (!radical_ || !radical_->isCharacter()) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::invalidCharacteristicValue,
+                  StringMessageArg(ident->name()));
+  }
+}
+
+class MathOperatorFlowObj : public CompoundFlowObj {
+public:
+  MathOperatorFlowObj() { }
+  void processInner(ProcessContext &);
+  FlowObj *copy(Collector &c) const {
+    return new (c) MathOperatorFlowObj(*this);
+  }
+};
+
+void MathOperatorFlowObj::processInner(ProcessContext &context)
+{
+  FOTBuilder &fotb = context.currentFOTBuilder();
+  Vector<FOTBuilder *> fotbs(3);
+  fotb.startMathOperator(fotbs[0], fotbs[1], fotbs[2]);
+  Vector<SymbolObj *> labels(3);
+  labels[0] = context.vm().interp->portName(Interpreter::portOperator);
+  labels[1] = context.vm().interp->portName(Interpreter::portLowerLimit);
+  labels[2] = context.vm().interp->portName(Interpreter::portUpperLimit);
+  context.pushPorts(1, labels, fotbs);
+  CompoundFlowObj::processInner(context);
+  context.popPorts();
+  fotb.endMathOperator();
+}
+
+class GridFlowObj : public CompoundFlowObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  GridFlowObj();
+  GridFlowObj(const GridFlowObj &);
+  void processInner(ProcessContext &);
+  FlowObj *copy(Collector &c) const {
+    return new (c) GridFlowObj(*this);
+  }
+  void setNonInheritedC(const Identifier *, ELObj *,
+                       const Location &, Interpreter &);
+  bool hasNonInheritedC(const Identifier *) const;
+private:
+  Owner<FOTBuilder::GridNIC> nic_;
+};
+
+GridFlowObj::GridFlowObj()
+: nic_(new FOTBuilder::GridNIC)
+{
+}
+
+GridFlowObj::GridFlowObj(const GridFlowObj &fo)
+: CompoundFlowObj(fo), nic_(new FOTBuilder::GridNIC(*fo.nic_))
+{
+}
+
+void GridFlowObj::processInner(ProcessContext &context)
+{
+  FOTBuilder &fotb = context.currentFOTBuilder();
+  fotb.startGrid(*nic_);
+  CompoundFlowObj::processInner(context);
+  fotb.endGrid();
+}
+
+void GridFlowObj::setNonInheritedC(const Identifier *ident, ELObj *obj,
+                                       const Location &loc, Interpreter &interp)
+{
+  long tem;
+  if (!interp.convertIntegerC(obj, ident, loc, tem))
+    return;
+  if (tem <= 0) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::invalidCharacteristicValue,
+                  StringMessageArg(ident->name()));
+    return;
+  }
+  Identifier::SyntacticKey key;
+  if (ident->syntacticKey(key)) {
+    switch (key) {
+    case Identifier::keyGridNColumns:
+      nic_->nColumns = tem;
+      return;
+    case Identifier::keyGridNRows:
+      nic_->nRows = tem;
+      return;
+    default:
+      break;
+    }
+  }
+  CANNOT_HAPPEN();
+}
+
+bool GridFlowObj::hasNonInheritedC(const Identifier *ident) const
+{
+  Identifier::SyntacticKey key;
+  if (ident->syntacticKey(key)) {
+    switch (key) {
+    case Identifier::keyGridNColumns:
+    case Identifier::keyGridNRows:
+      return 1;
+    default:
+      break;
+    }
+  }
+  return 0;
+}
+
+class GridCellFlowObj : public CompoundFlowObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  GridCellFlowObj();
+  GridCellFlowObj(const GridCellFlowObj &);
+  void processInner(ProcessContext &);
+  FlowObj *copy(Collector &c) const {
+    return new (c) GridCellFlowObj(*this);
+  }
+  void setNonInheritedC(const Identifier *, ELObj *,
+                       const Location &, Interpreter &);
+  bool hasNonInheritedC(const Identifier *) const;
+private:
+  Owner<FOTBuilder::GridCellNIC> nic_;
+};
+
+GridCellFlowObj::GridCellFlowObj()
+: nic_(new FOTBuilder::GridCellNIC)
+{
+}
+
+GridCellFlowObj::GridCellFlowObj(const GridCellFlowObj &fo)
+: CompoundFlowObj(fo), nic_(new FOTBuilder::GridCellNIC(*fo.nic_))
+{
+}
+
+void GridCellFlowObj::processInner(ProcessContext &context)
+{
+  FOTBuilder &fotb = context.currentFOTBuilder();
+  fotb.startGridCell(*nic_);
+  CompoundFlowObj::processInner(context);
+  fotb.endGridCell();
+}
+
+void GridCellFlowObj::setNonInheritedC(const Identifier *ident, ELObj *obj,
+                                      const Location &loc, Interpreter &interp)
+{
+  long tem;
+  if (!interp.convertIntegerC(obj, ident, loc, tem))
+    return;
+  if (tem <= 0) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::invalidCharacteristicValue,
+                  StringMessageArg(ident->name()));
+    return;
+  }
+  Identifier::SyntacticKey key;
+  if (ident->syntacticKey(key)) {
+    switch (key) {
+    case Identifier::keyColumnNumber:
+      nic_->columnNumber = tem;
+      return;
+    case Identifier::keyRowNumber:
+      nic_->rowNumber = tem;
+      return;
+    default:
+      break;
+    }
+  }
+  CANNOT_HAPPEN();
+}
+
+bool GridCellFlowObj::hasNonInheritedC(const Identifier *ident) const
+{
+  Identifier::SyntacticKey key;
+  if (ident->syntacticKey(key)) {
+    switch (key) {
+    case Identifier::keyColumnNumber:
+    case Identifier::keyRowNumber:
+      return 1;
+    default:
+      break;
+    }
+  }
+  return 0;
+}
+
+class TableFlowObj : public CompoundFlowObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  struct NIC : public FOTBuilder::TableNIC {
+    NIC() : beforeRowBorder(0), afterRowBorder(0),
+            beforeColumnBorder(0), afterColumnBorder(0) { }
+    StyleObj *beforeRowBorder;
+    StyleObj *afterRowBorder;
+    StyleObj *beforeColumnBorder;
+    StyleObj *afterColumnBorder;
+  };
+  TableFlowObj() : nic_(new NIC) { }
+  TableFlowObj(const TableFlowObj &fo) : CompoundFlowObj(fo), nic_(new NIC(*fo.nic_)) { }
+  void processInner(ProcessContext &context) {
+    context.startTable();
+    FOTBuilder &fotb = context.currentFOTBuilder();
+    fotb.startTable(*nic_);
+    Interpreter &interp = *context.vm().interp;
+    Vector<size_t> dep;
+    ELObj *obj = context.currentStyleStack().actual(interp.tableBorderC(), interp, dep);
+    StyleObj *borderStyle;
+    if (obj == interp.makeFalse())
+      borderStyle = interp.borderFalseStyle();
+    else if (obj == interp.makeTrue())
+      borderStyle = interp.borderTrueStyle();
+    else {
+      SosofoObj *sosofo = obj->asSosofo();
+      if (!sosofo || !sosofo->tableBorderStyle(borderStyle))
+       borderStyle = 0;
+    }
+    border(nic_->beforeRowBorder, borderStyle, &FOTBuilder::tableBeforeRowBorder, context);
+    border(nic_->afterRowBorder, borderStyle, &FOTBuilder::tableAfterRowBorder, context);
+    border(nic_->beforeColumnBorder, borderStyle, &FOTBuilder::tableBeforeColumnBorder, context);
+    border(nic_->afterColumnBorder, borderStyle, &FOTBuilder::tableAfterColumnBorder, context);
+    CompoundFlowObj::processInner(context);
+    if (context.inTableRow())
+      context.endTableRow();
+    context.endTable();
+    fotb.endTable();
+  }
+  FlowObj *copy(Collector &c) const {
+    return new (c) TableFlowObj(*this);
+  }
+  bool hasNonInheritedC(const Identifier *ident) const {
+    Identifier::SyntacticKey key;
+    if (ident->syntacticKey(key)) {
+      switch (key) {
+      case Identifier::keyBeforeRowBorder:
+      case Identifier::keyAfterRowBorder:
+      case Identifier::keyBeforeColumnBorder:
+      case Identifier::keyAfterColumnBorder:
+      case Identifier::keyTableWidth:
+       return 1;
+      default:
+       break;
+      }
+    }
+    return isDisplayNIC(ident);
+  }
+  void setNonInheritedC(const Identifier *ident, ELObj *obj,
+                        const Location &loc, Interpreter &interp) {
+    if (setDisplayNIC(*nic_, ident, obj, loc, interp))
+      return;
+    Identifier::SyntacticKey key;
+    if (!ident->syntacticKey(key))
+      CANNOT_HAPPEN();
+    if (key == Identifier::keyTableWidth) {
+      if (obj == interp.makeFalse())
+       nic_->widthType = FOTBuilder::TableNIC::widthMinimum;
+      else if (interp.convertLengthSpecC(obj, ident, loc, nic_->width))
+       nic_->widthType = FOTBuilder::TableNIC::widthExplicit;
+      return;
+    }
+    StyleObj *style;
+    SosofoObj *sosofo = obj->asSosofo();
+    if (!sosofo || !sosofo->tableBorderStyle(style)) {
+      Boolean b;
+      if (!interp.convertBooleanC(obj, ident, loc, b))
+       return;
+      style = b ? interp.borderTrueStyle() : interp.borderFalseStyle();
+    }
+    switch (key) {
+    case Identifier::keyBeforeRowBorder:
+      nic_->beforeRowBorder = style;
+      break;
+    case Identifier::keyAfterRowBorder:
+      nic_->afterRowBorder = style;
+      break;
+    case Identifier::keyBeforeColumnBorder:
+      nic_->beforeColumnBorder = style;
+      break;
+    case Identifier::keyAfterColumnBorder:
+      nic_->afterColumnBorder = style;
+      break;
+    default:
+      CANNOT_HAPPEN();
+    }
+  }
+private:
+  void border(StyleObj *style, StyleObj *style2,
+              void (FOTBuilder::*setter)(), ProcessContext &context) {
+    FOTBuilder &fotb = context.currentFOTBuilder();
+    if (!style)
+      style = style2;
+    if (style)
+      context.currentStyleStack().push(style, context.vm(), fotb);
+    (fotb.*setter)();
+    if (style)
+      context.currentStyleStack().pop();
+  }
+  Owner<NIC> nic_;
+};
+
+class TablePartFlowObj : public CompoundFlowObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  TablePartFlowObj() : nic_(new FOTBuilder::TablePartNIC) { }
+  TablePartFlowObj(const TablePartFlowObj &fo)
+    : CompoundFlowObj(fo), nic_(new FOTBuilder::TablePartNIC(*fo.nic_)) { }
+  void processInner(ProcessContext &context) {
+    context.startTablePart();
+    FOTBuilder &fotb = context.currentFOTBuilder();
+    Vector<FOTBuilder *> fotbs(2);
+    fotb.startTablePart(*nic_, fotbs[0], fotbs[1]);
+    Vector<SymbolObj *> labels(2);
+    labels[0] = context.vm().interp->portName(Interpreter::portHeader);
+    labels[1] = context.vm().interp->portName(Interpreter::portFooter);
+    context.pushPorts(1, labels, fotbs);
+    CompoundFlowObj::processInner(context);
+    context.popPorts();
+    if (context.inTableRow())
+      context.endTableRow();
+    context.endTablePart();
+    fotb.endTablePart();
+  }
+  FlowObj *copy(Collector &c) const {
+    return new (c) TablePartFlowObj(*this);
+  }
+  void setNonInheritedC(const Identifier *ident, ELObj *obj,
+                       const Location &loc, Interpreter &interp) {
+    setDisplayNIC(*nic_, ident, obj, loc, interp);
+  }
+  bool hasNonInheritedC(const Identifier *ident) const {
+    if (!isDisplayNIC(ident))
+      return 0;
+    Identifier::SyntacticKey key;
+    ident->syntacticKey(key);
+    if (key == Identifier::keyPositionPreference)
+      return 0;
+    return 1;
+  }
+private:
+  Owner<FOTBuilder::TablePartNIC> nic_;
+};
+
+class TableColumnFlowObj : public FlowObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  struct NIC : public FOTBuilder::TableColumnNIC {
+    NIC() : hasColumnNumber(0) { }
+    bool hasColumnNumber;
+  };
+  TableColumnFlowObj() : nic_(new NIC) { }
+  TableColumnFlowObj(const TableColumnFlowObj &fo) : FlowObj(fo), nic_(new NIC(*fo.nic_)) { }
+  void processInner(ProcessContext &context) {
+    if (nic_->hasColumnNumber) {
+      context.currentFOTBuilder().tableColumn(*nic_);
+      context.addTableColumn(nic_->columnIndex, nic_->nColumnsSpanned, style_);
+    }
+    else {
+      FOTBuilder::TableColumnNIC nic(*nic_);
+      nic.columnIndex = context.currentTableColumn();
+      context.currentFOTBuilder().tableColumn(nic);
+      context.addTableColumn(nic.columnIndex, nic_->nColumnsSpanned, style_);
+    }
+  }
+  FlowObj *copy(Collector &c) const {
+    return new (c) TableColumnFlowObj(*this);
+  }
+  bool hasNonInheritedC(const Identifier *ident) const {
+    Identifier::SyntacticKey key;
+    if (ident->syntacticKey(key)) {
+      switch (key) {
+      case Identifier::keyColumnNumber:
+      case Identifier::keyNColumnsSpanned:
+      case Identifier::keyWidth:
+       return 1;
+      default:
+       break;
+      }
+    }
+    return 0;
+  }
+  void setNonInheritedC(const Identifier *ident, ELObj *obj,
+                       const Location &loc, Interpreter &interp) {
+    Identifier::SyntacticKey key;
+    if (ident->syntacticKey(key)) {
+      switch (key) {
+      case Identifier::keyColumnNumber:
+      case Identifier::keyNColumnsSpanned:
+       {
+         long n;
+         if (!interp.convertIntegerC(obj, ident, loc, n))
+           return;
+          if (n <= 0) {
+           interp.setNextLocation(loc);
+            interp.message(InterpreterMessages::invalidCharacteristicValue,
+                          StringMessageArg(ident->name()));
+           return;
+          }
+         if (key == Identifier::keyColumnNumber) {
+           nic_->columnIndex = n - 1;
+           nic_->hasColumnNumber = 1;
+         }
+         else
+           nic_->nColumnsSpanned = n;
+       }
+       return;
+      case Identifier::keyWidth:
+       {
+         const LengthSpec *ls = obj->lengthSpec();
+         if (ls) {
+           // width is a TableLengthSpec not just a LengthSpec
+           if (ls->convert(nic_->width))
+             nic_->hasWidth = 1;
+           else
+             interp.invalidCharacteristicValue(ident, loc);
+         }
+         else if (interp.convertLengthSpecC(obj, ident, loc, nic_->width))
+           nic_->hasWidth = 1;
+       }
+       return;
+      default:
+       break;
+      }
+    }
+    CANNOT_HAPPEN();
+  }
+private:
+  Owner<NIC> nic_;
+};
+
+class TableRowFlowObj : public CompoundFlowObj {
+public:
+  TableRowFlowObj() { }
+  void pushStyle(ProcessContext &, unsigned &) {  }
+  void popStyle(ProcessContext &, unsigned) {  }
+  void processInner(ProcessContext &context) {
+    if (!context.inTable()) {
+      // FIXME location
+      context.vm().interp->message(InterpreterMessages::tableRowOutsideTable);
+      CompoundFlowObj::processInner(context);
+      return;
+    }
+    if (context.inTableRow())
+      context.endTableRow();
+    context.startTableRow(style_);
+    CompoundFlowObj::processInner(context);
+    if (context.inTableRow())
+      context.endTableRow();
+    // else FIXME give an error
+    // must have used ends-row? in a table-row
+  }
+  FlowObj *copy(Collector &c) const {
+    return new (c) TableRowFlowObj(*this);
+  }
+};
+
+class TableCellFlowObj : public CompoundFlowObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  struct NIC : FOTBuilder::TableCellNIC {
+    NIC() : startsRow(0), endsRow(0), hasColumnNumber(0) { }
+    bool hasColumnNumber;
+    bool startsRow;
+    bool endsRow;
+  };
+  TableCellFlowObj(bool missing = 0) : nic_(new NIC) {
+    if (missing)
+      nic_->missing = 1;
+  }
+  TableCellFlowObj(const TableCellFlowObj &fo) : CompoundFlowObj(fo), nic_(new NIC(*fo.nic_)) { }
+  void pushStyle(ProcessContext &context, unsigned &nPush) {
+    if (context.inTableRow()) {
+      if (nic_->startsRow) {
+       context.endTableRow();
+       context.startTableRow(0);
+      }
+    }
+    else
+      context.startTableRow(0);
+    unsigned columnNumber
+      = nic_->hasColumnNumber ? nic_->columnIndex : context.currentTableColumn();
+    StyleObj *columnStyle = context.tableColumnStyle(columnNumber, nic_->nColumnsSpanned);
+    if (columnStyle) {
+      context.currentStyleStack().push(columnStyle, context.vm(), context.currentFOTBuilder());
+      context.currentFOTBuilder().startSequence();
+      nPush++;
+    }
+    StyleObj *rowStyle = context.tableRowStyle();
+    if (rowStyle) {
+      context.currentStyleStack().push(rowStyle, context.vm(), context.currentFOTBuilder());
+      context.currentFOTBuilder().startSequence();
+      nPush++;
+    }
+    CompoundFlowObj::pushStyle(context, nPush);
+  }
+  void popStyle(ProcessContext &context, unsigned nPush) {
+    CompoundFlowObj::popStyle(context, nPush);
+    for (unsigned i = 0; i < nPush; i++) {
+      context.currentFOTBuilder().endSequence();
+      context.currentStyleStack().pop();
+    }
+    if (nic_->endsRow)
+      context.endTableRow();
+  }
+  void processInner(ProcessContext &context) {
+    if (!context.inTable()) {
+      // FIXME location
+      context.vm().interp->message(InterpreterMessages::tableCellOutsideTable);
+      CompoundFlowObj::processInner(context);
+      return;
+    }
+    FOTBuilder &fotb = context.currentFOTBuilder();
+    if (!nic_->hasColumnNumber) {
+      FOTBuilder::TableCellNIC nic(*nic_);
+      nic.columnIndex = context.currentTableColumn();
+      fotb.startTableCell(nic);
+      if (!nic_->missing)
+       context.noteTableCell(nic.columnIndex, nic.nColumnsSpanned, nic.nRowsSpanned);
+    }
+    else {
+      fotb.startTableCell(*nic_);
+      if (!nic_->missing)
+       context.noteTableCell(nic_->columnIndex, nic_->nColumnsSpanned, nic_->nRowsSpanned);
+    }
+    Interpreter &interp = *context.vm().interp;
+    border(interp.cellBeforeRowBorderC(), &FOTBuilder::tableCellBeforeRowBorder, context);
+    border(interp.cellAfterRowBorderC(), &FOTBuilder::tableCellAfterRowBorder, context);
+    border(interp.cellBeforeColumnBorderC(), &FOTBuilder::tableCellBeforeColumnBorder, context);
+    border(interp.cellAfterColumnBorderC(), &FOTBuilder::tableCellAfterColumnBorder, context);
+    CompoundFlowObj::processInner(context);
+    fotb.endTableCell();
+  }
+  FlowObj *copy(Collector &c) const {
+    return new (c) TableCellFlowObj(*this);
+  }
+  bool hasNonInheritedC(const Identifier *ident) const {
+    Identifier::SyntacticKey key;
+    if (ident->syntacticKey(key)) {
+      switch (key) {
+      case Identifier::keyNRowsSpanned:
+       return 1;
+      default:
+       break;
+      }
+    }
+    return 0;
+  }
+  bool hasPseudoNonInheritedC(const Identifier *ident) const {
+    Identifier::SyntacticKey key;
+    if (ident->syntacticKey(key)) {
+      switch (key) {
+      case Identifier::keyColumnNumber:
+      case Identifier::keyNColumnsSpanned:
+      case Identifier::keyIsStartsRow:
+      case Identifier::keyIsEndsRow:
+       return 1;
+      default:
+       break;
+      }
+    }
+    return 0;
+  }
+  void setNonInheritedC(const Identifier *ident, ELObj *obj,
+                       const Location &loc, Interpreter &interp) {
+    Identifier::SyntacticKey key;
+    if (ident->syntacticKey(key)) {
+      switch (key) {
+      case Identifier::keyIsStartsRow:
+        interp.convertBooleanC(obj, ident, loc, nic_->startsRow);
+       return;
+      case Identifier::keyIsEndsRow:
+        interp.convertBooleanC(obj, ident, loc, nic_->endsRow);
+       return;
+      case Identifier::keyColumnNumber:
+      case Identifier::keyNColumnsSpanned:
+      case Identifier::keyNRowsSpanned:
+       {
+         long n;
+          if (!interp.convertIntegerC(obj, ident, loc, n))
+           return;
+          if (n <= 0) {
+           interp.setNextLocation(loc);
+           interp.message(InterpreterMessages::invalidCharacteristicValue,
+                          StringMessageArg(ident->name()));
+           return;
+          }
+         if (key == Identifier::keyColumnNumber) {
+           nic_->columnIndex = n - 1;
+           nic_->hasColumnNumber = 1;
+         }
+         else if (key == Identifier::keyNColumnsSpanned)
+           nic_->nColumnsSpanned = n;
+         else
+           nic_->nRowsSpanned = n;
+       }
+       return;
+      default:
+       break;
+      }
+    }
+    CANNOT_HAPPEN();
+  }
+private:
+  void border(const ConstPtr<InheritedC> &ic, void (FOTBuilder::*setter)(),
+             ProcessContext &context) {
+    Interpreter &interp = *context.vm().interp;
+    Vector<size_t> dep;
+    ELObj *obj = context.currentStyleStack().actual(ic, interp, dep);
+    StyleObj *style;
+    if (obj == interp.makeFalse())
+      style = interp.borderFalseStyle();
+    else if (obj == interp.makeTrue())
+      style = interp.borderTrueStyle();
+    else {
+      SosofoObj *sosofo = obj->asSosofo();
+      if (!sosofo || !sosofo->tableBorderStyle(style))
+       style = 0;
+    }
+    FOTBuilder &fotb = context.currentFOTBuilder();
+    if (style)
+      context.currentStyleStack().push(style, context.vm(), fotb);
+    (fotb.*setter)();
+    if (style)
+      context.currentStyleStack().pop();
+  }
+  Owner<NIC> nic_;
+};
+
+class TableBorderFlowObj : public FlowObj {
+public:
+  TableBorderFlowObj() { }
+  void process(ProcessContext &) { }
+  void processInner(ProcessContext &) { }
+  bool tableBorderStyle(StyleObj *&style) {
+    style = style_;
+    return 1;
+  }
+  FlowObj *copy(Collector &c) const {
+    return new (c) TableBorderFlowObj(*this);
+  }
+};
+
+
+void ProcessContext::startTable()
+{
+  tableStack_.insert(new Table);
+}
+
+void ProcessContext::endTable()
+{
+  coverSpannedRows();
+  delete tableStack_.get();
+}
+
+void ProcessContext::coverSpannedRows()
+{
+  // Generate empty cells to cover any remaining vertical spans
+  Table *table = tableStack_.head();
+  if (!table)
+    return;
+  unsigned n = 0;
+  for (size_t i = 0; i < table->covered.size(); i++)
+    if (table->covered[i] > n)
+      n = table->covered[i];
+  for (; n > 0; n--) {
+    SosofoObj *content = new (*vm().interp) EmptySosofoObj;
+    ELObjDynamicRoot protect(*vm().interp, content);
+    TableRowFlowObj *row = new (*vm().interp) TableRowFlowObj;
+    row->setContent(content);
+    protect = row;
+    row->process(*this);
+  }
+}
+
+void ProcessContext::startTablePart()
+{
+  Table *table = tableStack_.head();
+  if (table) {
+    table->currentColumn = 0;
+    table->rowStyle = 0;
+    table->columnStyles.clear();
+    table->covered.clear();
+    table->nColumns = 0;
+  }
+}
+
+void ProcessContext::endTablePart()
+{
+  coverSpannedRows();
+}
+
+void ProcessContext::addTableColumn(unsigned columnIndex, unsigned span, StyleObj *style)
+{
+  Table *table = tableStack_.head();
+  if (table) {
+    table->currentColumn = columnIndex + span;
+    if (columnIndex >= table->columnStyles.size())
+      table->columnStyles.resize(columnIndex + 1);
+    Vector<StyleObj *> &tem = table->columnStyles[columnIndex];
+    if (span > 0) {
+      while (tem.size() < span)
+       tem.push_back((StyleObj *)0);
+      tem[span - 1] = style;
+    }
+  }
+}
+
+unsigned ProcessContext::currentTableColumn()
+{
+  Table *table = tableStack_.head();
+  if (table)
+    return table->currentColumn;
+  return 0;
+}
+
+void ProcessContext::noteTableCell(unsigned colIndex, unsigned colSpan, unsigned rowSpan)
+{
+  Table *table = tableStack_.head();
+  if (!table)
+    return;
+  table->currentColumn = colIndex + colSpan;
+  Vector<unsigned> &covered = table->covered;
+  for (size_t i = covered.size(); i < colIndex + colSpan; i++)
+    covered.push_back(0);
+  for (size_t i = 0; i < colSpan; i++)
+    covered[colIndex + i] = rowSpan;
+  if (colIndex + colSpan > table->nColumns)
+    table->nColumns = colIndex + colSpan;
+}
+
+StyleObj *ProcessContext::tableColumnStyle(unsigned columnIndex, unsigned span)
+{
+  Table *table = tableStack_.head();
+  if (table) {
+    if (columnIndex < table->columnStyles.size()) {
+      Vector<StyleObj *> &tem = table->columnStyles[columnIndex];
+      if (span > 0 && span <= tem.size())
+       return tem[span - 1];
+    }
+  }
+  return 0;
+}
+StyleObj *ProcessContext::tableRowStyle()
+{
+  Table *table = tableStack_.head();
+  if (table)
+    return table->rowStyle;
+  return 0;
+}
+
+void ProcessContext::startTableRow(StyleObj *style)
+{
+  Table *table = tableStack_.head();
+  if (table) {
+    table->rowStyle = style;
+    table->currentColumn = 0;
+    table->inTableRow = 1;
+    table->rowConnectableLevel = connectionStack_.head()->connectableLevel;
+  }
+  currentFOTBuilder().startTableRow();
+}
+
+void ProcessContext::endTableRow()
+{
+  Table *table = tableStack_.head();
+  if (table) {
+    // Fill in blank cells
+    Vector<unsigned> &covered = table->covered;
+    for (size_t i = 0; i < table->nColumns + 1; i++) {
+      if (i >= covered.size() || !covered[i]) {
+       table->currentColumn = i;
+       SosofoObj *content = new (*vm().interp) EmptySosofoObj;
+       ELObjDynamicRoot protect(*vm().interp, content);
+       // The last cell is a dummy one
+       TableCellFlowObj *cell = new (*vm().interp) TableCellFlowObj(i >= table->nColumns);
+       cell->setContent(content);
+       protect = cell;
+       cell->process(*this);
+      }
+      // cell->process() will cover it
+      if (i < table->nColumns)
+       covered[i] -= 1;
+    }
+    table->inTableRow = 0;
+  }
+  currentFOTBuilder().endTableRow();
+}
+
+bool ProcessContext::inTableRow()
+{
+  Table *table = tableStack_.head();
+  if (table)
+    return table->inTableRow;
+  return 0;
+}
+
+ProcessContext::Table::Table()
+: rowStyle(0), currentColumn(0), inTableRow(0), nColumns(0)
+{
+}
+
+
+// Flow object classes declared with declare-flow-object-class
+// that we don't know about are assumed to have one principal port
+// and accept any non-inherited characteristic.
+
+class UnknownFlowObj : public CompoundFlowObj {
+public:
+  UnknownFlowObj() { }
+  FlowObj *copy(Collector &c) const {
+    return new (c) UnknownFlowObj(*this);
+  }
+  void setNonInheritedC(const Identifier *, ELObj *,
+                       const Location &, Interpreter &) { }
+  bool hasNonInheritedC(const Identifier *ident) const {
+    Identifier::SyntacticKey syn;
+    if (ident->syntacticKey(syn)
+        && (syn == Identifier::keyLabel || syn == Identifier::keyContentMap))
+      return 0;
+    if (!ident->inheritedC().isNull())
+      return 0;
+    return 1;
+  }
+};
+
+class FormattingInstructionFlowObj : public FlowObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  FormattingInstructionFlowObj() { }
+  void processInner(ProcessContext &context) {
+    context.currentFOTBuilder().formattingInstruction(data_);
+  }
+  FlowObj *copy(Collector &c) const {
+    return new (c) FormattingInstructionFlowObj(*this);
+  }
+  void setNonInheritedC(const Identifier *ident, ELObj *obj,
+                       const Location &loc, Interpreter &interp) {
+    interp.convertStringC(obj, ident, loc, data_);
+  }
+  bool hasNonInheritedC(const Identifier *ident) const {
+    Identifier::SyntacticKey key;
+    return ident->syntacticKey(key) && key == Identifier::keyData;
+  }
+private:
+  StringC data_;
+};
+
+class ELObjExtensionFlowObjValue : public FOTBuilder::ExtensionFlowObj::Value {
+public:
+  ELObjExtensionFlowObjValue(const Identifier *ident, ELObj *obj,
+                            const Location &loc, Interpreter &interp)
+  : ident_(ident), obj_(obj), loc_(&loc), interp_(&interp) { }
+  bool convertString(StringC &result) const {
+    return interp_->convertStringC(obj_, ident_, *loc_, result);
+  }
+  bool convertStringPairList(Vector<StringC> &v) const {
+    ELObj *obj = obj_;
+    for (;;) {
+      if (obj->isNil())
+       return 1;       
+      PairObj *pair = obj->asPair();
+      if (!pair)
+       break;
+      obj = pair->cdr();
+      PairObj *att = pair->car()->asPair();
+      if (!att)
+       break;
+      const Char *s;
+      size_t n;
+      if (!att->car()->stringData(s, n))
+       break;
+      v.resize(v.size() + 1);
+      v.back().assign(s, n);
+      att = att->cdr()->asPair();
+      if (!att || !att->car()->stringData(s, n) || !att->cdr()->isNil()) {
+       v.resize(v.size() - 1);
+       break;
+      }
+      v.resize(v.size() + 1);
+      v.back().assign(s, n);
+    }
+    interp_->setNextLocation(*loc_);
+    interp_->message(InterpreterMessages::invalidCharacteristicValue,
+                    StringMessageArg(ident_->name()));
+    return 0;
+  }
+  bool convertStringList(Vector<StringC> &v) const {
+    ELObj *obj = obj_;
+    for (;;) {
+      if (obj->isNil())
+        return 1;       
+      PairObj *pair = obj->asPair();
+      if (!pair)
+        break;
+      const Char *s;
+      size_t n;
+      if (!pair->car()->stringData(s, n))
+        break;
+      v.resize(v.size() + 1);
+      v.back().assign(s, n);
+      obj = pair->cdr();
+    }
+    interp_->setNextLocation(*loc_);
+    interp_->message(InterpreterMessages::invalidCharacteristicValue,
+                     StringMessageArg(ident_->name()));
+    return 0;
+  } 
+  bool convertBoolean(bool &result) const {
+    return interp_->convertBooleanC(obj_, ident_, *loc_, result);
+  }
+private:
+  ELObj *obj_;
+  const Identifier *ident_;
+  const Location *loc_;
+  Interpreter *interp_;
+};
+
+class ExtensionFlowObj : public FlowObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  ExtensionFlowObj(const FOTBuilder::ExtensionFlowObj &);
+  ExtensionFlowObj(const ExtensionFlowObj &);
+  void processInner(ProcessContext &);
+  FlowObj *copy(Collector &) const;
+  bool hasNonInheritedC(const Identifier *) const;
+  void setNonInheritedC(const Identifier *, ELObj *,
+                       const Location &, Interpreter &);
+private:
+  Owner<FOTBuilder::ExtensionFlowObj> fo_;
+};
+
+ExtensionFlowObj::ExtensionFlowObj(const FOTBuilder::ExtensionFlowObj &fo)
+: fo_(fo.copy())
+{
+}
+
+ExtensionFlowObj::ExtensionFlowObj(const ExtensionFlowObj &fo)
+: FlowObj(fo), fo_(fo.fo_->copy())
+{
+}
+
+void ExtensionFlowObj::processInner(ProcessContext &context)
+{
+  context.currentFOTBuilder().extension(*fo_, context.vm().currentNode);
+}
+
+void ExtensionFlowObj::setNonInheritedC(const Identifier *ident,
+                                       ELObj *obj,
+                                       const Location &loc,
+                                       Interpreter &interp)
+{
+  fo_->setNIC(ident->name(), ELObjExtensionFlowObjValue(ident, obj, loc, interp));
+}
+
+bool ExtensionFlowObj::hasNonInheritedC(const Identifier *ident) const
+{
+  return fo_->hasNIC(ident->name());
+}
+
+FlowObj *ExtensionFlowObj::copy(Collector &c) const
+{
+  return new (c) ExtensionFlowObj(*this);
+}
+
+class CompoundExtensionFlowObj : public CompoundFlowObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  CompoundExtensionFlowObj(const FOTBuilder::CompoundExtensionFlowObj &);
+  CompoundExtensionFlowObj(const CompoundExtensionFlowObj &);
+  void processInner(ProcessContext &);
+  FlowObj *copy(Collector &) const;
+  bool hasNonInheritedC(const Identifier *) const;
+  void setNonInheritedC(const Identifier *, ELObj *,
+                       const Location &, Interpreter &);
+private:
+  Owner<FOTBuilder::CompoundExtensionFlowObj> fo_;
+};
+
+CompoundExtensionFlowObj::CompoundExtensionFlowObj(const FOTBuilder::CompoundExtensionFlowObj &fo)
+: fo_(fo.copy()->asCompoundExtensionFlowObj())
+{
+}
+
+CompoundExtensionFlowObj::CompoundExtensionFlowObj(const CompoundExtensionFlowObj &fo)
+: CompoundFlowObj(fo), fo_(fo.fo_->copy()->asCompoundExtensionFlowObj())
+{
+}
+
+void CompoundExtensionFlowObj::processInner(ProcessContext &context)
+{
+  FOTBuilder &fotb = context.currentFOTBuilder();
+  Vector<StringC> portNames;
+  fo_->portNames(portNames);
+  Vector<FOTBuilder *> fotbs(portNames.size());
+  fotb.startExtension(*fo_, context.vm().currentNode, fotbs);
+  if (portNames.size()) {
+    Vector<SymbolObj *> portSyms(portNames.size());
+    for (size_t i = 0; i < portSyms.size(); i++)
+      portSyms[i] = context.vm().interp->makeSymbol(portNames[i]);
+    context.pushPorts(fo_->hasPrincipalPort(), portSyms, fotbs);
+    CompoundFlowObj::processInner(context);
+    context.popPorts();
+  }
+  else
+    CompoundFlowObj::processInner(context);
+  fotb.endExtension(*fo_);
+}
+
+void CompoundExtensionFlowObj::setNonInheritedC(const Identifier *ident,
+                                               ELObj *obj,
+                                               const Location &loc,
+                                               Interpreter &interp)
+{
+  fo_->setNIC(ident->name(), ELObjExtensionFlowObjValue(ident, obj, loc, interp));
+}
+
+bool CompoundExtensionFlowObj::hasNonInheritedC(const Identifier *ident) const
+{
+  return fo_->hasNIC(ident->name());
+}
+
+FlowObj *CompoundExtensionFlowObj::copy(Collector &c) const
+{
+  return new (c) CompoundExtensionFlowObj(*this);
+}
+
+#define FLOW_OBJ(name, string) \
+{ FlowObj *tem = new (*this) name; \
+  lookup(makeStringC(string))->setFlowObj(tem); \
+  makePermanent(tem); }
+
+void Interpreter::installFlowObjs()
+{
+  FLOW_OBJ(SequenceFlowObj, "sequence");
+  FLOW_OBJ(DisplayGroupFlowObj, "display-group");
+  FLOW_OBJ(ParagraphFlowObj, "paragraph");
+  FLOW_OBJ(ParagraphBreakFlowObj, "paragraph-break");
+  FLOW_OBJ(LineFieldFlowObj, "line-field");
+  FLOW_OBJ(ScoreFlowObj, "score");
+  FLOW_OBJ(ExternalGraphicFlowObj, "external-graphic");
+  FLOW_OBJ(RuleFlowObj, "rule");
+  FLOW_OBJ(LeaderFlowObj, "leader");
+  FLOW_OBJ(CharacterFlowObj, "character");
+  FLOW_OBJ(BoxFlowObj, "box");
+  FLOW_OBJ(AlignmentPointFlowObj, "alignment-point");
+  FLOW_OBJ(SidelineFlowObj, "sideline");
+  // simple-page
+  FLOW_OBJ(SimplePageSequenceFlowObj, "simple-page-sequence");
+  // tables
+  FLOW_OBJ(TableFlowObj, "table");
+  FLOW_OBJ(TablePartFlowObj, "table-part");
+  FLOW_OBJ(TableColumnFlowObj, "table-column");
+  FLOW_OBJ(TableRowFlowObj, "table-row");
+  FLOW_OBJ(TableCellFlowObj, "table-cell");
+  FLOW_OBJ(TableBorderFlowObj, "table-border");
+  // online
+  FLOW_OBJ(LinkFlowObj, "link");
+  FLOW_OBJ(ScrollFlowObj, "scroll");
+  FLOW_OBJ(MarginaliaFlowObj, "marginalia");
+  FLOW_OBJ(MultiModeFlowObj, "multi-mode");
+  // math
+  FLOW_OBJ(MathSequenceFlowObj, "math-sequence");
+  FLOW_OBJ(FractionFlowObj, "fraction");
+  FLOW_OBJ(UnmathFlowObj, "unmath");
+  FLOW_OBJ(SuperscriptFlowObj, "superscript");
+  FLOW_OBJ(SubscriptFlowObj, "subscript");
+  FLOW_OBJ(ScriptFlowObj, "script");
+  FLOW_OBJ(MarkFlowObj, "mark");
+  FLOW_OBJ(FenceFlowObj, "fence");
+  FLOW_OBJ(RadicalFlowObj, "radical");
+  FLOW_OBJ(MathOperatorFlowObj, "math-operator");
+  FLOW_OBJ(GridFlowObj, "grid");
+  FLOW_OBJ(GridCellFlowObj, "grid-cell");
+}
+
+void Interpreter::installExtensionFlowObjectClass(Identifier *ident,
+                                                 const StringC &pubid,
+                                                 const Location &loc)
+{
+  FlowObj *tem = 0;
+  if (extensionTable_) {
+    for (const FOTBuilder::Extension *ep = extensionTable_; ep->pubid; ep++) {
+      if (pubid == ep->pubid) {
+       if (ep->flowObj) {
+         const FOTBuilder::CompoundExtensionFlowObj *cFlowObj
+           = ep->flowObj->asCompoundExtensionFlowObj();
+         if (cFlowObj)
+           tem = new (*this) CompoundExtensionFlowObj(*cFlowObj);
+         else
+           tem = new (*this) ExtensionFlowObj(*ep->flowObj);
+       }
+       break;
+      }
+    }
+  }
+  if (!tem) {
+    if (pubid
+        == "UNREGISTERED::James Clark//Flow Object Class::"
+           "formatting-instruction")
+      tem = new (*this) FormattingInstructionFlowObj;
+    else
+      tem = new (*this) UnknownFlowObj;
+  }
+  makePermanent(tem);
+  ident->setFlowObj(tem, currentPartIndex(), loc);
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#include "FlowObj_inst.cxx"
diff --git a/style/FlowObj_inst.m4 b/style/FlowObj_inst.m4
new file mode 100644 (file)
index 0000000..0bd3d7f
--- /dev/null
@@ -0,0 +1,56 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#include "stylelib.h"
+
+#ifdef SP_MANUAL_INST
+
+#define SP_DEFINE_TEMPLATES
+#include "Owner.h"
+#include "CopyOwner.h"
+#undef SP_DEFINE_TEMPLATES
+
+#if _MSC_VER >= 1100
+
+#ifdef SP_NAMESPACE
+namespace SP_NAMESPACE {
+#endif
+
+#ifdef DSSSL_NAMESPACE
+using namespace DSSSL_NAMESPACE;
+#endif
+
+#ifdef GROVE_NAMESPACE
+using namespace GROVE_NAMESPACE;
+#endif
+
+#else
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+#endif
+
+__instantiate(Owner<SimplePageSequenceFlowObj::HeaderFooter>)
+__instantiate(CopyOwner<ScoreFlowObj::Type>)
+__instantiate(Owner<TableFlowObj::NIC>)
+__instantiate(Owner<ScoreFlowObj::Type>)
+__instantiate(Owner<TableColumnFlowObj::NIC>)
+__instantiate(Owner<TableCellFlowObj::NIC>)
+__instantiate(Owner<FOTBuilder::BoxNIC>)
+__instantiate(Owner<FOTBuilder::LeaderNIC>)
+__instantiate(Owner<FOTBuilder::RuleNIC>)
+__instantiate(Owner<FOTBuilder::DisplayNIC>)
+__instantiate(Owner<FOTBuilder::InlineNIC>)
+__instantiate(Owner<FOTBuilder::CharacterNIC>)
+__instantiate(Owner<FOTBuilder::ExternalGraphicNIC>)
+__instantiate(Owner<MultiModeFlowObj::NIC>)
+__instantiate(Owner<FOTBuilder::GridNIC>)
+__instantiate(Owner<FOTBuilder::GridCellNIC>)
+
+#ifdef SP_NAMESPACE
+}
+#endif
+
+#endif /* SP_MANUAL_INST */
diff --git a/style/GroveManager.cxx b/style/GroveManager.cxx
new file mode 100644 (file)
index 0000000..0385533
--- /dev/null
@@ -0,0 +1,18 @@
+// Copyright (c) 1997 James Clark
+// See the file copying.txt for copying permission.
+
+#include "stylelib.h"
+#include "GroveManager.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+GroveManager::~GroveManager()
+{
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
diff --git a/style/GroveManager.h b/style/GroveManager.h
new file mode 100644 (file)
index 0000000..6f0380c
--- /dev/null
@@ -0,0 +1,32 @@
+// Copyright (c) 1997 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef GroveManager_INCLUDED
+#define GroveManager_INCLUDED 1
+
+#include "Boolean.h"
+#include "Node.h"
+#include "StringC.h"
+#include "Vector.h"
+#include "FOTBuilder.h"
+#include "Boolean.h"
+#include "dsssl_ns.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class STYLE_API GroveManager {
+public:
+  virtual ~GroveManager();
+  virtual bool load(const StringC &, const Vector<StringC> &active, const NodePtr &parent,
+                   NodePtr &, const Vector<StringC> &architecture) = 0;
+  virtual bool readEntity(const StringC &, StringC &) = 0;
+  virtual void mapSysid(StringC &) = 0;
+};
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not GroveManager_INCLUDED */
diff --git a/style/InheritedC.cxx b/style/InheritedC.cxx
new file mode 100644 (file)
index 0000000..f43ecee
--- /dev/null
@@ -0,0 +1,1583 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#include "stylelib.h"
+#include "Style.h"
+#include "VM.h"
+#include "Interpreter.h"
+#include "InterpreterMessages.h"
+#include "macros.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+InheritedC::InheritedC(const Identifier *ident, unsigned index)
+: ident_(ident), index_(index)
+{
+}
+
+InheritedC::~InheritedC()
+{
+}
+
+void InheritedC::invalidValue(const Location &loc,
+                             Interpreter &interp) const
+{
+  interp.invalidCharacteristicValue(identifier(), loc);
+}
+
+class BoolInheritedC : public InheritedC {
+public:
+  BoolInheritedC(const Identifier *, unsigned index, bool);
+  ELObj *value(VM &, const VarStyleObj *, Vector<size_t> &) const;
+protected:
+  bool value_;
+};
+
+BoolInheritedC::BoolInheritedC(const Identifier *ident, unsigned index, bool value)
+: InheritedC(ident, index), value_(value)
+{
+}
+
+ELObj *BoolInheritedC::value(VM &vm, const VarStyleObj *, Vector<size_t> &) const
+{
+  if (value_)
+    return vm.interp->makeTrue();
+  else
+    return vm.interp->makeFalse();
+}
+
+class IntegerInheritedC : public InheritedC {
+public:
+  IntegerInheritedC(const Identifier *, unsigned index, long);
+  ELObj *value(VM &, const VarStyleObj *, Vector<size_t> &) const;
+protected:
+  long n_;
+};
+
+IntegerInheritedC::IntegerInheritedC(const Identifier *ident, unsigned index, long n)
+: InheritedC(ident, index), n_(n)
+{
+}
+
+ELObj *IntegerInheritedC::value(VM &vm, const VarStyleObj *, Vector<size_t> &) const
+{
+  return vm.interp->makeInteger(n_);
+}
+
+class LengthInheritedC : public InheritedC {
+public:
+  LengthInheritedC(const Identifier *, unsigned index, FOTBuilder::Length);
+  ELObj *value(VM &, const VarStyleObj *, Vector<size_t> &) const;
+protected:
+  FOTBuilder::Length size_;
+};
+
+LengthInheritedC::LengthInheritedC(const Identifier *ident, unsigned index, FOTBuilder::Length size)
+: InheritedC(ident, index), size_(size)
+{
+}
+
+ELObj *LengthInheritedC::value(VM &vm, const VarStyleObj *, Vector<size_t> &) const
+{
+  return new (*vm.interp) LengthObj(size_);
+}
+
+class SymbolInheritedC : public InheritedC {
+public:
+  SymbolInheritedC(const Identifier *, unsigned index, FOTBuilder::Symbol);
+  ELObj *value(VM &, const VarStyleObj *, Vector<size_t> &) const;
+protected:
+  FOTBuilder::Symbol sym_;
+};
+
+SymbolInheritedC::SymbolInheritedC(const Identifier *ident, unsigned index, FOTBuilder::Symbol sym)
+: InheritedC(ident, index), sym_(sym)
+{
+}
+
+ELObj *SymbolInheritedC::value(VM &vm, const VarStyleObj *, Vector<size_t> &) const
+{
+  return vm.interp->cValueSymbol(sym_);
+}
+
+class PublicIdInheritedC : public InheritedC {
+public:
+  PublicIdInheritedC(const Identifier *, unsigned index,
+                    FOTBuilder::PublicId = 0);
+  ELObj *value(VM &, const VarStyleObj *, Vector<size_t> &) const;
+protected:
+  FOTBuilder::PublicId pubid_;
+};
+
+PublicIdInheritedC::PublicIdInheritedC(const Identifier *ident, unsigned index, FOTBuilder::PublicId pubid)
+: InheritedC(ident, index), pubid_(pubid)
+{
+}
+
+ELObj *PublicIdInheritedC::value(VM &vm, const VarStyleObj *, Vector<size_t> &) const
+{
+  Interpreter &interp = *vm.interp;
+  if (pubid_)
+    return new (interp) StringObj(interp.makeStringC(pubid_));
+  else
+    return interp.makeFalse();
+}
+
+class Letter2InheritedC : public InheritedC {
+public:
+  Letter2InheritedC(const Identifier *, unsigned index,
+                    FOTBuilder::Letter2 = 0);
+  ELObj *value(VM &, const VarStyleObj *, Vector<size_t> &) const;
+protected:
+  FOTBuilder::Letter2 code_;
+};
+
+Letter2InheritedC::Letter2InheritedC(const Identifier *ident, unsigned index,
+                                    FOTBuilder::Letter2 code)
+: InheritedC(ident, index), code_(code)
+{
+}
+
+ELObj *Letter2InheritedC::value(VM &vm, const VarStyleObj *, Vector<size_t> &) const
+{
+  Interpreter &interp = *vm.interp;
+  if (code_) {
+    StringC buf;
+    buf += (code_ >> 8) & 0xff;
+    buf += code_ & 0xff;
+    buf += 0;
+    return interp.makeSymbol(buf);
+  }
+  else
+    return interp.makeFalse();
+}
+
+class LengthSpecInheritedC : public InheritedC {
+public:
+  LengthSpecInheritedC(const Identifier *, unsigned index, FOTBuilder::Length);
+  ELObj *value(VM &, const VarStyleObj *, Vector<size_t> &) const;
+protected:
+  bool setValue(ELObj *, const Location &, Interpreter &);
+  FOTBuilder::LengthSpec value_;
+};
+
+
+LengthSpecInheritedC::LengthSpecInheritedC(const Identifier *ident,
+                                          unsigned index, FOTBuilder::Length n)
+: InheritedC(ident, index), value_(n)
+{
+}
+
+ELObj *LengthSpecInheritedC::value(VM &vm, const VarStyleObj *,
+                                  Vector<size_t> &) const
+{
+  return vm.interp->makeLengthSpec(value_);
+}
+
+bool LengthSpecInheritedC::setValue(ELObj *obj, const Location &loc,
+                                   Interpreter &interp)
+{
+  return interp.convertLengthSpecC(obj, identifier(), loc, value_);
+}
+
+class OptLengthSpecInheritedC : public InheritedC {
+public:
+  OptLengthSpecInheritedC(const Identifier *, unsigned index);
+  ELObj *value(VM &, const VarStyleObj *, Vector<size_t> &) const;
+protected:
+  bool setValue(ELObj *, const Location &, Interpreter &);
+  FOTBuilder::OptLengthSpec value_;
+};
+
+
+OptLengthSpecInheritedC::OptLengthSpecInheritedC(const Identifier *ident,
+                                                unsigned index)
+: InheritedC(ident, index)
+{
+}
+
+ELObj *OptLengthSpecInheritedC::value(VM &vm, const VarStyleObj *,
+                                     Vector<size_t> &) const
+{
+  if (!value_.hasLength)
+    return vm.interp->makeFalse();
+  else
+    return vm.interp->makeLengthSpec(value_.length);
+}
+
+bool OptLengthSpecInheritedC::setValue(ELObj *obj, const Location &loc,
+                                   Interpreter &interp)
+{
+  return interp.convertOptLengthSpecC(obj, identifier(), loc, value_);
+}
+
+class StringInheritedC : public InheritedC {
+public:
+  StringInheritedC(const Identifier *, unsigned index, const Char *, size_t );
+  StringInheritedC(const Identifier *, unsigned index, const StringC &);
+  ELObj *value(VM &, const VarStyleObj *, Vector<size_t> &) const;
+protected:
+  StringC str_;
+};
+
+StringInheritedC::StringInheritedC(const Identifier *ident, unsigned index,
+                                  const Char *s, size_t n)
+: InheritedC(ident, index), str_(s, n)
+{
+}
+
+StringInheritedC::StringInheritedC(const Identifier *ident, unsigned index,
+                                  const StringC &s)
+: InheritedC(ident, index), str_(s)
+{
+}
+
+ELObj *StringInheritedC::value(VM &vm, const VarStyleObj *, Vector<size_t> &) const
+{
+  return new(*vm.interp) StringObj(str_);
+}
+
+class GenericInlineSpaceInheritedC : public InheritedC {
+public:
+  typedef void (FOTBuilder::*Setter)(const FOTBuilder::InlineSpace &);
+  GenericInlineSpaceInheritedC(const Identifier *, unsigned index, Setter setter);
+  ELObj *value(VM &, const VarStyleObj *, Vector<size_t> &) const;
+  void set(VM &, const VarStyleObj *, FOTBuilder &,
+           ELObj *&value, Vector<size_t> &dependencies) const;
+  ConstPtr<InheritedC> make(ELObj *, const Location &, Interpreter &) const;
+private:
+  FOTBuilder::InlineSpace value_;
+  Setter setter_;
+};
+
+GenericInlineSpaceInheritedC::GenericInlineSpaceInheritedC(const Identifier *ident,
+                                                          unsigned index,
+                                                          Setter setter)
+: InheritedC(ident, index), setter_(setter)
+{
+}
+
+ELObj *GenericInlineSpaceInheritedC::value(VM &vm, const VarStyleObj *,
+                                   Vector<size_t> &) const
+{
+  return new (*vm.interp) InlineSpaceObj(value_);
+}
+
+void GenericInlineSpaceInheritedC::set(VM &, const VarStyleObj *,
+                                     FOTBuilder &fotb,
+                                     ELObj *&,
+                                     Vector<size_t> &) const
+{
+  (fotb.*setter_)(value_);
+}
+
+ConstPtr<InheritedC>
+GenericInlineSpaceInheritedC::make(ELObj *obj, const Location &loc,
+                                  Interpreter &interp) const
+{
+  GenericInlineSpaceInheritedC *copy
+    = new GenericInlineSpaceInheritedC(identifier(), index(), setter_);
+  InlineSpaceObj *iso = obj->asInlineSpace();
+  if (iso) {
+    copy->value_ = iso->inlineSpace();
+    return copy;
+  }
+  else if (interp.convertLengthSpecC(obj, identifier(), loc, copy->value_.nominal))  {
+    copy->value_.min = copy->value_.nominal;
+    copy->value_.max = copy->value_.nominal;
+    return copy;
+  }
+  delete copy;
+  return 0;
+}
+
+
+class GenericBoolInheritedC : public BoolInheritedC {
+public:
+  typedef void (FOTBuilder::*Setter)(bool);
+  GenericBoolInheritedC(const Identifier *, unsigned index, Setter,
+                       bool = 0);
+  void set(VM &, const VarStyleObj *, FOTBuilder &,
+           ELObj *&value, Vector<size_t> &dependencies) const;
+  ConstPtr<InheritedC> make(ELObj *, const Location &, Interpreter &) const;
+private:
+  Setter setter_;
+};
+
+GenericBoolInheritedC
+::GenericBoolInheritedC(const Identifier *ident, unsigned index,
+                       Setter setter, bool b)
+: BoolInheritedC(ident, index, b), setter_(setter)
+{
+}
+
+void GenericBoolInheritedC::set(VM &, const VarStyleObj *,
+                               FOTBuilder &fotb,
+                               ELObj *&,
+                               Vector<size_t> &) const
+{
+  (fotb.*setter_)(value_);
+}
+
+ConstPtr<InheritedC>
+GenericBoolInheritedC::make(ELObj *obj, const Location &loc,
+                           Interpreter &interp) const
+{
+  bool b;
+  if (interp.convertBooleanC(obj, identifier(), loc, b))
+    return new GenericBoolInheritedC(identifier(), index(), setter_, b);
+  return ConstPtr<InheritedC>();
+}
+
+class ExtensionBoolInheritedC : public BoolInheritedC {
+public:
+  typedef void (FOTBuilder::*Setter)(bool);
+  ExtensionBoolInheritedC(const Identifier *, unsigned index, Setter,
+                         bool = 0);
+  void set(VM &, const VarStyleObj *, FOTBuilder &,
+           ELObj *&value, Vector<size_t> &dependencies) const;
+  ConstPtr<InheritedC> make(ELObj *, const Location &, Interpreter &) const;
+private:
+  Setter setter_;
+};
+
+ExtensionBoolInheritedC
+::ExtensionBoolInheritedC(const Identifier *ident, unsigned index,
+                         Setter setter, bool b)
+: BoolInheritedC(ident, index, b), setter_(setter)
+{
+}
+
+void ExtensionBoolInheritedC::set(VM &, const VarStyleObj *,
+                                 FOTBuilder &fotb,
+                                 ELObj *&,
+                                 Vector<size_t> &) const
+{
+  fotb.extensionSet(setter_, value_);
+}
+
+ConstPtr<InheritedC>
+ExtensionBoolInheritedC::make(ELObj *obj, const Location &loc,
+                           Interpreter &interp) const
+{
+  bool b;
+  if (interp.convertBooleanC(obj, identifier(), loc, b))
+    return new ExtensionBoolInheritedC(identifier(), index(), setter_, b);
+  return ConstPtr<InheritedC>();
+}
+
+class ExtensionStringInheritedC : public StringInheritedC {
+public:
+  typedef void (FOTBuilder::*Setter)(const StringC &);
+  ExtensionStringInheritedC(const Identifier *, unsigned index, Setter);
+  ExtensionStringInheritedC(const Identifier *, unsigned index, Setter,
+                           const Char *, size_t);
+  void set(VM &, const VarStyleObj *, FOTBuilder &,
+           ELObj *&value, Vector<size_t> &dependencies) const;
+  ConstPtr<InheritedC> make(ELObj *, const Location &, Interpreter &) const;
+private:
+  Setter setter_;
+};
+
+ExtensionStringInheritedC
+::ExtensionStringInheritedC(const Identifier *ident, unsigned index,
+                           Setter setter)
+: StringInheritedC(ident, index, StringC()), setter_(setter)
+{
+}
+
+ExtensionStringInheritedC
+::ExtensionStringInheritedC(const Identifier *ident, unsigned index,
+                           Setter setter, const Char *s, size_t n)
+: StringInheritedC(ident, index, s, n), setter_(setter)
+{
+}
+
+void ExtensionStringInheritedC::set(VM &, const VarStyleObj *,
+                                 FOTBuilder &fotb,
+                                 ELObj *&,
+                                 Vector<size_t> &) const
+{
+  fotb.extensionSet(setter_, str_);
+}
+
+ConstPtr<InheritedC>
+ExtensionStringInheritedC::make(ELObj *obj, const Location &loc,
+                           Interpreter &interp) const
+{
+  const Char *s;
+  size_t n;
+  if (obj->stringData(s, n))
+    return new ExtensionStringInheritedC(identifier(), index(), setter_, s, n);
+  invalidValue(loc, interp);
+  return ConstPtr<InheritedC>();
+}
+
+class ExtensionIntegerInheritedC : public IntegerInheritedC {
+public:
+  typedef void (FOTBuilder::*Setter)(long);
+  ExtensionIntegerInheritedC(const Identifier *, unsigned index, Setter,
+                         long = 0);
+  void set(VM &, const VarStyleObj *, FOTBuilder &,
+           ELObj *&value, Vector<size_t> &dependencies) const;
+  ConstPtr<InheritedC> make(ELObj *, const Location &, Interpreter &) const;
+private:
+  Setter setter_;
+};
+
+ExtensionIntegerInheritedC
+::ExtensionIntegerInheritedC(const Identifier *ident, unsigned index,
+                            Setter setter, long n)
+: IntegerInheritedC(ident, index, n), setter_(setter)
+{
+}
+
+void ExtensionIntegerInheritedC::set(VM &, const VarStyleObj *,
+                                    FOTBuilder &fotb,
+                                    ELObj *&,
+                                    Vector<size_t> &) const
+{
+  fotb.extensionSet(setter_, n_);
+}
+
+ConstPtr<InheritedC>
+ExtensionIntegerInheritedC::make(ELObj *obj, const Location &loc,
+                                Interpreter &interp) const
+{
+  long n;
+  if (interp.convertIntegerC(obj, identifier(), loc, n))
+    return new ExtensionIntegerInheritedC(identifier(), index(), setter_, n);
+  return ConstPtr<InheritedC>();
+}
+
+class ExtensionLengthInheritedC : public LengthInheritedC {
+public:
+  typedef void (FOTBuilder::*Setter)(FOTBuilder::Length);
+  ExtensionLengthInheritedC(const Identifier *, unsigned index, Setter, FOTBuilder::Length = 0);
+  void set(VM &, const VarStyleObj *, FOTBuilder &,
+           ELObj *&value, Vector<size_t> &dependencies) const;
+  ConstPtr<InheritedC> make(ELObj *, const Location &, Interpreter &) const;
+private:
+  Setter setter_;
+};
+
+ExtensionLengthInheritedC
+::ExtensionLengthInheritedC(const Identifier *ident, unsigned index,
+                           Setter setter, FOTBuilder::Length n)
+: LengthInheritedC(ident, index, n), setter_(setter)
+{
+}
+
+void ExtensionLengthInheritedC::set(VM &, const VarStyleObj *,
+                                   FOTBuilder &fotb,
+                                   ELObj *&,
+                                   Vector<size_t> &) const
+{
+  fotb.extensionSet(setter_, size_);
+}
+
+ConstPtr<InheritedC>
+ExtensionLengthInheritedC::make(ELObj *obj, const Location &loc,
+                               Interpreter &interp) const
+{
+  FOTBuilder::Length n;
+  if (interp.convertLengthC(obj, identifier(), loc, n))
+    return new ExtensionLengthInheritedC(identifier(), index(), setter_, n);
+  return ConstPtr<InheritedC>();
+}
+
+class GenericLengthInheritedC : public LengthInheritedC {
+public:
+  typedef void (FOTBuilder::*Setter)(FOTBuilder::Length);
+  GenericLengthInheritedC(const Identifier *, unsigned index, Setter,
+                         FOTBuilder::Length = 0);
+  void set(VM &, const VarStyleObj *, FOTBuilder &,
+           ELObj *&value, Vector<size_t> &dependencies) const;
+  ConstPtr<InheritedC> make(ELObj *, const Location &, Interpreter &) const;
+private:
+  Setter setter_;
+};
+
+GenericLengthInheritedC
+::GenericLengthInheritedC(const Identifier *ident, unsigned index,
+                         Setter setter, FOTBuilder::Length n)
+: LengthInheritedC(ident, index, n), setter_(setter)
+{
+}
+
+void GenericLengthInheritedC::set(VM &, const VarStyleObj *,
+                                 FOTBuilder &fotb,
+                                 ELObj *&,
+                                 Vector<size_t> &) const
+{
+  (fotb.*setter_)(size_);
+}
+
+ConstPtr<InheritedC>
+GenericLengthInheritedC::make(ELObj *obj, const Location &loc,
+                             Interpreter &interp) const
+{
+  FOTBuilder::Length n;
+  if (interp.convertLengthC(obj, identifier(), loc, n))
+    return new GenericLengthInheritedC(identifier(), index(), setter_, n);
+  return ConstPtr<InheritedC>();
+}
+
+class GenericIntegerInheritedC : public IntegerInheritedC {
+public:
+  typedef void (FOTBuilder::*Setter)(long);
+  GenericIntegerInheritedC(const Identifier *, unsigned index, Setter, long);
+  void set(VM &, const VarStyleObj *, FOTBuilder &,
+           ELObj *&value, Vector<size_t> &dependencies) const;
+  ConstPtr<InheritedC> make(ELObj *, const Location &, Interpreter &) const;
+protected:
+  Setter setter_;
+};
+
+GenericIntegerInheritedC
+::GenericIntegerInheritedC(const Identifier *ident, unsigned index,
+                         Setter setter, long n)
+: IntegerInheritedC(ident, index, n), setter_(setter)
+{
+}
+
+void GenericIntegerInheritedC::set(VM &, const VarStyleObj *,
+                                 FOTBuilder &fotb,
+                                 ELObj *&,
+                                 Vector<size_t> &) const
+{
+  (fotb.*setter_)(n_);
+}
+
+ConstPtr<InheritedC>
+GenericIntegerInheritedC::make(ELObj *obj, const Location &loc,
+                             Interpreter &interp) const
+{
+  long n;
+  if (interp.convertIntegerC(obj, identifier(), loc, n))
+    return new GenericIntegerInheritedC(identifier(), index(), setter_, n);
+  return ConstPtr<InheritedC>();
+}
+
+class GenericMaybeIntegerInheritedC : public GenericIntegerInheritedC {
+public:
+  GenericMaybeIntegerInheritedC(const Identifier *, unsigned index,
+                               Setter, long);
+  ConstPtr<InheritedC> make(ELObj *, const Location &, Interpreter &) const;
+  ELObj *value(VM &, const VarStyleObj *, Vector<size_t> &) const;
+};
+
+GenericMaybeIntegerInheritedC
+::GenericMaybeIntegerInheritedC(const Identifier *ident, unsigned index,
+                               Setter setter, long n)
+: GenericIntegerInheritedC(ident, index, setter, n)
+{
+}
+
+ELObj *GenericMaybeIntegerInheritedC::value(VM &vm, const VarStyleObj *style,
+                                           Vector<size_t> &dep) const
+{
+  if (!n_)
+    return vm.interp->makeFalse();
+  else
+    return IntegerInheritedC::value(vm, style, dep);
+}
+
+ConstPtr<InheritedC>
+GenericMaybeIntegerInheritedC::make(ELObj *obj, const Location &loc,
+                                   Interpreter &interp) const
+{
+  long n;
+  if (interp.convertOptPositiveIntegerC(obj, identifier(), loc, n))
+    return new GenericMaybeIntegerInheritedC(identifier(), index(),
+                                            setter_, n);
+  return ConstPtr<InheritedC>();
+}
+
+class GenericSymbolInheritedC : public SymbolInheritedC {
+public:
+  typedef void (FOTBuilder::*Setter)(FOTBuilder::Symbol);
+  GenericSymbolInheritedC(const Identifier *, unsigned index, Setter,
+                         FOTBuilder::Symbol = FOTBuilder::symbolFalse);
+  void set(VM &, const VarStyleObj *, FOTBuilder &,
+           ELObj *&value, Vector<size_t> &dependencies) const;
+  ConstPtr<InheritedC> make(ELObj *, const Location &, Interpreter &) const;
+private:
+  Setter setter_;
+};
+
+GenericSymbolInheritedC
+::GenericSymbolInheritedC(const Identifier *ident, unsigned index,
+                         Setter setter, FOTBuilder::Symbol sym)
+: SymbolInheritedC(ident, index, sym), setter_(setter)
+{
+}
+
+void GenericSymbolInheritedC::set(VM &, const VarStyleObj *,
+                                 FOTBuilder &fotb,
+                                 ELObj *&,
+                                 Vector<size_t> &) const
+{
+  (fotb.*setter_)(sym_);
+}
+
+ConstPtr<InheritedC>
+GenericSymbolInheritedC::make(ELObj *obj, const Location &loc,
+                             Interpreter &interp) const
+{
+  FOTBuilder::Symbol sym;
+  if (interp.convertEnumC(obj, identifier(), loc, sym))
+    return new GenericSymbolInheritedC(identifier(), index(), setter_, sym);
+  return ConstPtr<InheritedC>();
+}
+
+class GenericPublicIdInheritedC : public PublicIdInheritedC {
+public:
+  typedef void (FOTBuilder::*Setter)(FOTBuilder::PublicId);
+  GenericPublicIdInheritedC(const Identifier *, unsigned index, Setter,
+                           FOTBuilder::PublicId = 0);
+  void set(VM &, const VarStyleObj *, FOTBuilder &,
+           ELObj *&value, Vector<size_t> &dependencies) const;
+  ConstPtr<InheritedC> make(ELObj *, const Location &, Interpreter &) const;
+private:
+  Setter setter_;
+};
+
+GenericPublicIdInheritedC
+::GenericPublicIdInheritedC(const Identifier *ident, unsigned index,
+                         Setter setter, FOTBuilder::PublicId pubid)
+: PublicIdInheritedC(ident, index, pubid), setter_(setter)
+{
+}
+
+void GenericPublicIdInheritedC::set(VM &, const VarStyleObj *,
+                                   FOTBuilder &fotb,
+                                   ELObj *&,
+                                   Vector<size_t> &) const
+{
+  (fotb.*setter_)(pubid_);
+}
+
+ConstPtr<InheritedC>
+GenericPublicIdInheritedC::make(ELObj *obj, const Location &loc,
+                               Interpreter &interp) const
+{
+  FOTBuilder::PublicId pubid;
+  if (interp.convertPublicIdC(obj, identifier(), loc, pubid))
+    return new GenericPublicIdInheritedC(identifier(), index(), setter_,
+                                        pubid);
+  return ConstPtr<InheritedC>();
+}
+
+class GenericLetter2InheritedC : public Letter2InheritedC {
+public:
+  typedef void (FOTBuilder::*Setter)(FOTBuilder::Letter2);
+  GenericLetter2InheritedC(const Identifier *, unsigned index, Setter,
+                           FOTBuilder::Letter2 = 0);
+  void set(VM &, const VarStyleObj *, FOTBuilder &,
+           ELObj *&value, Vector<size_t> &dependencies) const;
+  ConstPtr<InheritedC> make(ELObj *, const Location &, Interpreter &) const;
+private:
+  Setter setter_;
+};
+
+GenericLetter2InheritedC
+::GenericLetter2InheritedC(const Identifier *ident, unsigned index,
+                          Setter setter, FOTBuilder::Letter2 code)
+: Letter2InheritedC(ident, index, code), setter_(setter)
+{
+}
+
+void GenericLetter2InheritedC::set(VM &, const VarStyleObj *,
+                                  FOTBuilder &fotb,
+                                  ELObj *&,
+                                  Vector<size_t> &) const
+{
+  (fotb.*setter_)(code_);
+}
+
+ConstPtr<InheritedC>
+GenericLetter2InheritedC::make(ELObj *obj, const Location &loc,
+                               Interpreter &interp) const
+{
+  FOTBuilder::Letter2 code;
+  if (interp.convertLetter2C(obj, identifier(), loc, code))
+    return new GenericLetter2InheritedC(identifier(), index(), setter_, code);
+  return ConstPtr<InheritedC>();
+}
+
+class GenericLengthSpecInheritedC : public LengthSpecInheritedC {
+public:
+  typedef void (FOTBuilder::*Setter)(const FOTBuilder::LengthSpec &);
+  GenericLengthSpecInheritedC(const Identifier *, unsigned index, Setter,
+                             long = 0);
+  void set(VM &, const VarStyleObj *, FOTBuilder &,
+           ELObj *&value, Vector<size_t> &dependencies) const;
+  ConstPtr<InheritedC> make(ELObj *, const Location &, Interpreter &) const;
+private:
+  Setter setter_;
+};
+
+GenericLengthSpecInheritedC
+::GenericLengthSpecInheritedC(const Identifier *ident, unsigned index,
+                             Setter setter, long n)
+: LengthSpecInheritedC(ident, index, n), setter_(setter)
+{
+}
+
+void GenericLengthSpecInheritedC::set(VM &, const VarStyleObj *,
+                                     FOTBuilder &fotb,
+                                     ELObj *&,
+                                     Vector<size_t> &) const
+{
+  (fotb.*setter_)(value_);
+}
+
+ConstPtr<InheritedC>
+GenericLengthSpecInheritedC::make(ELObj *obj, const Location &loc,
+                                 Interpreter &interp) const
+{
+  GenericLengthSpecInheritedC *copy
+    = new GenericLengthSpecInheritedC(identifier(), index(), setter_);
+  if (!copy->setValue(obj, loc, interp)) {
+    delete copy;
+    copy = 0;
+  }
+  return copy;
+}
+
+class GenericOptInlineSpaceInheritedC : public InheritedC {
+public:
+  typedef void (FOTBuilder::*Setter)(const FOTBuilder::OptInlineSpace &);
+  GenericOptInlineSpaceInheritedC(const Identifier *, unsigned index, Setter);
+  ELObj *value(VM &, const VarStyleObj *, Vector<size_t> &) const;
+  void set(VM &, const VarStyleObj *, FOTBuilder &,
+           ELObj *&value, Vector<size_t> &dependencies) const;
+  ConstPtr<InheritedC> make(ELObj *, const Location &, Interpreter &) const;
+private:
+  FOTBuilder::OptInlineSpace value_;
+  Setter setter_;
+};
+
+GenericOptInlineSpaceInheritedC
+::GenericOptInlineSpaceInheritedC(const Identifier *ident, unsigned index,
+                                  Setter setter)
+: InheritedC(ident, index), setter_(setter)
+{
+}
+
+ELObj *GenericOptInlineSpaceInheritedC::value(VM &vm, const VarStyleObj *,
+                                              Vector<size_t> &) const
+{
+  if (!value_.hasSpace)
+    return vm.interp->makeFalse();
+  else
+    return new (*vm.interp) InlineSpaceObj(value_.space);
+}
+
+
+void GenericOptInlineSpaceInheritedC::set(VM &, const VarStyleObj *,
+                                          FOTBuilder &fotb,
+                                          ELObj *&,
+                                          Vector<size_t> &) const
+{
+  (fotb.*setter_)(value_);
+}
+
+ConstPtr<InheritedC>
+GenericOptInlineSpaceInheritedC::make(ELObj *obj, const Location &loc,
+                                      Interpreter &interp) const
+{
+  GenericOptInlineSpaceInheritedC *copy
+    = new GenericOptInlineSpaceInheritedC(identifier(), index(), setter_);
+  InlineSpaceObj *iso = obj->asInlineSpace();
+  if (iso) {
+    copy->value_.space = iso->inlineSpace();
+    copy->value_.hasSpace = 1;
+  }
+  else {
+    FOTBuilder::OptLengthSpec res;
+    if (interp.convertOptLengthSpecC(obj, identifier(), loc, res))  {
+      if (res.hasLength) {
+        copy->value_.space.nominal = res.length;
+        copy->value_.space.min     = res.length; 
+        copy->value_.space.max     = res.length; 
+        copy->value_.hasSpace = 1;
+      } else 
+        copy->value_.hasSpace = 0;
+    } else {
+      delete copy;
+      copy = 0;
+    }
+  } 
+  return copy;
+}
+
+
+class GenericOptLengthSpecInheritedC : public OptLengthSpecInheritedC {
+public:
+  typedef void (FOTBuilder::*Setter)(const FOTBuilder::OptLengthSpec &);
+  GenericOptLengthSpecInheritedC(const Identifier *, unsigned index, Setter);
+  void set(VM &, const VarStyleObj *, FOTBuilder &,
+           ELObj *&value, Vector<size_t> &dependencies) const;
+  ConstPtr<InheritedC> make(ELObj *, const Location &, Interpreter &) const;
+private:
+  Setter setter_;
+};
+
+GenericOptLengthSpecInheritedC
+::GenericOptLengthSpecInheritedC(const Identifier *ident, unsigned index,
+                                Setter setter)
+: OptLengthSpecInheritedC(ident, index), setter_(setter)
+{
+}
+
+void GenericOptLengthSpecInheritedC::set(VM &, const VarStyleObj *,
+                                     FOTBuilder &fotb,
+                                     ELObj *&,
+                                     Vector<size_t> &) const
+{
+  (fotb.*setter_)(value_);
+}
+
+ConstPtr<InheritedC>
+GenericOptLengthSpecInheritedC::make(ELObj *obj, const Location &loc,
+                                    Interpreter &interp) const
+{
+  GenericOptLengthSpecInheritedC *copy
+    = new GenericOptLengthSpecInheritedC(identifier(), index(), setter_);
+  if (!copy->setValue(obj, loc, interp)) {
+    delete copy;
+    copy = 0;
+  }
+  return copy;
+}
+
+class FontSizeC : public LengthInheritedC {
+public:
+  FontSizeC(const Identifier *, unsigned index, long);
+  void set(VM &, const VarStyleObj *, FOTBuilder &,
+           ELObj *&value, Vector<size_t> &dependencies) const;
+  ConstPtr<InheritedC> make(ELObj *, const Location &, Interpreter &) const;
+};
+
+FontSizeC::FontSizeC(const Identifier *ident, unsigned index, long size)
+: LengthInheritedC(ident, index, size)
+{
+}
+
+void FontSizeC::set(VM &vm, const VarStyleObj *, FOTBuilder &fotb, ELObj *&,
+                   Vector<size_t> &) const
+{
+  fotb.setFontSize(size_);
+}
+
+ConstPtr<InheritedC> FontSizeC::make(ELObj *obj, const Location &loc,
+                                    Interpreter &interp) const
+{
+  long n;
+  if (interp.convertLengthC(obj, identifier(), loc, n))
+    return new FontSizeC(identifier(), index(), n);
+  return ConstPtr<InheritedC>();
+}
+
+class FontFamilyNameC : public StringInheritedC {
+public:
+  FontFamilyNameC(const Identifier *, unsigned index, const Char *, size_t);
+  FontFamilyNameC(const Identifier *, unsigned index, const StringC &);
+  void set(VM &, const VarStyleObj *, FOTBuilder &,
+           ELObj *&value, Vector<size_t> &dependencies) const;
+  ConstPtr<InheritedC> make(ELObj *, const Location &, Interpreter &) const;
+};
+
+FontFamilyNameC::FontFamilyNameC(const Identifier *ident, unsigned index, const Char *s, size_t n)
+: StringInheritedC(ident, index, s, n)
+{
+}
+
+FontFamilyNameC::FontFamilyNameC(const Identifier *ident, unsigned index, const StringC &s)
+: StringInheritedC(ident, index, s)
+{
+}
+
+void FontFamilyNameC::set(VM &vm, const VarStyleObj *, FOTBuilder &fotb, ELObj *&,
+                     Vector<size_t> &) const
+{
+  fotb.setFontFamilyName(str_);
+}
+
+ConstPtr<InheritedC> FontFamilyNameC::make(ELObj *obj, const Location &loc,
+                                      Interpreter &interp) const
+{
+  const Char *s;
+  size_t n;
+  if (obj->stringData(s, n))
+    return new FontFamilyNameC(identifier(), index(), s, n);
+  invalidValue(loc, interp);
+  return ConstPtr<InheritedC>();
+}
+
+class ColorC : public InheritedC, private Collector::DynamicRoot {
+public:
+  ColorC(const Identifier *, unsigned index, ColorObj *, Interpreter &);
+  void set(VM &, const VarStyleObj *, FOTBuilder &,
+           ELObj *&value, Vector<size_t> &dependencies) const;
+  ConstPtr<InheritedC> make(ELObj *, const Location &, Interpreter &) const;
+  ELObj *value(VM &, const VarStyleObj *, Vector<size_t> &) const;
+  void trace(Collector &) const;
+private:
+  ColorObj *color_;
+};
+
+ColorC::ColorC(const Identifier *ident, unsigned index, ColorObj *color,
+              Interpreter &interp)
+: InheritedC(ident, index), Collector::DynamicRoot(interp), color_(color)
+{
+}
+
+void ColorC::set(VM &, const VarStyleObj *, FOTBuilder &fotb,
+                ELObj *&, Vector<size_t> &) const
+{
+  color_->set(fotb);
+}
+
+ConstPtr<InheritedC> ColorC::make(ELObj *obj, const Location &loc,
+                                 Interpreter &interp) const
+{
+  ColorObj *color;
+  if (interp.convertColorC(obj, identifier(), loc, color))
+    return new ColorC(identifier(), index(), color, interp);
+  return ConstPtr<InheritedC>();
+}
+
+ELObj *ColorC::value(VM &vm, const VarStyleObj *, Vector<size_t> &) const
+{
+  if (!color_)
+    return vm.interp->makeFalse();
+  else
+    return color_;
+}
+
+void ColorC::trace(Collector &c) const
+{
+  c.trace(color_);
+}
+
+class BackgroundColorC : public InheritedC, private Collector::DynamicRoot {
+public:
+  BackgroundColorC(const Identifier *, unsigned index, ColorObj *,
+                  Interpreter &);
+  void set(VM &, const VarStyleObj *, FOTBuilder &,
+           ELObj *&value, Vector<size_t> &dependencies) const;
+  ConstPtr<InheritedC> make(ELObj *, const Location &, Interpreter &) const;
+  ELObj *value(VM &, const VarStyleObj *, Vector<size_t> &) const;
+  void trace(Collector &) const;
+private:
+  ColorObj *color_;
+};
+
+BackgroundColorC::BackgroundColorC(const Identifier *ident, unsigned index,
+                                  ColorObj *color, Interpreter &interp)
+: InheritedC(ident, index), Collector::DynamicRoot(interp), color_(color)
+{
+}
+
+void BackgroundColorC::set(VM &, const VarStyleObj *, FOTBuilder &fotb,
+                          ELObj *&, Vector<size_t> &) const
+{
+  if (color_)
+    color_->setBackground(fotb);
+  else
+    fotb.setBackgroundColor();
+}
+
+ConstPtr<InheritedC> BackgroundColorC::make(ELObj *obj, const Location &loc,
+                                           Interpreter &interp) const
+{
+  ColorObj *color;
+  if (interp.convertOptColorC(obj, identifier(), loc, color))
+    return new BackgroundColorC(identifier(), index(), color, interp);
+  return ConstPtr<InheritedC>();
+}
+
+ELObj *
+BackgroundColorC::value(VM &vm, const VarStyleObj *, Vector<size_t> &) const
+{
+  if (color_)
+    return color_;
+  else
+    return vm.interp->makeFalse();
+}
+
+void BackgroundColorC::trace(Collector &c) const
+{
+  c.trace(color_);
+}
+
+class GlyphSubstTableC : public InheritedC {
+public:
+  GlyphSubstTableC(const Identifier *, unsigned index, bool isList);
+  void set(VM &, const VarStyleObj *, FOTBuilder &,
+           ELObj *&value, Vector<size_t> &dependencies) const;
+  ConstPtr<InheritedC> make(ELObj *, const Location &, Interpreter &) const;
+  ELObj *value(VM &, const VarStyleObj *, Vector<size_t> &) const;
+  void append(const ConstPtr<FOTBuilder::GlyphSubstTable> &table) { tables_.push_back(table); }
+private:
+  // Distinguish between #f and () for inherited-glyph-subst-table
+  bool isList_;
+  Vector<ConstPtr<FOTBuilder::GlyphSubstTable> > tables_;
+};
+
+GlyphSubstTableC::GlyphSubstTableC(const Identifier *ident, unsigned index, bool isList)
+: InheritedC(ident, index), isList_(isList)
+{
+}
+
+void GlyphSubstTableC::set(VM &, const VarStyleObj *, FOTBuilder &fotb,
+                          ELObj *&, Vector<size_t> &) const
+{
+  fotb.setGlyphSubstTable(tables_);
+}
+
+ConstPtr<InheritedC> GlyphSubstTableC::make(ELObj *obj, const Location &loc,
+                                           Interpreter &interp) const
+{
+  if (obj == interp.makeFalse())
+    return new GlyphSubstTableC(identifier(), index(), 0);
+  GlyphSubstTableObj *table = obj->asGlyphSubstTable();
+  if (table) {
+    Ptr<InheritedC> tem = new GlyphSubstTableC(identifier(), index(), 0);
+    ((GlyphSubstTableC *)tem.pointer())->append(table->glyphSubstTable());
+    return tem;
+  }
+  Ptr<InheritedC> tem = new GlyphSubstTableC(identifier(), index(), 1);
+  for (;;) {
+    if (obj->isNil())
+      return tem;
+    PairObj *pair = obj->asPair();
+    if (!pair)
+      break;
+    obj = pair->cdr();
+    table = pair->car()->asGlyphSubstTable();
+    if (!table)
+      break;
+    ((GlyphSubstTableC *)tem.pointer())->append(table->glyphSubstTable());
+  }
+  invalidValue(loc, interp);
+  return ConstPtr<InheritedC>();
+}
+
+ELObj *GlyphSubstTableC::value(VM &vm, const VarStyleObj *, Vector<size_t> &) const
+{
+  if (!isList_) {
+    if (tables_.size())
+      return new (*vm.interp) GlyphSubstTableObj(tables_[0]);
+    else
+      return vm.interp->makeFalse();
+  }
+  else {
+    ELObj *list = vm.interp->makeNil();
+    ELObjDynamicRoot protect(*vm.interp, list);
+    for (size_t i = tables_.size(); i > 0; i--) {
+      ELObj *tableObj = new (*vm.interp) GlyphSubstTableObj(tables_[i - 1]);
+      ELObjDynamicRoot protect2(*vm.interp, tableObj);
+      list = vm.interp->makePair(tableObj, list);
+      protect = list;
+    }
+    return list;
+  }
+}
+
+class IgnoredC : public InheritedC, private Collector::DynamicRoot {
+public:
+  IgnoredC(const Identifier *, unsigned index, ELObj *, Interpreter &);
+  void set(VM &, const VarStyleObj *, FOTBuilder &,
+           ELObj *&, Vector<size_t> &) const;
+  ConstPtr<InheritedC> make(ELObj *, const Location &, Interpreter &) const;
+  ELObj *value(VM &, const VarStyleObj *, Vector<size_t> &) const;
+  void trace(Collector &) const;
+private:
+  ELObj *value_;
+};
+
+
+IgnoredC::IgnoredC(const Identifier *ident, unsigned index, ELObj *value, Interpreter &interp)
+: InheritedC(ident, index), Collector::DynamicRoot(interp), value_(value)
+{
+}
+
+void IgnoredC::set(VM &, const VarStyleObj *, FOTBuilder &fotb,
+                  ELObj *&, Vector<size_t> &) const
+{
+}
+
+ConstPtr<InheritedC> IgnoredC::make(ELObj *obj, const Location &, Interpreter &interp) const
+{
+  return new IgnoredC(identifier(), index(), obj, interp);
+}
+
+ELObj *IgnoredC::value(VM &, const VarStyleObj *, Vector<size_t> &) const
+{
+  return value_;
+}
+
+void IgnoredC::trace(Collector &c) const
+{
+  c.trace(value_);
+}
+
+class BorderC : public IgnoredC {
+public:
+  BorderC(const Identifier *, unsigned index, ELObj *, Interpreter &);
+  ConstPtr<InheritedC> make(ELObj *, const Location &, Interpreter &) const;
+};
+
+BorderC::BorderC(const Identifier *ident, unsigned index, ELObj *value, Interpreter &interp)
+: IgnoredC(ident, index, value, interp)
+{
+}
+
+ConstPtr<InheritedC> BorderC::make(ELObj *obj, const Location &loc, Interpreter &interp) const
+{
+  StyleObj *tem;
+  SosofoObj *sosofo = obj->asSosofo();
+  if (sosofo && sosofo->tableBorderStyle(tem))
+    return new BorderC(identifier(), index(), obj, interp);
+  bool b;
+  if (interp.convertBooleanC(obj, identifier(), loc, b)) {
+    if (b)
+      obj = interp.makeTrue();
+    else
+      obj = interp.makeFalse();
+    return new BorderC(identifier(), index(), obj, interp);
+  }
+  return ConstPtr<InheritedC>();
+}
+
+class RuleC : public IgnoredC {
+public:
+  RuleC(const Identifier *, unsigned index, ELObj *, Interpreter &);
+  ConstPtr<InheritedC> make(ELObj *, const Location &, Interpreter &) const;
+};
+
+RuleC::RuleC(const Identifier *ident, unsigned index, ELObj *value, Interpreter &interp)
+: IgnoredC(ident, index, value, interp)
+{
+}
+
+ConstPtr<InheritedC> RuleC::make(ELObj *obj, const Location &loc, Interpreter &interp) const
+{
+  SosofoObj *sosofo = obj->asSosofo();
+  if (sosofo && sosofo->isRule())
+    return new RuleC(identifier(), index(), obj, interp);
+  invalidValue(loc, interp);
+  return ConstPtr<InheritedC>();
+}
+
+class InheritedCPrimitiveObj : public PrimitiveObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  static const Signature signature_;
+  InheritedCPrimitiveObj(const ConstPtr<InheritedC> &ic)
+    : PrimitiveObj(&signature_), inheritedC_(ic) { }
+  ELObj *primitiveCall(int, ELObj **, EvalContext &, Interpreter &, const Location &);
+private:
+  ConstPtr<InheritedC> inheritedC_;
+};
+
+const Signature InheritedCPrimitiveObj::signature_ = { 0, 0, 0 };
+
+ELObj *InheritedCPrimitiveObj::primitiveCall(int, ELObj **, EvalContext &ec,
+                                            Interpreter &interp,
+                                            const Location &loc)
+{
+  if (!ec.styleStack) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::notInCharacteristicValue);
+    return interp.makeError();
+  }
+  ELObj *obj = ec.styleStack->inherited(inheritedC_, ec.specLevel, interp,
+                                       *ec.actualDependencies);
+  interp.makeReadOnly(obj);
+  return obj;
+}
+
+class ActualCPrimitiveObj : public PrimitiveObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  static const Signature signature_;
+  ActualCPrimitiveObj(const ConstPtr<InheritedC> &ic)
+    : PrimitiveObj(&signature_), inheritedC_(ic) { }
+  ELObj *primitiveCall(int, ELObj **, EvalContext &, Interpreter &, const Location &);
+private:
+  ConstPtr<InheritedC> inheritedC_;
+};
+
+const Signature ActualCPrimitiveObj::signature_ = { 0, 0, 0 };
+
+ELObj *ActualCPrimitiveObj::primitiveCall(int, ELObj **, EvalContext &ec, Interpreter &interp,
+                                         const Location &loc)
+{
+  if (!ec.styleStack) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::notInCharacteristicValue);
+    return interp.makeError();
+  }
+  ELObj *obj = ec.styleStack->actual(inheritedC_, loc, interp, *ec.actualDependencies);
+  const Char *s;
+  size_t n;
+  interp.makeReadOnly(obj);
+  return obj;
+}
+
+#define INHERITED_C(name, C, init) \
+    installInheritedC(name, new C(0, nInheritedC_++, init))
+#define INHERITED_C2(name, C, init1, init2) \
+    installInheritedC(name, new C(0, nInheritedC_++, init1, init2))
+#define STORE_INHERITED_C2(var, name, C, init1, init2) \
+   { InheritedC *ic = new C(0, nInheritedC_++, init1, init2); \
+     installInheritedC(name, ic); \
+     var = ic; }
+
+#define IGNORED_C(name, init) INHERITED_C2(name, IgnoredC, init, *this)
+
+static StyleObj *makeBorderStyle(bool b, unsigned index, Interpreter &interp)
+{
+  Vector<ConstPtr<InheritedC> > forceSpecs;
+  Vector<ConstPtr<InheritedC> > specs;
+  specs.push_back(
+    new GenericBoolInheritedC(interp.lookup(interp.makeStringC("border-present?")),
+                             index, &FOTBuilder::setBorderPresent, b));
+
+  StyleObj *style
+    = new (interp) VarStyleObj(new StyleSpec(forceSpecs, specs), 0, 0, NodePtr());
+  interp.makePermanent(style);
+  return style;
+}
+
+void Interpreter::installInheritedCs()
+{
+  INHERITED_C("font-size", FontSizeC, (unitsPerInch()*10)/72);
+  INHERITED_C("font-family-name", FontFamilyNameC, makeStringC("iso-serif"));
+  INHERITED_C2("font-weight", GenericSymbolInheritedC, &FOTBuilder::setFontWeight,
+               FOTBuilder::symbolMedium);
+  INHERITED_C2("font-posture", GenericSymbolInheritedC, &FOTBuilder::setFontPosture,
+               FOTBuilder::symbolUpright);
+  INHERITED_C2("quadding", GenericSymbolInheritedC, &FOTBuilder::setQuadding,
+               FOTBuilder::symbolStart);
+  INHERITED_C2("display-alignment", GenericSymbolInheritedC, &FOTBuilder::setDisplayAlignment,
+               FOTBuilder::symbolStart);
+  INHERITED_C2("field-align", GenericSymbolInheritedC, &FOTBuilder::setFieldAlign,
+               FOTBuilder::symbolStart);
+  INHERITED_C2("lines", GenericSymbolInheritedC, &FOTBuilder::setLines, FOTBuilder::symbolWrap);
+  INHERITED_C("start-indent", GenericLengthSpecInheritedC,
+             &FOTBuilder::setStartIndent);
+  INHERITED_C("first-line-start-indent", GenericLengthSpecInheritedC,
+             &FOTBuilder::setFirstLineStartIndent);
+  INHERITED_C("end-indent", GenericLengthSpecInheritedC,
+             &FOTBuilder::setEndIndent);
+  INHERITED_C("last-line-end-indent", GenericLengthSpecInheritedC,
+             &FOTBuilder::setLastLineEndIndent);
+  INHERITED_C2("line-spacing", GenericLengthSpecInheritedC,
+              &FOTBuilder::setLineSpacing, unitsPerInch()*12/72);
+  INHERITED_C("field-width", GenericLengthSpecInheritedC,
+             &FOTBuilder::setFieldWidth);
+  INHERITED_C("left-margin", GenericLengthInheritedC,
+             &FOTBuilder::setLeftMargin);
+  INHERITED_C("right-margin", GenericLengthInheritedC,
+             &FOTBuilder::setRightMargin);
+  INHERITED_C("top-margin", GenericLengthInheritedC,
+             &FOTBuilder::setTopMargin);
+  INHERITED_C("bottom-margin", GenericLengthInheritedC,
+             &FOTBuilder::setBottomMargin);
+  INHERITED_C("header-margin", GenericLengthInheritedC,
+             &FOTBuilder::setHeaderMargin);
+  INHERITED_C("footer-margin", GenericLengthInheritedC,
+             &FOTBuilder::setFooterMargin);
+  INHERITED_C2("page-width", GenericLengthInheritedC,
+              &FOTBuilder::setPageWidth,
+              unitsPerInch()*8 + unitsPerInch()/2);
+  INHERITED_C2("page-height", GenericLengthInheritedC,
+              &FOTBuilder::setPageHeight,
+              unitsPerInch()*11);
+  INHERITED_C2("color", ColorC, new (*this) DeviceRGBColorObj(0, 0, 0), *this);
+  INHERITED_C2("background-color", BackgroundColorC, 0, *this);
+  INHERITED_C2("border-present?", GenericBoolInheritedC,
+              &FOTBuilder::setBorderPresent, 1);
+  borderTrueStyle_ = makeBorderStyle(1, nInheritedC_ - 1, *this);
+  borderFalseStyle_ = makeBorderStyle(0, nInheritedC_ - 1, *this);
+  STORE_INHERITED_C2(tableBorderC_, "table-border", BorderC, makeFalse(), *this);
+  STORE_INHERITED_C2(cellBeforeRowBorderC_, "cell-before-row-border",
+                    BorderC, makeFalse(), *this);
+  STORE_INHERITED_C2(cellAfterRowBorderC_, "cell-after-row-border",
+                    BorderC, makeFalse(), *this);
+  STORE_INHERITED_C2(cellBeforeColumnBorderC_, "cell-before-column-border",
+                    BorderC, makeFalse(), *this);
+  STORE_INHERITED_C2(cellAfterColumnBorderC_, "cell-after-column-border",
+                    BorderC, makeFalse(), *this);
+  STORE_INHERITED_C2(fractionBarC_, "fraction-bar",
+                    RuleC, lookup(makeStringC("rule"))->flowObj(), *this);
+  INHERITED_C2("line-thickness", GenericLengthInheritedC, &FOTBuilder::setLineThickness,
+               unitsPerInch()/72);
+  INHERITED_C2("cell-before-row-margin", GenericLengthInheritedC,
+               &FOTBuilder::setCellBeforeRowMargin, 0);
+  INHERITED_C2("cell-after-row-margin", GenericLengthInheritedC,
+               &FOTBuilder::setCellAfterRowMargin, 0);
+  INHERITED_C2("cell-before-column-margin", GenericLengthInheritedC,
+              &FOTBuilder::setCellBeforeColumnMargin, 0);
+  INHERITED_C2("cell-after-column-margin", GenericLengthInheritedC,
+              &FOTBuilder::setCellAfterColumnMargin, 0);
+  INHERITED_C2("line-sep", GenericLengthInheritedC,
+              &FOTBuilder::setLineSep, unitsPerInch()/72);
+  INHERITED_C2("box-size-before", GenericLengthInheritedC, &FOTBuilder::setBoxSizeBefore,
+               8*unitsPerInch()/72);
+  INHERITED_C2("box-size-after", GenericLengthInheritedC, &FOTBuilder::setBoxSizeAfter,
+               4*unitsPerInch()/72);
+  INHERITED_C2("position-point-shift", GenericLengthSpecInheritedC,
+               &FOTBuilder::setPositionPointShift, 0);
+  INHERITED_C2("start-margin", GenericLengthSpecInheritedC, &FOTBuilder::setStartMargin, 0);
+  INHERITED_C2("end-margin", GenericLengthSpecInheritedC, &FOTBuilder::setEndMargin, 0);
+  INHERITED_C2("sideline-sep", GenericLengthSpecInheritedC, &FOTBuilder::setSidelineSep,
+               4*unitsPerInch()/72);
+  INHERITED_C2("asis-wrap-indent", GenericLengthSpecInheritedC, &FOTBuilder::setAsisWrapIndent, 0);
+  INHERITED_C2("line-number-sep", GenericLengthSpecInheritedC, &FOTBuilder::setLineNumberSep, 0);
+  INHERITED_C2("last-line-justify-limit", GenericLengthSpecInheritedC,
+               &FOTBuilder::setLastLineJustifyLimit, 0);
+  INHERITED_C2("justify-glyph-space-max-add", GenericLengthSpecInheritedC,
+               &FOTBuilder::setJustifyGlyphSpaceMaxAdd, 0);
+  INHERITED_C2("justify-glyph-space-max-remove", GenericLengthSpecInheritedC,
+               &FOTBuilder::setJustifyGlyphSpaceMaxRemove, 0);
+  INHERITED_C2("table-corner-radius", GenericLengthSpecInheritedC,
+               &FOTBuilder::setTableCornerRadius, 3*unitsPerInch()/72);
+  INHERITED_C2("box-corner-radius", GenericLengthSpecInheritedC,
+               &FOTBuilder::setBoxCornerRadius, 3*unitsPerInch()/72);
+  INHERITED_C2("marginalia-sep", GenericLengthSpecInheritedC,
+               &FOTBuilder::setMarginaliaSep, 0);
+  INHERITED_C2("inhibit-line-breaks?", GenericBoolInheritedC, &FOTBuilder::setInhibitLineBreaks, 0);
+  INHERITED_C2("hyphenate?", GenericBoolInheritedC, &FOTBuilder::setHyphenate, 0);
+  INHERITED_C2("kern?", GenericBoolInheritedC, &FOTBuilder::setKern, 0);
+  INHERITED_C2("ligature?", GenericBoolInheritedC, &FOTBuilder::setLigature, 0);
+  INHERITED_C2("score-spaces?", GenericBoolInheritedC, &FOTBuilder::setScoreSpaces, 0);
+  INHERITED_C2("float-out-sidelines?", GenericBoolInheritedC, &FOTBuilder::setFloatOutSidelines, 0);
+  INHERITED_C2("float-out-marginalia?", GenericBoolInheritedC, &FOTBuilder::setFloatOutMarginalia, 0);
+  INHERITED_C2("float-out-line-numbers?", GenericBoolInheritedC, &FOTBuilder::setFloatOutLineNumbers, 0);
+  INHERITED_C2("cell-background?", GenericBoolInheritedC, &FOTBuilder::setCellBackground, 0);
+  INHERITED_C2("span-weak?", GenericBoolInheritedC, &FOTBuilder::setSpanWeak, 0);
+  INHERITED_C2("ignore-record-end?", GenericBoolInheritedC, &FOTBuilder::setIgnoreRecordEnd, 0);
+  INHERITED_C2("numbered-lines?", GenericBoolInheritedC, &FOTBuilder::setNumberedLines, 1);
+  INHERITED_C2("hanging-punct?", GenericBoolInheritedC, &FOTBuilder::setHangingPunct, 0);
+  INHERITED_C2("box-open-end?", GenericBoolInheritedC, &FOTBuilder::setBoxOpenEnd, 0);
+  INHERITED_C2("truncate-leader?", GenericBoolInheritedC, &FOTBuilder::setTruncateLeader, 0);
+  INHERITED_C2("align-leader?", GenericBoolInheritedC, &FOTBuilder::setAlignLeader, 1);
+  INHERITED_C2("table-part-omit-middle-header?", GenericBoolInheritedC,
+              &FOTBuilder::setTablePartOmitMiddleHeader, 0);
+  INHERITED_C2("table-part-omit-middle-footer?", GenericBoolInheritedC,
+              &FOTBuilder::setTablePartOmitMiddleFooter, 0);
+  INHERITED_C2("border-omit-at-break?", GenericBoolInheritedC, &FOTBuilder::setBorderOmitAtBreak, 0);
+  INHERITED_C2("principal-mode-simultaneous?", GenericBoolInheritedC,
+              &FOTBuilder::setPrincipalModeSimultaneous, 0);
+  INHERITED_C2("marginalia-keep-with-previous?", GenericBoolInheritedC,
+              &FOTBuilder::setMarginaliaKeepWithPrevious, 0);
+  INHERITED_C2("grid-equidistant-rows?", GenericBoolInheritedC, &FOTBuilder::setGridEquidistantRows, 0);
+  INHERITED_C2("grid-equidistant-columns?", GenericBoolInheritedC, &FOTBuilder::setGridEquidistantColumns, 0);
+  INHERITED_C2("line-join", GenericSymbolInheritedC, &FOTBuilder::setLineJoin,
+              FOTBuilder::symbolMiter);
+  INHERITED_C2("line-cap", GenericSymbolInheritedC, &FOTBuilder::setLineCap,
+              FOTBuilder::symbolButt);
+  INHERITED_C2("line-number-side", GenericSymbolInheritedC, &FOTBuilder::setLineNumberSide,
+              FOTBuilder::symbolStart);
+  INHERITED_C2("kern-mode", GenericSymbolInheritedC, &FOTBuilder::setKernMode,
+              FOTBuilder::symbolNormal);
+  INHERITED_C2("input-whitespace-treatment", GenericSymbolInheritedC,
+              &FOTBuilder::setInputWhitespaceTreatment, FOTBuilder::symbolPreserve);
+  INHERITED_C2("filling-direction", GenericSymbolInheritedC, &FOTBuilder::setFillingDirection,
+              FOTBuilder::symbolTopToBottom );
+  INHERITED_C2("writing-mode", GenericSymbolInheritedC, &FOTBuilder::setWritingMode,
+              FOTBuilder::symbolLeftToRight );
+  INHERITED_C2("last-line-quadding", GenericSymbolInheritedC, &FOTBuilder::setLastLineQuadding,
+              FOTBuilder::symbolRelative);
+  INHERITED_C2("math-display-mode", GenericSymbolInheritedC, &FOTBuilder::setMathDisplayMode,
+              FOTBuilder::symbolDisplay);
+  INHERITED_C2("script-pre-align", GenericSymbolInheritedC, &FOTBuilder::setScriptPreAlign,
+               FOTBuilder::symbolIndependent);
+  INHERITED_C2("script-post-align", GenericSymbolInheritedC, &FOTBuilder::setScriptPostAlign,
+               FOTBuilder::symbolIndependent);
+  INHERITED_C2("script-mid-sup-align", GenericSymbolInheritedC, &FOTBuilder::setScriptMidSupAlign,
+               FOTBuilder::symbolCenter);
+  INHERITED_C2("script-mid-sub-align", GenericSymbolInheritedC, &FOTBuilder::setScriptMidSubAlign,
+               FOTBuilder::symbolCenter);
+  INHERITED_C2("numerator-align", GenericSymbolInheritedC, &FOTBuilder::setNumeratorAlign,
+               FOTBuilder::symbolCenter);
+  INHERITED_C2("denominator-align", GenericSymbolInheritedC, &FOTBuilder::setDenominatorAlign,
+               FOTBuilder::symbolCenter);
+  INHERITED_C2("grid-position-cell-type", GenericSymbolInheritedC, &FOTBuilder::setGridPositionCellType,
+               FOTBuilder::symbolRowMajor);
+  INHERITED_C2("grid-column-alignment", GenericSymbolInheritedC, &FOTBuilder::setGridColumnAlignment,
+               FOTBuilder::symbolCenter);
+  INHERITED_C2("grid-row-alignment", GenericSymbolInheritedC, &FOTBuilder::setGridRowAlignment,
+               FOTBuilder::symbolCenter);
+  INHERITED_C2("box-type", GenericSymbolInheritedC, &FOTBuilder::setBoxType,
+              FOTBuilder::symbolBorder);
+  INHERITED_C2("glyph-alignment-mode", GenericSymbolInheritedC, &FOTBuilder::setGlyphAlignmentMode,
+              FOTBuilder::symbolFont);
+  INHERITED_C2("box-border-alignment", GenericSymbolInheritedC, &FOTBuilder::setBoxBorderAlignment,
+              FOTBuilder::symbolOutside);
+  INHERITED_C2("cell-row-alignment", GenericSymbolInheritedC, &FOTBuilder::setCellRowAlignment,
+              FOTBuilder::symbolStart);
+  INHERITED_C2("border-alignment", GenericSymbolInheritedC, &FOTBuilder::setBorderAlignment,
+              FOTBuilder::symbolCenter);
+  INHERITED_C2("sideline-side", GenericSymbolInheritedC, &FOTBuilder::setSidelineSide,
+              FOTBuilder::symbolStart);
+  INHERITED_C2("hyphenation-keep", GenericSymbolInheritedC, &FOTBuilder::setHyphenationKeep,
+              FOTBuilder::symbolFalse);
+  INHERITED_C2("font-structure", GenericSymbolInheritedC, &FOTBuilder::setFontStructure,
+              FOTBuilder::symbolSolid);
+  INHERITED_C2("font-proportionate-width", GenericSymbolInheritedC,
+              &FOTBuilder::setFontProportionateWidth, FOTBuilder::symbolMedium);
+  INHERITED_C2("cell-crossed", GenericSymbolInheritedC, &FOTBuilder::setCellCrossed,
+              FOTBuilder::symbolFalse);
+  INHERITED_C2("marginalia-side", GenericSymbolInheritedC, &FOTBuilder::setMarginaliaSide,
+              FOTBuilder::symbolStart);
+  INHERITED_C2("layer", GenericIntegerInheritedC, &FOTBuilder::setLayer, 0);
+  INHERITED_C2("background-layer", GenericIntegerInheritedC, &FOTBuilder::setBackgroundLayer, -1);
+  INHERITED_C2("border-priority", GenericIntegerInheritedC, &FOTBuilder::setBorderPriority, 0);
+  INHERITED_C2("line-repeat", GenericIntegerInheritedC, &FOTBuilder::setLineRepeat, 1);
+  INHERITED_C2("span", GenericIntegerInheritedC, &FOTBuilder::setSpan, 1);
+  INHERITED_C2("min-leader-repeat", GenericIntegerInheritedC, &FOTBuilder::setMinLeaderRepeat, 1);
+  INHERITED_C2("hyphenation-remain-char-count", GenericIntegerInheritedC,
+              &FOTBuilder::setHyphenationRemainCharCount, 2);
+  INHERITED_C2("hyphenation-push-char-count", GenericIntegerInheritedC,
+              &FOTBuilder::setHyphenationPushCharCount, 2);
+  INHERITED_C2("widow-count", GenericIntegerInheritedC, &FOTBuilder::setWidowCount, 2);
+  INHERITED_C2("orphan-count", GenericIntegerInheritedC, &FOTBuilder::setOrphanCount, 2);
+  // #f or strictly positive integer
+  INHERITED_C2("expand-tabs?", GenericMaybeIntegerInheritedC,
+              &FOTBuilder::setExpandTabs, 8);
+  INHERITED_C2("hyphenation-ladder-count", GenericMaybeIntegerInheritedC,
+              &FOTBuilder::setHyphenationLadderCount, 0);
+  INHERITED_C("background-tile", GenericPublicIdInheritedC, &FOTBuilder::setBackgroundTile);
+  INHERITED_C("line-breaking-method", GenericPublicIdInheritedC, &FOTBuilder::setLineBreakingMethod);
+  INHERITED_C("line-composition-method", GenericPublicIdInheritedC, &FOTBuilder::setLineCompositionMethod);
+  INHERITED_C("implicit-bidi-method", GenericPublicIdInheritedC, &FOTBuilder::setImplicitBidiMethod);
+  INHERITED_C("glyph-subst-method", GenericPublicIdInheritedC, &FOTBuilder::setGlyphSubstMethod);
+  INHERITED_C("glyph-reorder-method", GenericPublicIdInheritedC, &FOTBuilder::setGlyphReorderMethod);
+  INHERITED_C("hyphenation-method", GenericPublicIdInheritedC, &FOTBuilder::setHyphenationMethod);
+  INHERITED_C("table-auto-width-method", GenericPublicIdInheritedC, &FOTBuilder::setTableAutoWidthMethod);
+  INHERITED_C("font-name", GenericPublicIdInheritedC, &FOTBuilder::setFontName);
+  // 2 letter symbol or #f
+  INHERITED_C("language", GenericLetter2InheritedC, &FOTBuilder::setLanguage);
+  INHERITED_C("country", GenericLetter2InheritedC, &FOTBuilder::setCountry);
+  // Ignored characteristics
+  ELObjDynamicRoot length0(*this, new (*this) LengthObj(0));
+  // #f or length-spec
+  INHERITED_C("min-pre-line-spacing", GenericOptLengthSpecInheritedC, &FOTBuilder::setMinPreLineSpacing);
+  INHERITED_C("min-post-line-spacing", GenericOptLengthSpecInheritedC, &FOTBuilder::setMinPostLineSpacing);
+  INHERITED_C("min-leading", GenericOptLengthSpecInheritedC, &FOTBuilder::setMinLeading);
+  // inline spaces
+  INHERITED_C("escapement-space-before", GenericInlineSpaceInheritedC, &FOTBuilder::setEscapementSpaceBefore);
+  INHERITED_C("escapement-space-after", GenericInlineSpaceInheritedC, &FOTBuilder::setEscapementSpaceAfter);
+  // #f or glyph-subst-table
+  INHERITED_C("glyph-subst-table", GlyphSubstTableC, 0);
+
+  // #f or inline-space
+  INHERITED_C("inline-space-space", GenericOptInlineSpaceInheritedC, &FOTBuilder::setInlineSpaceSpace);
+  // integers
+  // float
+  IGNORED_C("line-miter-limit", makeInteger(10));
+  // #f or percentage
+  IGNORED_C("alignment-point-offset", makeInteger(50));
+  // char
+  IGNORED_C("hyphenation-char", new (*this) CharObj('-'));
+  // char or #f
+  IGNORED_C("asis-truncate-char", makeFalse());
+  IGNORED_C("asis-wrap-char", makeFalse());
+  // #f, #t or char
+  IGNORED_C("first-line-align", makeFalse());
+  // list of strings
+  IGNORED_C("hyphenation-exceptions", makeNil());
+  // set of corners
+  IGNORED_C("box-corner-rounded", makeFalse());
+  IGNORED_C("table-corner-rounded", makeFalse());
+  // list of lengths
+  IGNORED_C("line-dash", new (*this) PairObj(length0, makeNil()));
+  // list of glyphs/chars
+  IGNORED_C("allowed-ligatures", makeNil());
+  // #f or sosofo
+  IGNORED_C("line-number", makeFalse());
+  // integer or 'force
+  IGNORED_C("line-spacing-priority", makeInteger(0));
+  // procedure or #f
+  IGNORED_C("char-map", makeFalse());
+}
+
+void Interpreter::installInheritedC(const char *s, InheritedC *ic)
+{
+  StringC name(makeStringC(s));
+  Identifier *ident = lookup(name);
+  ic->setIdentifier(ident);
+  ident->setInheritedC(ic);
+  installInheritedCProc(ident);
+  if (dsssl2() && name.size() && name[name.size() - 1] == '?') {
+    name.resize(name.size() - 1);
+    Identifier *ident2 = lookup(name);
+    ASSERT(ident2->inheritedC().isNull());
+    ident2->setInheritedC(ic);
+    installInheritedCProc(ident2);
+  }
+}
+
+void Interpreter::installExtensionInheritedC(Identifier *ident,
+                                            const StringC &pubid,
+                                            const Location &loc)
+{
+  ConstPtr<InheritedC> ic;
+  if (pubid.size() != 0 && extensionTable_) {
+    for (const FOTBuilder::Extension *ep = extensionTable_; ep->pubid; ep++) {
+      if (pubid == ep->pubid) {
+       if (ep->boolSetter)
+         ic = new ExtensionBoolInheritedC(ident, nInheritedC_++, ep->boolSetter);
+       else if (ep->stringSetter)
+         ic = new ExtensionStringInheritedC(ident, nInheritedC_++, ep->stringSetter);
+       else if (ep->integerSetter)
+         ic = new ExtensionIntegerInheritedC(ident, nInheritedC_++, ep->integerSetter);
+       else if (ep->lengthSetter)
+         ic = new ExtensionLengthInheritedC(ident, nInheritedC_++, ep->lengthSetter);
+       break;
+      }
+    }
+  }
+  if (ic.isNull())
+    // FIXME should call FOTBuilder with PublicId argument
+    ic = new IgnoredC(ident, nInheritedC_++, makeFalse(), *this);
+  ident->setInheritedC(ic, currentPartIndex(), loc);
+  installInheritedCProc(ident);
+}
+
+void Interpreter::installInheritedCProc(const Identifier *ident)
+{
+  const ConstPtr<InheritedC> &ic = ident->inheritedC();
+  StringC tem(makeStringC("inherited-"));
+  tem += ident->name();
+  Identifier *inhIdent = lookup(tem);
+  PrimitiveObj *prim = new (*this) InheritedCPrimitiveObj(ic);
+  makePermanent(prim);
+  prim->setIdentifier(inhIdent);
+  inhIdent->setValue(prim);
+  tem = makeStringC("actual-");
+  tem += ident->name();
+  Identifier *actIdent = lookup(tem);
+  prim = new (*this) ActualCPrimitiveObj(ic);
+  makePermanent(prim);
+  prim->setIdentifier(actIdent);
+  actIdent->setValue(prim);
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
diff --git a/style/Insn.cxx b/style/Insn.cxx
new file mode 100644 (file)
index 0000000..f7bc670
--- /dev/null
@@ -0,0 +1,1482 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#include "stylelib.h"
+#include "VM.h"
+#include "Insn.h"
+#include "Interpreter.h"
+#include "InterpreterMessages.h"
+#include "ELObjMessageArg.h"
+#include "Expression.h"
+#include "macros.h"
+#include "Insn2.h"
+#include "SosofoObj.h"
+#include "Node.h"
+#include "ELObjPropVal.h"
+#include <string.h>
+#include <stddef.h>
+#include <stdio.h>
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+
+VM::VM(Interpreter &interpreter)
+: Collector::DynamicRoot(interpreter), interp(&interpreter)
+{
+  init();
+}
+
+VM::VM(EvalContext &context, Interpreter &interpreter)
+: EvalContext(context), Collector::DynamicRoot(interpreter), interp(&interpreter)
+{
+  init();
+}
+
+void VM::init()
+{
+  slim = 0;
+  sbase = 0;
+  sp = 0;
+  closure = 0;
+  frame = 0;
+  protectClosure = 0;
+  csp = 0;
+  cslim = 0;
+  csbase = 0;
+  closureLoc.clear();
+}
+
+VM::~VM()
+{
+  delete [] sbase;
+  delete [] csbase;
+}
+
+void VM::initStack()
+{
+  sp = sbase;
+  frame = sbase;
+  csp = csbase;
+  modeStack.resize(0);
+}
+
+void VM::growStack(int n)
+{
+  size_t newSize = sp - sbase;
+  if (n > newSize)
+    newSize += (n + 15) & ~15;
+  else
+    newSize += newSize;
+  ELObj **newStack = new ELObj *[newSize];
+  slim = newStack + newSize;
+  memcpy(newStack, sbase, (sp - sbase)*sizeof(ELObj *));
+  sp = newStack + (sp - sbase);
+  frame = newStack + (frame - sbase);
+  if (sbase)
+    delete [] sbase;
+  sbase = newStack;
+}
+
+void VM::trace(Collector &c) const
+{
+  if (sp) {
+    for (ELObj **p = sbase; p != sp; p++)
+      c.trace(*p);
+  }
+  for (ControlStackEntry *p = csbase; p != csp; p++) {
+    c.trace(p->protectClosure);
+    c.trace(p->continuation);
+  }
+  c.trace(protectClosure);
+}
+
+void VM::pushFrame(const Insn *next, int argsPushed)
+{
+  if (csp >= cslim) {
+    size_t newSize = csbase ? (cslim - csbase)*2 : 8;
+    ControlStackEntry *newBase = new ControlStackEntry[newSize];
+    cslim = newBase + newSize;
+    ControlStackEntry *newP = newBase;
+    for (const ControlStackEntry *oldP = csbase; oldP < csp; oldP++)
+      *newP++ = *oldP;
+    csp = newP;
+    if (csbase)
+      delete [] csbase;
+    csbase = newBase;
+  }
+  csp->closure = closure;
+  csp->protectClosure = protectClosure;
+  csp->next = next;
+  csp->frameSize = sp - frame - argsPushed;
+  csp->closureLoc = closureLoc;
+  csp->continuation = 0;
+  csp++;
+}
+
+const Insn *VM::popFrame()
+{
+  ASSERT(csp > csbase);
+  --csp;
+  if (csp->continuation)
+    csp->continuation->kill();
+  closure = csp->closure;
+  protectClosure = csp->protectClosure;
+  frame = sp - csp->frameSize;
+  closureLoc = csp->closureLoc;
+  return csp->next;
+}
+
+void VM::setClosureArgToCC()
+{
+  ASSERT(nActualArgs == 1);
+  ContinuationObj *cc = (ContinuationObj *)sp[-1];
+  csp[-1].continuation = cc;
+  cc->set(sp - sbase, csp - csbase);
+}
+
+ELObj *VM::eval(const Insn *insn, ELObj **display, ELObj *arg)
+{
+  initStack();
+  if (arg) {
+    needStack(1);
+    *sp++ = arg;
+  }
+  closure = display;
+  protectClosure = 0;
+  closureLoc.clear();
+  // The inner loop.
+  while (insn)
+    insn = insn->execute(*this);
+  ELObj *result;
+  if (sp) {
+    sp--;
+    ASSERT(sp == sbase);
+    ASSERT(csp == csbase);
+    result = *sp;
+    ASSERT(result != 0);
+  }
+  else {
+    if (interp->debugMode())
+      stackTrace();
+    result = interp->makeError();
+  }
+  return result;
+}
+
+void VM::stackTrace()
+{
+  unsigned long count = 0;
+  if (protectClosure) {
+    interp->setNextLocation(closureLoc);
+    interp->message(InterpreterMessages::stackTrace);
+    count++;
+  }
+  ControlStackEntry *lim = csbase;
+  if (csp != csbase && !csbase->protectClosure)
+    lim++;
+  for (ControlStackEntry *p = csp; p != lim; p--) {
+    interp->setNextLocation(p[-1].closureLoc);
+    count++;
+    if (count == 5 && p - lim > 7) {
+      interp->message(InterpreterMessages::stackTraceEllipsis,
+                     NumberMessageArg(p - (lim + 6)));
+      p = lim + 6;
+    }
+    else
+      interp->message(InterpreterMessages::stackTrace);
+  }
+}
+
+Insn::~Insn()
+{
+}
+
+bool Insn::isReturn(int &) const
+{
+  return false;
+}
+
+bool Insn::isPopBindings(int &, InsnPtr &) const
+{
+  return false;
+}
+
+const Insn *ErrorInsn::execute(VM &vm) const
+{
+  vm.sp = 0;
+  return 0;
+}
+
+CondFailInsn::CondFailInsn(const Location &loc)
+: loc_(loc)
+{
+}
+
+const Insn *CondFailInsn::execute(VM &vm) const
+{
+  vm.interp->setNextLocation(loc_);
+  vm.interp->message(InterpreterMessages::condFail);
+  return ErrorInsn::execute(vm);
+}
+
+CaseFailInsn::CaseFailInsn(const Location &loc)
+: loc_(loc)
+{
+}
+
+const Insn *CaseFailInsn::execute(VM &vm) const
+{
+  vm.interp->setNextLocation(loc_);
+  vm.interp->message(InterpreterMessages::caseFail, ELObjMessageArg(vm.sp[-1], *vm.interp));
+  return ErrorInsn::execute(vm);
+}
+
+ConstantInsn::ConstantInsn(ELObj *obj, InsnPtr next)
+: value_(obj), next_(next)
+{
+}
+
+const Insn *ConstantInsn::execute(VM &vm) const
+{
+  vm.needStack(1);
+  *vm.sp++ = value_;
+  return next_.pointer();
+}
+
+ResolveQuantitiesInsn::ResolveQuantitiesInsn(const Location &loc, InsnPtr next)
+: loc_(loc), next_(next)
+{
+}
+
+const Insn *ResolveQuantitiesInsn::execute(VM &vm) const
+{
+  ELObj *tem = vm.sp[-1]->resolveQuantities(1,
+                                           *vm.interp,
+                                           loc_);
+  ASSERT(tem != 0);
+  if (vm.interp->isError(tem)) {
+    vm.sp = 0;
+    return 0;
+  }
+  vm.sp[-1] = tem;
+  return next_.pointer();
+}
+
+TestInsn::TestInsn(InsnPtr consequent, InsnPtr alternative)
+: consequent_(consequent), alternative_(alternative)
+{
+}
+
+const Insn *TestInsn::execute(VM &vm) const
+{
+  return (*--vm.sp)->isTrue() ? consequent_.pointer() : alternative_.pointer();
+}
+
+OrInsn::OrInsn(InsnPtr nextTest, InsnPtr next)
+: nextTest_(nextTest), next_(next)
+{
+}
+
+const Insn *OrInsn::execute(VM &vm) const
+{
+  if (vm.sp[-1]->isTrue())
+    return next_.pointer();
+  --vm.sp;
+  return nextTest_.pointer();
+}
+
+AndInsn::AndInsn(InsnPtr nextTest, InsnPtr next)
+: nextTest_(nextTest), next_(next)
+{
+}
+
+const Insn *AndInsn::execute(VM &vm) const
+{
+  if (!vm.sp[-1]->isTrue())
+    return next_.pointer();
+  --vm.sp;
+  return nextTest_.pointer();
+}
+
+CaseInsn::CaseInsn(ELObj *obj, InsnPtr match, InsnPtr fail)
+: obj_(obj), match_(match), fail_(fail)
+{
+}
+
+const Insn *CaseInsn::execute(VM &vm) const
+{
+  if (ELObj::eqv(*vm.sp[-1], *obj_)) {
+    --vm.sp;
+    return match_.pointer();
+  }
+  return fail_.pointer();
+}
+
+PopInsn::PopInsn(InsnPtr next)
+: next_(next)
+{
+}
+
+const Insn *PopInsn::execute(VM &vm) const
+{
+  --vm.sp;
+  return next_.pointer();
+}
+
+ConsInsn::ConsInsn(InsnPtr next)
+: next_(next)
+{
+}
+
+const Insn *ConsInsn::execute(VM &vm) const
+{
+  vm.sp[-2] = vm.interp->makePair(vm.sp[-1], vm.sp[-2]);
+  --vm.sp;
+  return next_.pointer();
+}
+
+AppendInsn:: AppendInsn(const Location &loc, InsnPtr next)
+: loc_(loc), next_(next)
+{
+}
+
+const Insn *AppendInsn::execute(VM &vm) const
+{
+  ELObj *&source = vm.sp[-1];
+  if (!source->isNil()) {
+    PairObj *pair = source->asPair();
+    if (!pair) {
+      vm.interp->setNextLocation(loc_);
+      vm.interp->message(InterpreterMessages::spliceNotList);
+      vm.sp = 0;
+      return 0;
+    }
+    source = pair->cdr();
+    PairObj *tail = vm.interp->makePair(pair->car(), 0);
+    ELObjDynamicRoot head(*vm.interp, tail);
+    while (!source->isNil()) {
+      pair = source->asPair();
+      if (!pair) {
+       vm.interp->setNextLocation(loc_);
+        vm.interp->message(InterpreterMessages::spliceNotList);
+       vm.sp = 0;
+       return 0;
+      }
+      PairObj *newTail = vm.interp->makePair(pair->car(), 0);
+      tail->setCdr(newTail);
+      tail = newTail;
+      source = pair->cdr();
+    }
+    tail->setCdr(vm.sp[-2]);
+    vm.sp[-2] = head;
+  }
+  --vm.sp;
+  return next_.pointer();
+}
+
+ApplyBaseInsn::ApplyBaseInsn(int nArgs, const Location &loc)
+: nArgs_(nArgs), loc_(loc)
+{
+}
+
+ApplyInsn::ApplyInsn(int nArgs, const Location &loc, InsnPtr next)
+: ApplyBaseInsn(nArgs, loc), next_(next)
+{
+}
+
+TailApplyInsn::TailApplyInsn(int nCallerArgs, int nArgs, const Location &loc)
+: ApplyBaseInsn(nArgs, loc), nCallerArgs_(nCallerArgs)
+{
+}
+
+// top of stack is operand; next down is last operand and so on
+
+FunctionObj *ApplyBaseInsn::decodeArgs(VM &vm) const
+{
+  FunctionObj *func = (*--vm.sp)->asFunction();
+  if (!func) {
+    vm.interp->setNextLocation(loc_);
+    vm.interp->message(InterpreterMessages::callNonFunction,
+                      ELObjMessageArg(*vm.sp, *vm.interp));
+    vm.sp = 0;
+    return 0;
+  }
+  int nReq = func->nRequiredArgs();
+  if (nArgs_ < nReq) {
+    vm.interp->setNextLocation(loc_);
+    vm.interp->message(InterpreterMessages::missingArg);
+    vm.sp = 0;
+    return 0;
+  }
+  if (nArgs_ - nReq > func->nOptionalArgs()) {
+    if (func->nKeyArgs()) {
+      // Keyword args can be specified more than once
+      // so we can only check there are an even number.
+      if ((nArgs_ - nReq - func->nOptionalArgs()) & 1) {
+       vm.interp->setNextLocation(loc_);
+       vm.interp->message(InterpreterMessages::oddKeyArgs);
+       vm.sp -= (nArgs_ - nReq) - func->nOptionalArgs();
+      }
+    }
+    else if (!func->restArg()) {
+      vm.interp->setNextLocation(loc_);
+      vm.interp->message(InterpreterMessages::tooManyArgs);
+      vm.sp -= (nArgs_ - nReq) - func->nOptionalArgs();
+    }
+  }
+  return func;
+}
+
+const Insn *ApplyInsn::execute(VM &vm) const
+{
+  FunctionObj *func = decodeArgs(vm);
+  vm.nActualArgs = nArgs_;
+  if (func)
+    return func->call(vm, loc_, next_.pointer());
+  else
+    return 0;
+}
+
+const Insn *TailApplyInsn::execute(VM &vm) const
+{
+  FunctionObj *func = decodeArgs(vm);
+  vm.nActualArgs = nArgs_;
+  if (func)
+    return func->tailCall(vm, loc_, nCallerArgs_);
+  else
+    return 0;
+}
+
+ApplyPrimitiveObj::ApplyPrimitiveObj()
+: FunctionObj(&signature_)
+{
+}
+
+const Signature ApplyPrimitiveObj::signature_ = { 2, 0, 1 };
+
+const Insn *ApplyPrimitiveObj::call(VM &vm, const Location &loc,
+                                   const Insn *next)
+{
+  if (!shuffle(vm, loc))
+    return 0;
+  ApplyInsn insn(vm.nActualArgs, loc, (Insn *)next);
+  return insn.execute(vm);
+}
+
+bool ApplyPrimitiveObj::shuffle(VM &vm, const Location &loc)
+{
+  int nArgs = vm.nActualArgs;
+  ELObj *func = vm.sp[-nArgs];
+  for (int i = nArgs - 2; i > 0; i--)
+    vm.sp[-i - 2] = vm.sp[-i - 1];
+  vm.nActualArgs = nArgs - 2;
+  ELObj *list = *--vm.sp;
+  --vm.sp;
+  while (!list->isNil()) {
+    PairObj *tem = list->asPair();
+    if (!tem) {
+      vm.interp->setNextLocation(loc);
+      vm.interp->message(InterpreterMessages::notAList,
+                        StringMessageArg(vm.interp->makeStringC("apply")),
+                        OrdinalMessageArg(nArgs),
+                        ELObjMessageArg(list, *vm.interp));
+      vm.sp = 0;
+      return 0;
+    }
+    vm.needStack(1);
+    vm.nActualArgs++;
+    *vm.sp++ = tem->car();
+    list = tem->cdr();
+  }
+  vm.needStack(1);
+  *vm.sp++ = func;
+  return 1;
+}
+
+const Insn *ApplyPrimitiveObj::tailCall(VM &vm, const Location &loc,
+                                       int nCallerArgs)
+{
+  if (!shuffle(vm, loc))
+    return 0;
+  TailApplyInsn insn(nCallerArgs, vm.nActualArgs, loc);
+  return insn.execute(vm);
+}
+
+PrimitiveCallInsn::PrimitiveCallInsn(int nArgs, PrimitiveObj *prim,
+                                    const Location &loc,
+                                    InsnPtr next)
+: nArgs_(nArgs), prim_(prim), loc_(loc), next_(next)
+{
+}
+
+const Insn *PrimitiveCallInsn::execute(VM &vm) const
+{
+  if (nArgs_ == 0)
+    vm.needStack(1);
+  ELObj **argp = vm.sp - nArgs_;
+  *argp = prim_->primitiveCall(nArgs_, argp, vm, *vm.interp, loc_);
+  ASSERT(vm.interp->objectMaybeLive(*argp));
+  vm.sp = argp + 1;
+  if (vm.interp->isError(*argp)) {
+    vm.sp = 0;
+    return 0;
+  }
+  else
+    return next_.pointer();
+}
+
+InsnPtr FunctionObj::makeCallInsn(int nArgs, Interpreter &,
+                                 const Location &loc,
+                                 InsnPtr next)
+{
+  return new FunctionCallInsn(nArgs, this, loc, next);
+}
+
+InsnPtr FunctionObj::makeTailCallInsn(int nArgs, Interpreter &,
+                                     const Location &loc, int nCallerArgs)
+{
+  return new FunctionTailCallInsn(nArgs, this, loc, nCallerArgs);
+}
+
+FunctionObj *FunctionObj::asFunction()
+{
+  return this;
+}
+
+void FunctionObj::setArgToCC(VM &)
+{
+}
+
+const Insn *PrimitiveObj::call(VM &vm, const Location &loc,
+                              const Insn *next)
+{
+  if (vm.nActualArgs == 0)
+    vm.needStack(1);
+  ELObj **argp = vm.sp - vm.nActualArgs;
+  *argp = primitiveCall(vm.nActualArgs, argp, vm, *vm.interp, loc);
+  vm.sp = argp + 1;
+  if (vm.interp->isError(*argp)) {
+    vm.sp = 0;
+    return 0;
+  }
+  else
+    return next;
+}
+
+const Insn *PrimitiveObj::tailCall(VM &vm, const Location &loc,
+                                  int nCallerArgs)
+{
+  ELObj **argp = vm.sp - vm.nActualArgs;
+  ELObj *result = primitiveCall(vm.nActualArgs, argp, vm, *vm.interp, loc);
+  if (vm.interp->isError(result)) {
+    vm.sp = 0;
+    return 0;
+  }
+  else {
+    vm.sp = argp - nCallerArgs;
+    const Insn *next = vm.popFrame();
+    vm.needStack(1);
+    *vm.sp++ = result;
+    return next;
+  }
+}
+
+InsnPtr PrimitiveObj::makeCallInsn(int nArgs, Interpreter &interp, const Location &loc,
+                                  InsnPtr next)
+{
+  return new PrimitiveCallInsn(nArgs, this, loc, next);
+}
+
+ELObj *PrimitiveObj::argError(Interpreter &interp,
+                             const Location &loc,
+                             const MessageType3 &msg,
+                             unsigned index,
+                             ELObj *obj) const
+{
+  NodeListObj *nl = obj->asNodeList();
+  if (!nl || !nl->suppressError()) {
+    interp.setNextLocation(loc);
+    interp.message(msg,
+                  StringMessageArg(ident_->name()),
+                  OrdinalMessageArg(index + 1),
+                  ELObjMessageArg(obj, interp));
+  }
+  return interp.makeError();
+}
+
+ELObj *PrimitiveObj::noCurrentNodeError(Interpreter &interp,
+                                       const Location &loc) const
+{
+  interp.setNextLocation(loc);
+  interp.message(InterpreterMessages::noCurrentNode);
+  return interp.makeError();
+}
+
+ClosureInsn::ClosureInsn(const Signature *sig, InsnPtr code, int displayLength,
+                        InsnPtr next)
+: sig_(sig), code_(code), displayLength_(displayLength), next_(next)
+{
+}
+
+const Insn *ClosureInsn::execute(VM &vm) const
+{
+  ELObj **display
+    = displayLength_ ? new ELObj *[displayLength_ + 1] : 0;
+  ELObj **tem = vm.sp - displayLength_;
+  for (int i = 0; i < displayLength_; i++)
+    display[i] = tem[i];
+  if (displayLength_ == 0) {
+    vm.needStack(1);
+    tem = vm.sp;
+  }
+  else
+    display[displayLength_] = 0;
+  // Make sure objects in display are still visible on the stack
+  // to the garbage collector.
+  *tem++ = new (*vm.interp) ClosureObj(sig_, code_, display);
+  vm.sp = tem;
+  return next_.pointer();
+}
+
+FunctionCallInsn:: FunctionCallInsn(int nArgs, FunctionObj *function,
+                                   const Location &loc, InsnPtr next)
+: nArgs_(nArgs), function_(function), loc_(loc), next_(next)
+{
+}
+
+const Insn *FunctionCallInsn::execute(VM &vm) const
+{
+  vm.nActualArgs = nArgs_;
+  return function_->call(vm, loc_, next_.pointer());
+}
+
+FunctionTailCallInsn:: FunctionTailCallInsn(int nArgs, FunctionObj *function,
+                                           const Location &loc,
+                                           int nCallerArgs)
+: nArgs_(nArgs), function_(function), loc_(loc), nCallerArgs_(nCallerArgs)
+{
+}
+
+const Insn *FunctionTailCallInsn::execute(VM &vm) const
+{
+  vm.nActualArgs = nArgs_;
+  return function_->tailCall(vm, loc_, nCallerArgs_);
+}
+
+TestNullInsn::TestNullInsn(int offset, InsnPtr ifNull, InsnPtr ifNotNull)
+: offset_(offset), ifNull_(ifNull), ifNotNull_(ifNotNull)
+{
+}
+     
+const Insn *TestNullInsn::execute(VM &vm) const
+{
+  if (vm.sp[offset_] == 0)
+    return ifNull_.pointer();
+  else
+    return ifNotNull_.pointer();
+}
+
+VarargsInsn::VarargsInsn(const Signature &sig,
+                        Vector<InsnPtr> &entryPoints,
+                        const Location &loc)
+: sig_(&sig), loc_(loc)
+{
+  entryPoints.swap(entryPoints_);
+}
+
+const Insn *VarargsInsn::execute(VM &vm) const
+{
+  int n = vm.nActualArgs - sig_->nRequiredArgs;
+  if ((sig_->restArg || sig_->nKeyArgs)
+      && n > entryPoints_.size() - 2) {
+    // cons up the rest args
+    ELObjDynamicRoot protect(*vm.interp, vm.interp->makeNil());
+    for (int i = n - (entryPoints_.size() - 2); i > 0; i--) {
+      protect = new (*vm.interp) PairObj(vm.sp[-1], protect);
+      --vm.sp;
+    }
+    vm.needStack(sig_->nKeyArgs + sig_->restArg);
+    if (sig_->restArg)
+      *vm.sp++ = protect;
+    if (sig_->nKeyArgs) {
+      for (int i = 0; i < sig_->nKeyArgs; i++)
+       vm.sp[i] = 0;
+      ELObj *tem = protect;
+      for (int i = n - (entryPoints_.size() - 2); i > 0; i -= 2) {
+       KeywordObj *k = ((PairObj *)tem)->car()->asKeyword();
+       tem = ((PairObj *)tem)->cdr();
+       if (k) {
+         for (int j = 0; j < sig_->nKeyArgs; j++)
+           if (sig_->keys[j] == k->identifier()) {
+             if (vm.sp[j] == 0)
+               vm.sp[j] = ((PairObj *)tem)->car();
+             k = 0;
+             break;
+           }
+         if (k && !sig_->restArg) {
+           vm.interp->setNextLocation(loc_);
+           vm.interp->message(InterpreterMessages::invalidKeyArg,
+                              StringMessageArg(k->identifier()->name()));
+         }
+       }
+       else {
+         vm.interp->setNextLocation(loc_);
+         vm.interp->message(InterpreterMessages::keyArgsNotKey);
+       }
+       tem = ((PairObj *)tem)->cdr();
+      }
+      vm.sp += sig_->nKeyArgs;
+    }
+    return entryPoints_.back().pointer();
+  }
+  return entryPoints_[n].pointer();
+}
+
+SetKeyArgInsn::SetKeyArgInsn(int offset, InsnPtr next)
+: offset_(offset), next_(next)
+{
+}
+
+const Insn *SetKeyArgInsn::execute(VM &vm) const
+{
+  ELObj *val = *--vm.sp;
+  vm.sp[offset_] = val;
+  return next_.pointer();
+}
+
+ClosureObj::ClosureObj(const Signature *sig, InsnPtr code, ELObj **display)
+: FunctionObj(sig), code_(code), display_(display)
+{
+  hasSubObjects_ = 1;
+}
+
+const Insn *ClosureObj::call(VM &vm, const Location &loc, const Insn *next)
+{
+  vm.needStack(1);
+  vm.pushFrame(next, vm.nActualArgs);
+  vm.frame = vm.sp - vm.nActualArgs;
+  vm.closure = display_;
+  vm.protectClosure = this;
+  vm.closureLoc = loc;
+  return code_.pointer();
+}
+
+const Insn *ClosureObj::tailCall(VM &vm, const Location &loc, int nCallerArgs)
+{
+  vm.needStack(1);
+  int nArgs = vm.nActualArgs;
+  if (nCallerArgs) {
+    ELObj **oldFrame = vm.sp - nArgs;
+    ELObj **newFrame = oldFrame - nCallerArgs;
+    for (int i = 0; i < nArgs; i++)
+      newFrame[i] = oldFrame[i];
+    vm.frame = newFrame;
+    vm.sp = newFrame + nArgs;
+  }
+  else
+    vm.frame = vm.sp - nArgs;
+  vm.closure = display_;
+  vm.protectClosure = this;
+  vm.closureLoc = loc;
+  return code_.pointer();
+}
+
+void ClosureObj::setArgToCC(VM &vm)
+{
+  vm.setClosureArgToCC();
+}
+
+void ClosureObj::traceSubObjects(Collector &c) const
+{
+  if (display_) {
+    for (ELObj **p = display_; *p; p++)
+      c.trace(*p);
+  }
+}
+
+const Signature ContinuationObj::signature_ = { 1, 0, 0 };
+
+ContinuationObj::ContinuationObj()
+: FunctionObj(&signature_), controlStackSize_(0)
+{
+}
+
+const Insn *ContinuationObj::call(VM &vm, const Location &loc, const Insn *)
+{
+  if (!live() || readOnly()) {
+    vm.interp->setNextLocation(loc);
+    vm.interp->message(InterpreterMessages::continuationDead);
+    vm.sp = 0;
+    return 0;
+  }
+  ELObj *result = vm.sp[-1];
+  ASSERT(vm.sp - vm.sbase >= stackSize_);
+  ASSERT(vm.csp - vm.csbase >= controlStackSize_);
+  ASSERT(vm.csbase[controlStackSize_ - 1].continuation == this);
+  while (vm.csp - vm.csbase > controlStackSize_) {
+    vm.csp--;
+    if (vm.csp->continuation)
+      vm.csp->continuation->kill();
+  }
+  vm.sp = vm.sbase + stackSize_;
+  --vm.sp;
+  const Insn *next = vm.popFrame();
+  *vm.sp++ = result;
+  return next;
+}
+const Insn *ContinuationObj::tailCall(VM &vm, const Location &loc, int nCallerArgs)
+{
+  return call(vm, loc, 0);
+}
+
+ReturnInsn::ReturnInsn(int totalArgs)
+: totalArgs_(totalArgs)
+{
+}
+
+bool ReturnInsn::isReturn(int &nArgs) const
+{
+  nArgs = totalArgs_;
+  return true;
+}
+
+const Insn *ReturnInsn::execute(VM &vm) const
+{
+  ELObj *result = *--vm.sp;
+  vm.sp -= totalArgs_;
+  const Insn *next = vm.popFrame();
+  *vm.sp++ = result;
+  return next;
+}
+
+FrameRefInsn::FrameRefInsn(int index, InsnPtr next)
+: index_(index), next_(next)
+{
+}
+
+const Insn *FrameRefInsn::execute(VM &vm) const
+{
+  vm.needStack(1);
+  *vm.sp++ = vm.frame[index_];
+  return next_.pointer();
+}
+
+StackRefInsn::StackRefInsn(int index, int frameIndex, InsnPtr next)
+: index_(index), frameIndex_(frameIndex), next_(next)
+{
+}
+
+const Insn *StackRefInsn::execute(VM &vm) const
+{
+  vm.needStack(1);
+  ASSERT(vm.sp - vm.frame == frameIndex_ - index_);
+  *vm.sp = vm.sp[index_];
+  vm.sp += 1;
+  return next_.pointer();
+}
+
+ClosureRefInsn::ClosureRefInsn(int index, InsnPtr next)
+: index_(index), next_(next)
+{
+}
+
+const Insn *ClosureRefInsn::execute(VM &vm) const
+{
+  vm.needStack(1);
+  *vm.sp++ = vm.closure[index_];
+  return next_.pointer();
+}
+
+TopRefInsn::TopRefInsn(const Identifier *var, InsnPtr next)
+: var_(var), next_(next)
+{
+}
+
+const Insn *TopRefInsn::execute(VM &vm) const
+{
+  ELObj *tem = var_->computeValue(1, *vm.interp);
+  if (vm.interp->isError(tem)) {
+    vm.sp = 0;
+    return 0;
+  }
+  else {
+    vm.needStack(1);
+    *vm.sp++ = tem;
+    return next_.pointer();
+  }
+}
+
+ClosureSetBoxInsn::ClosureSetBoxInsn(int index, const Location &loc, InsnPtr next)
+: index_(index), loc_(loc), next_(next)
+{
+}
+
+const Insn *ClosureSetBoxInsn::execute(VM &vm) const
+{
+  BoxObj *box = vm.closure[index_]->asBox();
+  ASSERT(box != 0);
+  if (box->readOnly()) {
+    vm.interp->setNextLocation(loc_);
+    vm.interp->message(InterpreterMessages::readOnly);
+    vm.sp = 0;
+    return 0;
+  }
+  ELObj *tem = box->value;
+  box->value = vm.sp[-1];
+  vm.sp[-1] = tem;
+  return next_.pointer();
+}
+
+StackSetBoxInsn::StackSetBoxInsn(int index, int frameIndex, const Location &loc,
+                                InsnPtr next)
+: index_(index), frameIndex_(frameIndex), loc_(loc), next_(next)
+{
+}
+
+const Insn *StackSetBoxInsn::execute(VM &vm) const
+{
+  ASSERT(vm.sp - vm.frame == frameIndex_ - index_);
+  BoxObj *box = vm.sp[index_]->asBox();
+  ASSERT(box != 0);
+  if (box->readOnly()) {
+    vm.interp->setNextLocation(loc_);
+    vm.interp->message(InterpreterMessages::readOnly);
+    vm.sp = 0;
+    return 0;
+  }
+  ELObj *tem = box->value;
+  box->value = vm.sp[-1];
+  vm.sp[-1] = tem;
+  return next_.pointer();
+}
+
+StackSetInsn::StackSetInsn(int index, int frameIndex, InsnPtr next)
+: index_(index), frameIndex_(frameIndex), next_(next)
+{
+}
+
+const Insn *StackSetInsn::execute(VM &vm) const
+{
+  ASSERT(vm.sp - vm.frame == frameIndex_ - index_);
+  ELObj *tem = vm.sp[index_];
+  vm.sp[index_] = vm.sp[-1];
+  vm.sp[-1] = tem;
+  return next_.pointer();
+}
+
+InsnPtr PopBindingsInsn::make(int n, InsnPtr next)
+{
+  if (!next.isNull()) {
+    int i;
+    if (next->isReturn(i))
+      return new ReturnInsn(n + i);
+    if (next->isPopBindings(i, next))
+      return new PopBindingsInsn(n + i, next);
+  }
+  return new PopBindingsInsn(n, next);
+}
+
+PopBindingsInsn::PopBindingsInsn(int n, InsnPtr next)
+: n_(n), next_(next)
+{
+}
+
+const Insn *PopBindingsInsn::execute(VM &vm) const
+{
+  vm.sp -= n_;
+  vm.sp[-1] = vm.sp[n_ - 1];
+  return next_.pointer();
+}
+
+bool PopBindingsInsn::isPopBindings(int &n, InsnPtr &next) const
+{
+  n = n_;
+  next = next_;
+  return true;
+}
+
+SetBoxInsn::SetBoxInsn(int n, InsnPtr next)
+: n_(n), next_(next)
+{
+}
+
+const Insn *SetBoxInsn::execute(VM &vm) const
+{
+  --vm.sp;
+  BoxObj *box = vm.sp[-n_]->asBox();
+  ASSERT(box != 0);
+  box->value = *vm.sp;
+  return next_.pointer();
+}
+
+SetImmediateInsn::SetImmediateInsn(int n, InsnPtr next)
+: n_(n), next_(next)
+{
+}
+
+const Insn *SetImmediateInsn::execute(VM &vm) const
+{
+  --vm.sp;
+  vm.sp[-n_] = *vm.sp;
+  return next_.pointer();
+}
+
+CheckInitInsn::CheckInitInsn(const Identifier *ident, const Location &loc, InsnPtr next)
+: ident_(ident), loc_(loc), next_(next)
+{
+}
+
+const Insn *CheckInitInsn::execute(VM &vm) const
+{
+  if (vm.sp[-1] == 0) {
+    vm.interp->setNextLocation(loc_);
+    vm.interp->message(InterpreterMessages::uninitializedVariableReference,
+                       StringMessageArg(ident_->name()));
+    vm.sp = 0;
+    return 0;
+  }
+  return next_.pointer();
+}
+
+UnboxInsn::UnboxInsn(InsnPtr next)
+: next_(next)
+{
+}
+
+const Insn *UnboxInsn::execute(VM &vm) const
+{
+  BoxObj *box = vm.sp[-1]->asBox();
+  ASSERT(box != 0);
+  vm.sp[-1] = box->value;
+  return next_.pointer();
+}
+
+BoxInsn::BoxInsn(InsnPtr next)
+: next_(next)
+{
+}
+
+const Insn *BoxInsn::execute(VM &vm) const
+{
+  vm.sp[-1] = new (*vm.interp) BoxObj(vm.sp[-1]);
+  return next_.pointer();
+}
+
+BoxArgInsn::BoxArgInsn(int n, InsnPtr next)
+: n_(n), next_(next)
+{
+}
+
+const Insn *BoxArgInsn::execute(VM &vm) const
+{
+  ELObj *&arg = vm.sp[n_ - vm.nActualArgs];
+  arg = new (*vm.interp) BoxObj(arg);
+  return next_.pointer();
+}
+
+BoxStackInsn::BoxStackInsn(int n, InsnPtr next)
+: n_(n), next_(next)
+{
+}
+
+const Insn *BoxStackInsn::execute(VM &vm) const
+{
+  vm.sp[n_] = new (*vm.interp) BoxObj(vm.sp[n_]);
+  return next_.pointer();
+}
+
+VectorInsn::VectorInsn(size_t n, InsnPtr next)
+: n_(n), next_(next)
+{
+}
+
+const Insn *VectorInsn::execute(VM &vm) const
+{
+  if (n_ == 0) {
+    vm.needStack(1);
+    *vm.sp++ = new (*vm.interp) VectorObj;
+  }
+  else {
+    Vector<ELObj *> v(n_);
+    ELObj **p = vm.sp;
+    for (size_t n = n_; n > 0; n--)
+      v[n - 1] = *--p;
+    *p = new (*vm.interp) VectorObj(v);
+    vm.sp = p + 1;
+  }
+  return next_.pointer();
+}
+
+ListToVectorInsn::ListToVectorInsn(InsnPtr next)
+: next_(next)
+{
+}
+
+const Insn *ListToVectorInsn::execute(VM &vm) const
+{
+  Vector<ELObj *> v;
+  ELObj *obj = vm.sp[-1];
+  while (!obj->isNil()) {
+    PairObj *pair = obj->asPair();
+    ASSERT(pair != 0);
+    v.push_back(pair->car());
+    obj = pair->cdr();
+  }
+  vm.sp[-1] = new (*vm.interp) VectorObj(v);
+  return next_.pointer();
+}
+
+const Insn *CheckSosofoInsn::execute(VM &vm) const
+{
+  if (!vm.sp[-1]->asSosofo()) {
+    vm.sp = 0;
+    vm.interp->setNextLocation(loc_);
+    vm.interp->message(InterpreterMessages::sosofoContext);
+    return 0;
+  }
+  return next_.pointer();
+}
+
+const Insn *CheckStyleInsn::execute(VM &vm) const
+{
+  if (!vm.sp[-1]->asStyle()) {
+    vm.sp = 0;
+    vm.interp->setNextLocation(loc_);
+    vm.interp->message(InterpreterMessages::styleContext);
+    return 0;
+  }
+  return next_.pointer();
+}
+
+const Insn *PushModeInsn::execute(VM &vm) const
+{
+  vm.modeStack.push_back(vm.processingMode);
+  vm.processingMode = mode_;
+  return next_.pointer();
+}
+
+const Insn *PopModeInsn::execute(VM &vm) const
+{
+  vm.processingMode = vm.modeStack.back();
+  vm.modeStack.resize(vm.modeStack.size() - 1);
+  return next_.pointer();
+}
+
+MaybeOverrideStyleInsn::MaybeOverrideStyleInsn(InsnPtr next)
+: next_(next)
+{
+}
+
+const Insn *MaybeOverrideStyleInsn::execute(VM &vm) const
+{
+  if (vm.overridingStyle)
+    vm.sp[-1] = new (*vm.interp) OverriddenStyleObj((BasicStyleObj *)vm.sp[-1],
+                                                   vm.overridingStyle);
+  return next_.pointer();
+}
+
+VarStyleInsn::VarStyleInsn(const ConstPtr<StyleSpec> &styleSpec, unsigned displayLength,
+                          bool hasUse, InsnPtr next)
+: styleSpec_(styleSpec), displayLength_(displayLength), hasUse_(hasUse), next_(next)
+{
+}
+
+const Insn *VarStyleInsn::execute(VM &vm) const
+{
+  ELObj **display
+    = displayLength_ ? new ELObj *[displayLength_ + 1] : 0;
+  ELObj **tem = vm.sp - displayLength_;
+  for (int i = 0; i < displayLength_; i++)
+    display[i] = tem[i];
+  if (displayLength_ == 0) {
+    vm.needStack(1);
+    tem = vm.sp;
+  }
+  else
+    display[displayLength_] = 0;
+  // Make sure objects in display are still visible on the stack
+  // to the garbage collector.
+  StyleObj *use;
+  if (hasUse_)
+    use = (StyleObj *)*--tem;
+  else
+    use = 0;
+  *tem++ = new (*vm.interp) VarStyleObj(styleSpec_, use, display, vm.currentNode);
+  vm.sp = tem;
+  vm.interp->makeReadOnly(tem[-1]);
+  return next_.pointer();
+}
+
+SetStyleInsn::SetStyleInsn(InsnPtr next)
+: next_(next)
+{
+}
+
+const Insn *SetStyleInsn::execute(VM &vm) const
+{
+  ((FlowObj *)vm.sp[-2])->setStyle((StyleObj *)vm.sp[-1]);
+  vm.sp--;
+  return next_.pointer();
+}
+
+SosofoAppendInsn::SosofoAppendInsn(size_t n, InsnPtr next)
+: n_(n), next_(next)
+{
+}
+
+const Insn *SosofoAppendInsn::execute(VM &vm) const
+{
+  AppendSosofoObj *obj = new (*vm.interp) AppendSosofoObj;
+  ELObj **tem = vm.sp - n_;
+  for (size_t i = 0; i < n_; i++) {
+    ASSERT(tem[i]->asSosofo() != 0);
+    obj->append((SosofoObj *)tem[i]);
+  }
+  vm.sp -= n_ - 1;
+  vm.sp[-1] = obj;
+  return next_.pointer();
+}
+
+CopyFlowObjInsn::CopyFlowObjInsn(FlowObj *flowObj, InsnPtr next)
+: flowObj_(flowObj), next_(next)
+{
+}
+
+const Insn *CopyFlowObjInsn::execute(VM &vm) const
+{
+  vm.needStack(1);
+  *vm.sp++ = flowObj_->copy(*vm.interp);
+  return next_.pointer();
+}
+
+SetNonInheritedCsSosofoInsn
+::SetNonInheritedCsSosofoInsn(InsnPtr code, int displayLength, InsnPtr next)
+: code_(code), displayLength_(displayLength), next_(next)
+{
+}
+
+const Insn *SetNonInheritedCsSosofoInsn::execute(VM &vm) const
+{
+  ELObj **display
+    = displayLength_ ? new ELObj *[displayLength_ + 1] : 0;
+  ELObj **tem = vm.sp - displayLength_;
+  for (int i = 0; i < displayLength_; i++) {
+    display[i] = tem[i];
+    ASSERT(display[i] != 0);
+  }
+  if (displayLength_)
+    display[displayLength_] = 0;
+  // Make sure objects in display are still visible on the stack
+  // to the garbage collector.
+  FlowObj *flowObj = (FlowObj *)*--tem;
+  ASSERT((*tem)->asSosofo() != 0);
+  *tem++ = new (*vm.interp) SetNonInheritedCsSosofoObj(flowObj, code_, display, vm.currentNode);
+  vm.sp = tem;
+  return next_.pointer();
+}
+
+
+SetPseudoNonInheritedCInsn::SetPseudoNonInheritedCInsn(const Identifier *nic, const Location &loc,
+                                          InsnPtr next)
+: nic_(nic), loc_(loc), next_(next)
+{
+}
+
+const Insn *SetPseudoNonInheritedCInsn::execute(VM &vm) const
+{
+  ASSERT(vm.sp[-2]->asSosofo() != 0);
+  ((FlowObj *)vm.sp[-2])->setNonInheritedC(nic_, vm.sp[-1], loc_, *vm.interp);
+  vm.sp--;
+  return next_.pointer();
+}
+
+SetNonInheritedCInsn::SetNonInheritedCInsn(const Identifier *nic, const Location &loc,
+                                          InsnPtr next)
+: SetPseudoNonInheritedCInsn(nic, loc, next)
+{
+}
+
+const Insn *SetNonInheritedCInsn::execute(VM &vm) const
+{
+  vm.actualDependencies->resize(0);
+  return SetPseudoNonInheritedCInsn::execute(vm);
+}
+
+SetContentInsn::SetContentInsn(const CompoundFlowObj *flowObj, InsnPtr next)
+: flowObj_(flowObj), next_(next)
+{
+}
+
+SetImplicitCharInsn::SetImplicitCharInsn(const Location &loc, InsnPtr next)
+: loc_(loc), next_(next)
+{
+}
+
+const Insn *SetImplicitCharInsn::execute(VM &vm) const
+{
+  ASSERT(vm.sp[-1]->asSosofo() != 0);
+
+  if (vm.currentNode) {
+    ELObjPropertyValue value(*vm.interp, 0);
+    AccessResult ret = vm.currentNode->property(ComponentName::idChar, *vm.interp, value);
+    if (ret == accessOK) 
+      ((FlowObj *)vm.sp[-1])->setImplicitChar(value.obj, loc_, *vm.interp);
+  }
+  return next_.pointer();
+}
+
+const Insn *SetContentInsn::execute(VM &vm) const
+{
+  CompoundFlowObj *copy = (CompoundFlowObj *)flowObj_->copy(*vm.interp);
+  copy->setContent((SosofoObj *)vm.sp[-1]);
+  vm.sp[-1] = copy;
+  return next_.pointer();
+}
+
+SetDefaultContentInsn::SetDefaultContentInsn(const CompoundFlowObj *flowObj, const Location &loc, InsnPtr next)
+: flowObj_(flowObj), next_(next), loc_(loc)
+{
+}
+
+const Insn *SetDefaultContentInsn::execute(VM &vm) const
+{
+  if (!vm.processingMode) {
+    vm.interp->setNextLocation(loc_);
+    vm.interp->message(InterpreterMessages::noCurrentProcessingMode);
+    vm.sp = 0;
+    return 0;
+  }
+  vm.needStack(1);
+  *vm.sp++ = flowObj_->copy(*vm.interp);
+  ((CompoundFlowObj *)vm.sp[-1])
+    ->setContent(new (*vm.interp) ProcessChildrenSosofoObj(vm.processingMode));
+  return next_.pointer();
+}
+
+MakeDefaultContentInsn::MakeDefaultContentInsn(const Location &loc, InsnPtr next)
+: next_(next), loc_(loc)
+{
+}
+
+const Insn *MakeDefaultContentInsn::execute(VM &vm) const
+{
+  if (!vm.processingMode) {
+    vm.interp->setNextLocation(loc_);
+    vm.interp->message(InterpreterMessages::noCurrentProcessingMode);
+    vm.sp = 0;
+    return 0;
+  }
+  vm.needStack(1);
+  *vm.sp++ = new (*vm.interp) ProcessChildrenSosofoObj(vm.processingMode);
+  return next_.pointer();
+}
+
+LabelSosofoInsn::LabelSosofoInsn(const Location &loc, InsnPtr next)
+: loc_(loc), next_(next)
+{
+}
+
+const Insn *LabelSosofoInsn::execute(VM &vm) const
+{
+  SymbolObj *sym = vm.sp[-1]->asSymbol();
+  if (!sym) {
+    vm.interp->setNextLocation(loc_);
+    vm.interp->message(InterpreterMessages::labelNotASymbol);
+    vm.sp = 0;
+    return 0;
+  }
+  ASSERT(vm.sp[-2]->asSosofo() != 0);
+  vm.sp[-2] = new (*vm.interp) LabelSosofoObj(sym, loc_, (SosofoObj *)vm.sp[-2]);
+  vm.sp--;
+  return next_.pointer();
+}
+
+ContentMapSosofoInsn::ContentMapSosofoInsn(const Location &loc, InsnPtr next)
+: loc_(loc), next_(next)
+{
+}
+
+const Insn *ContentMapSosofoInsn::execute(VM &vm) const
+{
+  ASSERT(vm.sp[-2]->asSosofo() != 0);
+  vm.sp[-2] = new (*vm.interp) ContentMapSosofoObj(vm.sp[-1], &loc_, (SosofoObj *)vm.sp[-2]);
+  vm.sp--;
+  return next_.pointer();
+}
+
+BoxObj::BoxObj()
+: value(0)
+{
+  hasSubObjects_ = 1;
+}
+
+BoxObj::BoxObj(ELObj *obj)
+: value(obj)
+{
+  hasSubObjects_ = 1;
+}
+
+BoxObj *BoxObj::asBox()
+{
+  return this;
+}
+
+void BoxObj::traceSubObjects(Collector &c) const
+{
+  c.trace(value);
+}
+
+CallWithCurrentContinuationPrimitiveObj::CallWithCurrentContinuationPrimitiveObj()
+: FunctionObj(&signature_)
+{
+}
+
+const Insn *CallWithCurrentContinuationPrimitiveObj::call(VM &vm, const Location &loc,
+                                                         const Insn *next)
+{
+  FunctionObj *f = vm.sp[-1]->asFunction();
+  if (!f) {
+    vm.interp->setNextLocation(loc);
+    vm.interp->message(InterpreterMessages::notAProcedure,
+                      StringMessageArg(Interpreter::makeStringC("call-with-current-continuation")),
+                      OrdinalMessageArg(1),
+                      ELObjMessageArg(vm.sp[-1], *vm.interp));
+    vm.sp = 0;
+    return 0;
+  }
+  ELObjDynamicRoot protect(*vm.interp, f);
+  vm.sp[-1] = new (*vm.interp) ContinuationObj;
+  const Insn *insn = f->call(vm, loc, next);
+  f->setArgToCC(vm);
+  return insn;
+}
+
+
+const Insn *CallWithCurrentContinuationPrimitiveObj::tailCall(VM &vm, const Location &loc,
+                                                             int nCallerArgs)
+{
+  FunctionObj *f = vm.sp[-1]->asFunction();
+  if (!f) {
+    vm.interp->setNextLocation(loc);
+    vm.interp->message(InterpreterMessages::notAProcedure,
+                      StringMessageArg(Interpreter::makeStringC("call-with-current-continuation")),
+                      OrdinalMessageArg(1),
+                      ELObjMessageArg(vm.sp[-1], *vm.interp));
+    vm.sp = 0;
+    return 0;
+  }
+  ELObjDynamicRoot protect(*vm.interp, f);
+  vm.sp[-1] = new (*vm.interp) ContinuationObj;
+  const Insn *insn = f->tailCall(vm, loc, nCallerArgs);
+  f->setArgToCC(vm);
+  return insn;
+}
+
+const Signature CallWithCurrentContinuationPrimitiveObj::signature_ = { 1, 0, 0 };
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
diff --git a/style/Insn.h b/style/Insn.h
new file mode 100644 (file)
index 0000000..4380b38
--- /dev/null
@@ -0,0 +1,565 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef Insn_INCLUDED
+#define Insn_INCLUDED 1
+
+#include "ELObj.h"
+#include "Resource.h"
+#include "Ptr.h"
+#include "Location.h"
+#include "Message.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class VM;
+class EvalContext;
+class Interpreter;
+
+class Insn : public Resource {
+public:
+  virtual ~Insn();
+  virtual const Insn *execute(VM &) const = 0;
+  virtual bool isReturn(int &nArgs) const;
+  virtual bool isPopBindings(int &n, ConstPtr<Insn> &) const;
+};
+
+typedef ConstPtr<Insn> InsnPtr;
+
+class ErrorInsn : public Insn {
+public:
+  const Insn *execute(VM &) const;
+};
+
+class CondFailInsn : public ErrorInsn {
+public:
+  CondFailInsn(const Location &loc);
+  const Insn *execute(VM &) const;
+private:
+  Location loc_;
+};
+
+class CaseFailInsn : public ErrorInsn {
+public:
+  CaseFailInsn(const Location &loc);
+  const Insn *execute(VM &) const;
+private:
+  Location loc_;
+};
+
+class ConstantInsn : public Insn {
+public:
+  ConstantInsn(ELObj *, InsnPtr);
+  const Insn *execute(VM &) const;
+private:
+  ELObj *value_;
+  InsnPtr next_;
+};
+
+class ResolveQuantitiesInsn : public Insn {
+public:
+  ResolveQuantitiesInsn(const Location &, InsnPtr);
+  const Insn *execute(VM &) const;
+private:
+  Location loc_;
+  InsnPtr next_;
+};
+
+class TestInsn : public Insn {
+public:
+  TestInsn(InsnPtr, InsnPtr);
+  const Insn *execute(VM &) const;
+private:
+  InsnPtr consequent_;
+  InsnPtr alternative_;
+};
+
+class OrInsn : public Insn {
+public:
+  OrInsn(InsnPtr nextTest, InsnPtr next);
+  const Insn *execute(VM &) const;
+private:
+  InsnPtr nextTest_;
+  InsnPtr next_;
+};
+
+class AndInsn : public Insn {
+public:
+  AndInsn(InsnPtr nextTest, InsnPtr next);
+  const Insn *execute(VM &) const;
+private:
+  InsnPtr nextTest_;
+  InsnPtr next_;
+};
+
+class CaseInsn : public Insn {
+public:
+  CaseInsn(ELObj *, InsnPtr match, InsnPtr fail);
+  const Insn *execute(VM &) const;
+private:
+  ELObj *obj_;
+  InsnPtr match_;
+  InsnPtr fail_;
+};
+
+class PopInsn : public Insn {
+public:
+  PopInsn(InsnPtr next);
+  const Insn *execute(VM &) const;
+private:
+  InsnPtr next_;
+};
+
+class ConsInsn : public Insn {
+public:
+  ConsInsn(InsnPtr next);
+  const Insn *execute(VM &) const;
+private:
+  InsnPtr next_;
+};
+
+class AppendInsn : public Insn {
+public:
+  AppendInsn(const Location &, InsnPtr next);
+  const Insn *execute(VM &) const;
+private:
+  Location loc_;
+  InsnPtr next_;
+};
+
+class ApplyBaseInsn : public Insn {
+public:
+  ApplyBaseInsn(int nArgs, const Location &);
+protected:
+  FunctionObj *decodeArgs(VM &) const;
+  Location loc_;
+  int nArgs_;
+};
+
+class ApplyInsn : public ApplyBaseInsn {
+public:
+  ApplyInsn(int nArgs, const Location &, InsnPtr);
+  const Insn *execute(VM &) const;
+private:
+  InsnPtr next_;
+};
+
+class TailApplyInsn : public ApplyBaseInsn {
+public:
+  TailApplyInsn(int nCallerArgs, int nArgs, const Location &);
+  const Insn *execute(VM &) const;
+private:
+  int nCallerArgs_;
+};
+
+class FrameRefInsn : public Insn {
+public:
+  FrameRefInsn(int index, InsnPtr next);
+  const Insn *execute(VM &vm) const;
+private:
+  int index_;
+  InsnPtr next_;
+};
+
+class StackRefInsn : public Insn {
+public:
+  StackRefInsn(int index, int frameIndex, InsnPtr next);
+  const Insn *execute(VM &vm) const;
+private:
+  int index_;                  // always negative
+  int frameIndex_;
+  InsnPtr next_;
+};
+
+class ClosureRefInsn : public Insn {
+public:
+  ClosureRefInsn(int index, InsnPtr next);
+  const Insn *execute(VM &vm) const;
+private:
+  int index_;
+  InsnPtr next_;
+};
+
+class StackSetBoxInsn : public Insn {
+public:
+  StackSetBoxInsn(int index, int frameIndex, const Location &loc, InsnPtr next);
+  const Insn *execute(VM &vm) const;
+private:
+  int index_;                  // always negative
+  int frameIndex_;
+  Location loc_;
+  InsnPtr next_;
+};
+
+class StackSetInsn : public Insn {
+public:
+  StackSetInsn(int index, int frameIndex, InsnPtr next);
+  const Insn *execute(VM &vm) const;
+private:
+  int index_;                  // always negative
+  int frameIndex_;
+  InsnPtr next_;
+};
+
+class ClosureSetBoxInsn : public Insn {
+public:
+  ClosureSetBoxInsn(int index, const Location &loc, InsnPtr next);
+  const Insn *execute(VM &vm) const;
+private:
+  int index_;
+  Location loc_;
+  InsnPtr next_;
+};
+
+class TopRefInsn : public Insn {
+public:
+  TopRefInsn(const Identifier *var, InsnPtr next);
+  const Insn *execute(VM &vm) const;
+private:
+  const Identifier *var_;
+  InsnPtr next_;
+  Location loc_;
+};
+
+class PopBindingsInsn : public Insn {
+public:
+  const Insn *execute(VM &vm) const;
+  bool isPopBindings(int &n, InsnPtr &) const;
+  static InsnPtr make(int n, InsnPtr next);
+private:
+  PopBindingsInsn(int n, InsnPtr next);
+  int n_;
+  InsnPtr next_;
+};
+
+class PrimitiveObj;
+
+class PrimitiveCallInsn : public Insn {
+public:
+  PrimitiveCallInsn(int nArgs, PrimitiveObj *, const Location &, InsnPtr);
+  const Insn *execute(VM &) const;
+private:
+  int nArgs_;
+  PrimitiveObj *prim_;
+  Location loc_;
+  InsnPtr next_;
+};
+
+struct Signature {
+  int nRequiredArgs;
+  int nOptionalArgs;
+  bool restArg;
+  int nKeyArgs;
+  const Identifier *const *keys;
+};
+
+// This Insn constructs a ClosureObj.
+
+class ClosureInsn : public Insn {
+public:
+  ClosureInsn(const Signature *, InsnPtr code, int displayLength, InsnPtr next);
+  const Insn *execute(VM &) const;
+private:
+  const Signature *sig_;
+  InsnPtr code_;
+  int displayLength_;
+  InsnPtr next_;
+};
+
+class ClosureObj;
+
+class FunctionCallInsn : public Insn {
+public:
+  FunctionCallInsn(int nArgs, FunctionObj *, const Location &, InsnPtr);
+  const Insn *execute(VM &) const;
+private:
+  int nArgs_;
+  FunctionObj *function_;              // must be permanent
+  Location loc_;
+  InsnPtr next_;
+};
+
+class FunctionTailCallInsn : public Insn {
+public:
+  FunctionTailCallInsn(int nArgs, FunctionObj *, const Location &,
+                      int nCallerArgs);
+  const Insn *execute(VM &) const;
+private:
+  int nArgs_;
+  FunctionObj *function_;              // must be permanent
+  Location loc_;
+  int nCallerArgs_;
+};
+
+class VarargsInsn : public Insn {
+public:
+  VarargsInsn(const Signature &, Vector<InsnPtr> &entryPoints,
+             const Location &);
+  const Insn *execute(VM &) const;
+private:
+  const Signature *sig_;
+  Vector<InsnPtr> entryPoints_;
+  Location loc_;
+};
+
+class SetKeyArgInsn : public Insn {
+public:
+  SetKeyArgInsn(int offset, InsnPtr);
+  const Insn *execute(VM &) const;
+private:
+  int offset_;
+  InsnPtr next_;
+};
+
+class TestNullInsn : public Insn {
+public:
+  TestNullInsn(int offset, InsnPtr ifNull, InsnPtr ifNotNull);
+  const Insn *execute(VM &) const;
+private:
+  int offset_;
+  InsnPtr ifNull_;
+  InsnPtr ifNotNull_;
+  InsnPtr next_;
+};
+
+class ReturnInsn : public Insn {
+public:
+  ReturnInsn(int totalArgs);
+  const Insn *execute(VM &) const;
+  bool isReturn(int &nArgs) const;
+private:
+  int totalArgs_;
+};
+
+class FunctionObj : public ELObj {
+public:
+  FunctionObj(const Signature *sig) : sig_(sig) { }
+  int totalArgs();
+  int nRequiredArgs();
+  int nOptionalArgs();
+  int nKeyArgs();
+  bool restArg();
+  virtual const Insn *call(VM &vm, const Location &, const Insn *next) = 0;
+  virtual const Insn *tailCall(VM &vm, const Location &, int nCallerArgs) = 0;
+  virtual InsnPtr makeCallInsn(int nArgs, Interpreter &, const Location &,
+                              InsnPtr next);
+  virtual InsnPtr makeTailCallInsn(int nArgs, Interpreter &,
+                                  const Location &, int nCallerArgs);
+  const Signature &signature() const { return *sig_; }
+  FunctionObj *asFunction();
+  virtual void setArgToCC(VM &);
+private:
+  const Signature *sig_;
+};
+
+class PrimitiveObj : public FunctionObj {
+public:
+  PrimitiveObj(const Signature *sig) : FunctionObj(sig) { }
+  const Insn *call(VM &vm, const Location &, const Insn *next);
+  const Insn *tailCall(VM &vm, const Location &, int nCallerArgs);
+  InsnPtr makeCallInsn(int nArgs, Interpreter &, const Location &, InsnPtr next);
+  virtual ELObj *primitiveCall(int nArgs, ELObj **args, EvalContext &, Interpreter &,
+                              const Location &) = 0;
+  void setIdentifier(const Identifier *ident);
+protected:
+  ELObj *argError(Interpreter &, const Location &,
+                 const MessageType3 &, unsigned, ELObj *) const;
+  ELObj *noCurrentNodeError(Interpreter &, const Location &) const;
+private:
+  const Identifier *ident_;
+};
+
+class ApplyPrimitiveObj : public FunctionObj {
+public:
+  ApplyPrimitiveObj();
+  const Insn *call(VM &vm, const Location &, const Insn *next);
+  const Insn *tailCall(VM &vm, const Location &, int nCallerArgs);
+private:
+  bool shuffle(VM &vm, const Location &loc);
+  static const Signature signature_;
+};
+
+class CallWithCurrentContinuationPrimitiveObj : public FunctionObj {
+public:
+  CallWithCurrentContinuationPrimitiveObj();
+  const Insn *call(VM &vm, const Location &, const Insn *next);
+  const Insn *tailCall(VM &vm, const Location &, int nCallerArgs);
+private:
+  static const Signature signature_;
+};
+
+class ClosureObj : public FunctionObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  ClosureObj(const Signature *, InsnPtr, ELObj **display);
+  ~ClosureObj() { delete [] display_; }
+  ELObj **display();
+  const Insn *call(VM &, const Location &, const Insn *);
+  const Insn *tailCall(VM &, const Location &, int nCallerArgs);
+  void traceSubObjects(Collector &) const;
+  ELObj *display(int) const;
+  void setArgToCC(VM &);
+private:
+  InsnPtr code_;
+  // terminated by null pointer.
+  // null if empty.
+  ELObj **display_;
+};
+
+class ContinuationObj : public FunctionObj {
+public:
+  ContinuationObj();
+  const Insn *call(VM &, const Location &, const Insn *);
+  const Insn *tailCall(VM &, const Location &, int nCallerArgs);
+  void set(size_t stackSize, size_t controlStackSize) {
+    stackSize_ = stackSize;
+    controlStackSize_ = controlStackSize;
+  }
+  void kill() { controlStackSize_ = 0; }
+  bool live() const { return controlStackSize_ > 0; }
+private:
+  size_t stackSize_;
+  size_t controlStackSize_;
+  static const Signature signature_;
+};
+
+class BoxObj : public ELObj {
+public:
+  BoxObj();
+  BoxObj(ELObj *);
+  BoxObj *asBox();
+  void traceSubObjects(Collector &) const;
+  ELObj *value;
+};
+
+class SetBoxInsn : public Insn {
+public:
+  SetBoxInsn(int n, InsnPtr next);
+  const Insn *execute(VM &vm) const;
+private:
+  int n_;
+  InsnPtr next_;
+};
+
+class SetImmediateInsn : public Insn {
+public:
+  SetImmediateInsn(int n, InsnPtr next);
+  const Insn *execute(VM &vm) const;
+private:
+  int n_;
+  InsnPtr next_;
+};
+
+class UnboxInsn : public Insn {
+public:
+  UnboxInsn(InsnPtr next);
+  const Insn *execute(VM &vm) const;
+private:
+  InsnPtr next_;
+};
+
+class CheckInitInsn : public Insn {
+public:
+  CheckInitInsn(const Identifier *ident, const Location &, InsnPtr next);
+  const Insn *execute(VM &vm) const;
+private:
+  const Identifier *ident_;
+  Location loc_;
+  InsnPtr next_;
+};
+
+class BoxInsn : public Insn {
+public:
+  BoxInsn(InsnPtr next);
+  const Insn *execute(VM &vm) const;
+private:
+  InsnPtr next_;
+};
+
+class BoxArgInsn : public Insn {
+public:
+  BoxArgInsn(int n, InsnPtr next);
+  const Insn *execute(VM &vm) const;
+private:
+  int n_;
+  InsnPtr next_;
+};
+
+class BoxStackInsn : public Insn {
+public:
+  BoxStackInsn(int n, InsnPtr next);
+  const Insn *execute(VM &vm) const;
+private:
+  int n_;
+  InsnPtr next_;
+};
+
+class VectorInsn : public Insn {
+public:
+  VectorInsn(size_t n, InsnPtr next);
+  const Insn *execute(VM &vm) const;
+private:
+  size_t n_;
+  InsnPtr next_;
+};
+
+class ListToVectorInsn : public Insn {
+public:
+  ListToVectorInsn(InsnPtr next);
+  const Insn *execute(VM &vm) const;
+private:
+  InsnPtr next_;
+};
+
+inline
+int FunctionObj::nRequiredArgs()
+{
+  return signature().nRequiredArgs;
+}
+
+inline
+int FunctionObj::nOptionalArgs()
+{
+  return signature().nOptionalArgs;
+}
+
+inline
+bool FunctionObj::restArg()
+{
+  return signature().restArg;
+}
+
+inline
+int FunctionObj::nKeyArgs()
+{
+  return signature().nKeyArgs;
+}
+
+inline
+int FunctionObj::totalArgs()
+{
+  const Signature &sig = signature();
+  return sig.nRequiredArgs + sig.nOptionalArgs + sig.nKeyArgs + sig.restArg;
+}
+
+inline
+void PrimitiveObj::setIdentifier(const Identifier *ident)
+{
+  ident_ = ident;
+}
+
+inline
+ELObj *ClosureObj::display(int i) const
+{
+  return display_[i];
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not Insn_INCLUDED */
diff --git a/style/Insn2.h b/style/Insn2.h
new file mode 100644 (file)
index 0000000..92f877c
--- /dev/null
@@ -0,0 +1,213 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef Insn2_INCLUDED
+#define Insn2_INCLUDED 1
+
+#include "Insn.h"
+#include "SosofoObj.h"
+#include "Style.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class CheckSosofoInsn : public Insn {
+public:
+  CheckSosofoInsn(const Location &loc, InsnPtr next) : loc_(loc), next_(next) { }
+  const Insn *execute(VM &vm) const;
+private:
+  Location loc_;
+  InsnPtr next_;
+};
+
+class CheckStyleInsn : public Insn {
+public:
+  CheckStyleInsn(const Location &loc, InsnPtr next) : loc_(loc), next_(next) { }
+  const Insn *execute(VM &vm) const;
+private:
+  Location loc_;
+  InsnPtr next_;
+};
+
+class ProcessingMode;
+
+class PushModeInsn : public Insn {
+public:
+  PushModeInsn(const ProcessingMode *mode, InsnPtr next)
+    : mode_(mode), next_(next) { }
+  const Insn *execute(VM &) const;
+private:
+  const ProcessingMode *mode_;
+  InsnPtr next_;
+};
+
+class PopModeInsn : public Insn {
+public:
+  PopModeInsn(InsnPtr next) : next_(next) { }
+  const Insn *execute(VM &) const;
+private:
+  InsnPtr next_;
+};
+
+// This creates a SetNonInheritedCsSosofo
+// displayLength_ vars are on the top of the stack.
+// flowObj is next.
+
+class SetNonInheritedCsSosofoInsn : public Insn {
+public:
+  SetNonInheritedCsSosofoInsn(InsnPtr code, int displayLength, InsnPtr next);
+  const Insn *execute(VM &) const;
+private:
+  InsnPtr code_;
+  int displayLength_;
+  InsnPtr next_;
+};
+
+class CopyFlowObjInsn : public Insn {
+public:
+  CopyFlowObjInsn(FlowObj *, InsnPtr);
+  const Insn *execute(VM &) const;
+private:
+  FlowObj *flowObj_;
+  InsnPtr next_;
+};
+
+// Value for characteristic is on top of the stack
+// Flow object is next down.
+
+class SetPseudoNonInheritedCInsn : public Insn {
+public:
+  SetPseudoNonInheritedCInsn(const Identifier *, const Location &, InsnPtr);
+  const Insn *execute(VM &) const;
+private:
+  Location loc_;
+  const Identifier *nic_;
+  InsnPtr next_;
+};
+
+class SetNonInheritedCInsn : public SetPseudoNonInheritedCInsn {
+public:
+  SetNonInheritedCInsn(const Identifier *, const Location &, InsnPtr);
+  const Insn *execute(VM &) const;
+};
+
+class SetImplicitCharInsn : public Insn {
+public:
+  SetImplicitCharInsn(const Location &, InsnPtr);
+  const Insn *execute(VM &) const;
+private:
+  Location loc_;
+  InsnPtr next_;
+};
+
+// sosofo with content is on top of the stack
+// flow object is next
+
+class SetContentInsn : public Insn {
+public:
+  SetContentInsn(const CompoundFlowObj *, InsnPtr next);
+  const Insn *execute(VM &vm) const;
+private:
+  InsnPtr next_;
+  const CompoundFlowObj *flowObj_;
+};
+
+class SetDefaultContentInsn : public Insn {
+public:
+  SetDefaultContentInsn(const CompoundFlowObj *, const Location &loc, InsnPtr next);
+  const Insn *execute(VM &vm) const;
+private:
+  Location loc_;
+  InsnPtr next_;
+  const CompoundFlowObj *flowObj_;
+};
+
+class MakeDefaultContentInsn : public Insn {
+public:
+  MakeDefaultContentInsn(const Location &loc, InsnPtr next);
+  const Insn *execute(VM &vm) const;
+private:
+  Location loc_;
+  InsnPtr next_;
+};
+
+class SosofoAppendInsn : public Insn {
+public:
+  SosofoAppendInsn(size_t, InsnPtr);
+  const Insn *execute(VM &vm) const;
+private:
+  size_t n_;
+  InsnPtr next_;
+};
+
+// This creates a VarStyleObj.
+// displayLength vars are on the top, then the use StyleObj is there is one.
+
+class VarStyleInsn : public Insn {
+public:
+  VarStyleInsn(const ConstPtr<StyleSpec> &, unsigned, bool, InsnPtr);
+  const Insn *execute(VM &vm) const;
+private:
+  unsigned displayLength_;
+  bool hasUse_;
+  ConstPtr<StyleSpec> styleSpec_;
+  InsnPtr next_;
+};
+
+// BasicStyleObj is on top of stack.
+// If there is a current overriding style,
+// replace it by an OverridenStyleObj.
+
+class MaybeOverrideStyleInsn : public Insn {
+public:
+  MaybeOverrideStyleInsn(InsnPtr next);
+  const Insn *execute(VM &vm) const;
+private:
+  InsnPtr next_;
+};
+
+// StyleObj is on top
+// FlowObj is next down
+// calls set style on the flowobj
+
+class SetStyleInsn : public Insn {
+public:
+  SetStyleInsn(InsnPtr next);
+  const Insn *execute(VM &vm) const;
+private:
+  InsnPtr next_;
+};
+
+class Expression;
+
+// label is on the top
+// content is next down
+
+class LabelSosofoInsn : public Insn {
+public:
+  LabelSosofoInsn(const Location &, InsnPtr next);
+  const Insn *execute(VM &) const;
+private:
+  Location loc_;
+  InsnPtr next_;
+};
+
+// Constructs a ContentMapSosofo
+// content-map is on top
+// content is next down
+
+class ContentMapSosofoInsn : public Insn {
+public:
+  ContentMapSosofoInsn(const Location &loc, InsnPtr next);
+  const Insn *execute(VM &) const;
+private:
+  Location loc_;
+  InsnPtr next_;
+};
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not Insn2_INCLUDED */
diff --git a/style/Interpreter.cxx b/style/Interpreter.cxx
new file mode 100644 (file)
index 0000000..971b342
--- /dev/null
@@ -0,0 +1,2384 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#include "stylelib.h"
+#include "Interpreter.h"
+#include "Insn.h"
+#include "InterpreterMessages.h"
+#include "LocNode.h"
+#include "Pattern.h"
+#include "MacroFlowObj.h"
+#include "ELObjMessageArg.h"
+#include "VM.h"
+#include "Owner.h" 
+#include "SchemeParser.h"
+#include "macros.h"
+#include "InternalInputSource.h"
+#include <stdlib.h>
+#include "LangObj.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+const Char defaultChar = 0xfffd;
+
+static
+size_t maxObjSize()
+{
+  static size_t sz[] = {
+    sizeof(UnresolvedQuantityObj),
+    sizeof(VarStyleObj),
+    sizeof(OverriddenStyleObj),
+    sizeof(MergeStyleObj),
+    sizeof(DeviceRGBColorObj),
+    sizeof(ColorSpaceObj),
+    sizeof(PairObj),
+    sizeof(QuantityObj),
+    sizeof(GlyphIdObj),
+    sizeof(NamedNodeListPtrNodeListObj),
+    sizeof(ProcessNodeSosofoObj),
+    sizeof(AppendSosofoObj),
+    sizeof(SetNonInheritedCsSosofoObj),
+    sizeof(LabelSosofoObj),
+    sizeof(MacroFlowObj),
+    sizeof(FlowObj) + sizeof(StringC), // for FormattingInstructionFlowObj
+    sizeof(LangObj),
+#ifdef SP_HAVE_LOCALE
+#ifdef SP_HAVE_WCHAR
+    sizeof(RefLangObj),
+#endif
+#endif
+  };
+  size_t n = sz[0];
+  for (size_t i = 1; i < SIZEOF(sz); i++)
+    if (sz[i] > n)
+      n = sz[i];
+  return n;
+}
+
+Interpreter::Interpreter(GroveManager *groveManager,
+                        Messenger *messenger,
+                        int unitsPerInch,
+                        bool debugMode,
+                        bool dsssl2,
+                         bool strictMode,
+                        const FOTBuilder::Extension *extensionTable)
+: groveManager_(groveManager),
+  messenger_(messenger),
+  extensionTable_(extensionTable),
+  Collector(maxObjSize()),
+  partIndex_(0),  // 0 is for command-line definitions
+  dPartIndex_(1),
+  lexCategory_(lexOther),
+  unitsPerInch_(unitsPerInch),
+  nInheritedC_(0),
+  initialProcessingMode_(StringC()),
+  currentPartFirstInitialValue_(0),
+  initialStyle_(0),
+  nextGlyphSubstTableUniqueId_(0),
+  debugMode_(debugMode),
+  dsssl2_(dsssl2),
+  strictMode_(strictMode)
+{
+  makePermanent(theNilObj_ = new (*this) NilObj);
+  makePermanent(theFalseObj_ = new (*this) FalseObj);
+  makePermanent(theTrueObj_ = new (*this) TrueObj);
+  makePermanent(theErrorObj_ = new (*this) ErrorObj);
+  makePermanent(theUnspecifiedObj_ = new (*this) UnspecifiedObj);
+  makePermanent(addressNoneObj_
+                = new (*this) AddressObj(FOTBuilder::Address::none));
+  makePermanent(emptyNodeListObj_
+               = new (*this) NodePtrNodeListObj);
+  defaultLanguage_ = theFalseObj_;
+  installSyntacticKeys();
+  installCValueSymbols();
+  installPortNames();
+  installPrimitives();
+  installUnits();
+  if (!strictMode_) {
+    installCharNames();
+    installSdata();
+  }
+  installFlowObjs();
+  installInheritedCs();
+  installNodeProperties();
+
+  static const char *lexCategories[] = {
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
+    "!$%&*/<=>?~_^:",
+    "",
+    "0123456789",
+    "-+.",
+    "",
+    "();\"",
+    " \t\r\n\f",
+    "",
+  };
+  lexCategory_.setEe(lexDelimiter);
+  for (size_t i = 0; i < SIZEOF(lexCategories); i++)
+    for (const char *s = lexCategories[i]; *s; s++)
+      lexCategory_.setChar(*s, i);
+
+  // #',@[\\]`{|} are ASCII chars not mentioned above,
+  // but I guess we don't want to allow any of these
+  // in names (as most of them have special meaning in
+  // scheme/dsssl).
+  if (!strictMode_)
+    for (Char i = 127; i < charMax; i++)
+      lexCategory_.setChar(i, lexAddNameStart);
+
+  initialProcessingMode_.setDefined();
+  // can't be done before initializing lexCategory_
+  installBuiltins();
+  installCharProperties();
+}
+
+void Interpreter::compile()
+{
+  // FIXME compile all definitions
+  compileInitialValues();
+  initialProcessingMode_.compile(*this);
+  NamedTableIter<ProcessingMode> iter(processingModeTable_);
+  for (;;) {
+    ProcessingMode *mode = iter.next();
+    if (!mode)
+      break;
+    mode->compile(*this);
+  }
+  compileCharProperties();
+  compileDefaultLanguage();
+}
+
+void Interpreter::compileInitialValues()
+{
+  Vector<ConstPtr<InheritedC> > ics;
+  for (size_t i = 0; i < initialValueNames_.size(); i++) {
+    const Identifier *ident = initialValueNames_[i];
+    Owner<Expression> &expr = initialValueValues_[i];
+    ConstPtr<InheritedC> ic(ident->inheritedC());
+    expr->optimize(*this, Environment(), expr);
+    ELObj *val = expr->constantValue();
+    if (val) {
+      ConstPtr<InheritedC> tem(ic->make(val, expr->location(), *this));
+      if (!tem.isNull())
+       ics.push_back(tem);
+    }
+    else
+      ics.push_back(new VarInheritedC(ic,
+                                     expr->compile(*this, Environment(), 0, InsnPtr()),
+                                     expr->location()));
+  }
+  if (ics.size()) {
+    Vector<ConstPtr<InheritedC> > forceIcs;
+    initialStyle_ = new (*this) VarStyleObj(new StyleSpec(forceIcs, ics), 0, 0, NodePtr());
+    makePermanent(initialStyle_);
+  }
+}
+
+void Interpreter::installInitialValue(Identifier *ident, Owner<Expression> &expr)
+{
+  for (size_t i = 0; i < initialValueNames_.size(); i++) {
+    if (ident == initialValueNames_[i]) {
+      if (i >= currentPartFirstInitialValue_) {
+       setNextLocation(expr->location());
+       message(InterpreterMessages::duplicateInitialValue,
+               StringMessageArg(ident->name()),
+               initialValueValues_[i]->location());
+      }
+      return;
+    }
+  }
+  initialValueValues_.resize(initialValueValues_.size() + 1);
+  expr.swap(initialValueValues_.back());
+  initialValueNames_.push_back(ident);
+}
+
+void Interpreter::installUnits()
+{
+  static struct {
+    const char *name;
+    int numer;
+    int denom;
+    bool dsssl2;
+  } units[] = {
+    { "m", 5000, 127 },
+    { "cm", 50, 127 },
+    { "mm", 5, 127 },
+    { "in", 1, 1 },
+    { "pt", 1, 72 },
+    { "pica", 1, 6 },
+    { "pc", 1, 6 } // a DSSSL2 addition
+  };
+  size_t nUnits = dsssl2() ? SIZEOF(units) : SIZEOF(units) - 1;
+  for (size_t i = 0; i < nUnits; i++) {
+    Unit *unit = lookupUnit(makeStringC(units[i].name));
+    long n = unitsPerInch_ * units[i].numer;
+    if (n % units[i].denom == 0)
+      unit->setValue(long(n / units[i].denom));
+    else
+      unit->setValue(double(n)/units[i].denom);
+  }
+}
+
+void Interpreter::installSyntacticKeys()
+{
+  static struct {
+    const char *name;
+    Identifier::SyntacticKey key;
+  } keys[] = {
+    { "quote", Identifier::keyQuote },
+    { "lambda", Identifier::keyLambda },
+    { "if", Identifier::keyIf },
+    { "cond", Identifier::keyCond },
+    { "and", Identifier::keyAnd },
+    { "or", Identifier::keyOr },
+    { "case", Identifier::keyCase },
+    { "let", Identifier::keyLet },
+    { "let*", Identifier::keyLetStar },
+    { "letrec", Identifier::keyLetrec },
+    { "quasiquote", Identifier::keyQuasiquote },
+    { "unquote", Identifier::keyUnquote },
+    { "unquote-splicing", Identifier::keyUnquoteSplicing },
+    { "define", Identifier::keyDefine },
+    { "else", Identifier::keyElse },
+    { "=>", Identifier::keyArrow },
+    { "there-exists?", Identifier::keyThereExists },
+    { "for-all?", Identifier::keyForAll },
+    { "select-each", Identifier::keySelectEach },
+    { "union-for-each", Identifier::keyUnionForEach },
+    { "make", Identifier::keyMake },
+    { "style", Identifier::keyStyle },
+    { "with-mode", Identifier::keyWithMode },
+    { "define-unit", Identifier::keyDefineUnit },
+    { "query", Identifier::keyQuery },
+    { "element", Identifier::keyElement },
+    { "default", Identifier::keyDefault },
+    { "root", Identifier::keyRoot },
+    { "id", Identifier::keyId },
+    { "mode", Identifier::keyMode },
+    { "declare-initial-value", Identifier::keyDeclareInitialValue },
+    { "declare-characteristic", Identifier::keyDeclareCharacteristic },
+    { "declare-flow-object-class", Identifier::keyDeclareFlowObjectClass },
+    { "declare-char-characteristic+property", Identifier::keyDeclareCharCharacteristicAndProperty },
+    { "declare-reference-value-type", Identifier::keyDeclareReferenceValueType },
+    { "declare-default-language", Identifier::keyDeclareDefaultLanguage },
+    { "declare-char-property", Identifier::keyDeclareCharProperty },
+    { "define-page-model", Identifier::keyDefinePageModel },
+    { "define-column-set-model", Identifier::keyDefineColumnSetModel },
+    { "define-language", Identifier::keyDefineLanguage },
+    { "add-char-properties", Identifier::keyAddCharProperties },
+    { "use", Identifier::keyUse },
+    { "label", Identifier::keyLabel },
+    { "content-map", Identifier::keyContentMap },
+    { "keep-with-previous?", Identifier::keyIsKeepWithPrevious },
+    { "keep-with-next?", Identifier::keyIsKeepWithNext },
+    { "space-before", Identifier::keySpaceBefore },
+    { "space-after", Identifier::keySpaceAfter },
+    { "left-header", Identifier::keyLeftHeader },
+    { "center-header", Identifier::keyCenterHeader },
+    { "right-header", Identifier::keyRightHeader },
+    { "left-footer", Identifier::keyLeftFooter },
+    { "center-footer", Identifier::keyCenterFooter },
+    { "right-footer", Identifier::keyRightFooter },
+    { "destination", Identifier::keyDestination },
+    { "type", Identifier::keyType },
+    { "coalesce-id", Identifier::keyCoalesceId },
+    { "display?", Identifier::keyIsDisplay },
+    { "scale", Identifier::keyScale },
+    { "max-width", Identifier::keyMaxWidth },
+    { "max-height", Identifier::keyMaxHeight },
+    { "entity-system-id", Identifier::keyEntitySystemId },
+    { "notation-system-id", Identifier::keyNotationSystemId },
+    { "position-point-x", Identifier::keyPositionPointX },
+    { "position-point-y", Identifier::keyPositionPointY },
+    { "escapement-direction", Identifier::keyEscapementDirection },
+    { "break-before-priority", Identifier::keyBreakBeforePriority },
+    { "break-after-priority", Identifier::keyBreakAfterPriority },
+    { "orientation", Identifier::keyOrientation },
+    { "length", Identifier::keyLength },
+    { "char", Identifier::keyChar },
+    { "glyph-id", Identifier::keyGlyphId },
+    { "space?", Identifier::keyIsSpace },
+    { "record-end?", Identifier::keyIsRecordEnd },
+    { "input-tab?", Identifier::keyIsInputTab },
+    { "input-whitespace?", Identifier::keyIsInputWhitespace },
+    { "punct?", Identifier::keyIsPunct },
+    { "drop-after-line-break?", Identifier::keyIsDropAfterLineBreak },
+    { "drop-unless-before-line-break?", Identifier::keyIsDropUnlessBeforeLineBreak },
+    { "math-class", Identifier::keyMathClass },
+    { "math-font-posture", Identifier::keyMathFontPosture },
+    { "script", Identifier::keyScript },
+    { "stretch-factor", Identifier::keyStretchFactor },
+    { "keep", Identifier::keyKeep },
+    { "break-before", Identifier::keyBreakBefore },
+    { "break-after", Identifier::keyBreakAfter },
+    { "may-violate-keep-before?", Identifier::keyIsMayViolateKeepBefore },
+    { "may-violate-keep-after?", Identifier::keyIsMayViolateKeepAfter },
+    { "before-row-border", Identifier::keyBeforeRowBorder },
+    { "after-row-border", Identifier::keyAfterRowBorder },
+    { "before-column-border", Identifier::keyBeforeColumnBorder },
+    { "after-column-border", Identifier::keyAfterColumnBorder },
+    { "column-number", Identifier::keyColumnNumber },
+    { "row-number", Identifier::keyRowNumber },
+    { "n-columns-spanned", Identifier::keyNColumnsSpanned },
+    { "n-rows-spanned", Identifier::keyNRowsSpanned },
+    { "width", Identifier::keyWidth },
+    { "starts-row?", Identifier::keyIsStartsRow },
+    { "ends-row?", Identifier::keyIsEndsRow },
+    { "table-width", Identifier::keyTableWidth },
+    { "multi-modes", Identifier::keyMultiModes },
+    { "data", Identifier::keyData },
+    { "min", Identifier::keyMin },
+    { "max", Identifier::keyMax },
+    { "conditional?", Identifier::keyIsConditional },
+    { "priority", Identifier::keyPriority },
+    { "grid-n-rows", Identifier::keyGridNRows },
+    { "grid-n-columns", Identifier::keyGridNColumns },
+    { "radical", Identifier::keyRadical },
+    { "null", Identifier::keyNull },
+    { "rcs?", Identifier::keyIsRcs },
+    { "parent", Identifier::keyParent },
+    { "active", Identifier::keyActive },
+    { "attributes", Identifier::keyAttributes },
+    { "children", Identifier::keyChildren },
+    { "repeat", Identifier::keyRepeat },
+    { "position", Identifier::keyPosition },
+    { "only", Identifier::keyOnly },
+    { "class", Identifier::keyClass },
+    { "importance", Identifier::keyImportance },
+    { "position-preference", Identifier::keyPositionPreference },
+    { "collate", Identifier::keyCollate },
+    { "toupper", Identifier::keyToupper },
+    { "tolower", Identifier::keyTolower },
+    { "symbol", Identifier::keySymbol },
+    { "order", Identifier::keyOrder },
+    { "forward", Identifier::keyForward },
+    { "backward", Identifier::keyBackward },
+    { "white-point", Identifier::keyWhitePoint },
+    { "black-point", Identifier::keyBlackPoint },
+    { "range", Identifier::keyRange },
+    { "range-abc", Identifier::keyRangeAbc },
+    { "range-lmn", Identifier::keyRangeLmn },
+    { "range-a", Identifier::keyRangeA },
+    { "decode-abc", Identifier::keyDecodeAbc },
+    { "decode-lmn", Identifier::keyDecodeLmn },
+    { "decode-a", Identifier::keyDecodeA },
+    { "matrix-abc", Identifier::keyMatrixAbc },
+    { "matrix-lmn", Identifier::keyMatrixLmn },
+    { "matrix-a", Identifier::keyMatrixA },
+    { "architecture", Identifier::keyArchitecture },
+  }, keys2[] = {
+    { "declare-class-attribute", Identifier::keyDeclareClassAttribute },
+    { "declare-id-attribute", Identifier::keyDeclareIdAttribute },
+    { "declare-flow-object-macro", Identifier::keyDeclareFlowObjectMacro },
+    { "or-element", Identifier::keyOrElement },
+    { "set!", Identifier::keySet },
+    { "begin", Identifier::keyBegin },
+  };
+  for (size_t i = 0; i < SIZEOF(keys); i++) {
+    StringC tem(makeStringC(keys[i].name));
+    lookup(tem)->setSyntacticKey(keys[i].key);
+    if (dsssl2() && tem[tem.size() - 1] == '?') {
+      tem.resize(tem.size() - 1);
+      lookup(tem)->setSyntacticKey(keys[i].key);
+    }
+  }
+  if (dsssl2()) {
+    for (size_t i = 0; i < SIZEOF(keys2); i++)
+      lookup(makeStringC(keys2[i].name))->setSyntacticKey(keys2[i].key);
+  }
+}
+
+void Interpreter::installCValueSymbols()
+{
+  cValueSymbols_[0] = makeFalse();
+  cValueSymbols_[1] = makeTrue();
+  for (size_t i = 2; i < FOTBuilder::nSymbols; i++) {
+    SymbolObj *sym = makeSymbol(makeStringC(FOTBuilder::symbolName(FOTBuilder::Symbol(i))));
+    sym->setCValue(FOTBuilder::Symbol(i));
+    cValueSymbols_[i] = sym;
+  }
+}
+
+void Interpreter::installPortNames()
+{
+  // These must match the order in SymbolObj.
+  static const char *names[] = {
+    "numerator",
+    "denominator",
+    "pre-sup",
+    "pre-sub",
+    "post-sup",
+    "post-sub",
+    "mid-sup",
+    "mid-sub",
+    "over-mark",
+    "under-mark",
+    "open",
+    "close",
+    "degree",
+    "operator",
+    "lower-limit",
+    "upper-limit",
+    "header",
+    "footer"
+  };
+  ASSERT(SIZEOF(names) == nPortNames);
+  for (size_t i = 0; i < SIZEOF(names); i++)
+    portNames_[i] = makeSymbol(makeStringC(names[i]));
+}
+
+void Interpreter::installCharNames()
+{
+  static struct {
+    Char c;
+    const char *name;
+  } chars[] = {
+#include "charNames.h"
+  };
+  for (size_t i = 0; i < SIZEOF(chars); i++) {
+    CharPart ch;
+    ch.c = chars[i].c;
+    ch.defPart = unsigned(-1);
+    namedCharTable_.insert(makeStringC(chars[i].name), ch, 1);
+  }
+}
+
+void Interpreter::installSdata()
+{
+  // This comes from uni2sgml.txt on ftp://unicode.org.
+  // It is marked there as obsolete, so it probably ought to be checked.
+  // The definitions of apos and quot have been fixed for consistency with XML.
+  static struct {
+    Char c;
+    const char *name;
+  } entities[] = {
+#include "sdata.h"
+  };
+  for (size_t i = 0; i < SIZEOF(entities); i++) { 
+    CharPart ch;
+    ch.c = entities[i].c;
+    ch.defPart = unsigned(-1);
+    sdataEntityNameTable_.insert(makeStringC(entities[i].name), ch, 1);
+  }
+}
+
+void Interpreter::installNodeProperties()
+{
+  for (int i = 0; i < ComponentName::nIds; i++) {
+    ComponentName::Id id = ComponentName::Id(i);
+    nodePropertyTable_.insert(makeStringC(ComponentName::rcsName(id)), i);
+    nodePropertyTable_.insert(makeStringC(ComponentName::sdqlName(id)), i);
+  }
+}
+
+void Interpreter::setCharRepertoire(const StringC &pubid)
+{
+  if (pubid == "UNREGISTERED::OpenJade//Character Repertoire::OpenJade") {
+    if (strictMode_) {
+      installCharNames();
+      installSdata();
+      // This assumes that we process char-repertoire
+      // declaration before any declarations which change
+      // lexical categories.
+      for (Char i = 127; i < charMax; i++)
+        lexCategory_.setChar(i, lexAddNameStart);
+      strictMode_ = 0;
+    }
+   } else 
+     message(InterpreterMessages::unsupportedCharRepertoire,
+                StringMessageArg(pubid));
+}
+void Interpreter::addStandardChar(const StringC &name, const StringC &num)
+{
+  int n;
+  size_t i = 0;
+  if (!scanSignDigits(num, i, n)) {
+    message(InterpreterMessages::invalidCharNumber, StringMessageArg(num));
+    return;
+  }
+  
+  const CharPart *def = namedCharTable_.lookup(name);
+  CharPart ch;
+  ch.c = n;
+  ch.defPart = dPartIndex_;
+  if (def) {
+    if (dPartIndex_ < def->defPart)
+      namedCharTable_.insert(name, ch, 1);
+    else if (def->defPart == dPartIndex_ && def->c != ch.c) 
+      message(InterpreterMessages::duplicateCharName, 
+             StringMessageArg(name));
+  }
+  else 
+    namedCharTable_.insert(name, ch, 1);
+}
+
+void Interpreter::addNameChar(const StringC &name)
+{
+  const CharPart *cp = namedCharTable_.lookup(name);
+  if (!cp) 
+    message(InterpreterMessages::badCharName, 
+            StringMessageArg(name));
+  else if (lexCategory_[cp->c] != lexOther)
+    // FIXME give a more specific error
+    message(InterpreterMessages::badDeclaration);
+  else
+    lexCategory_.setChar(cp->c, lexAddNameStart);
+}
+
+void Interpreter::addSeparatorChar(const StringC &name)
+{
+  const CharPart *cp = namedCharTable_.lookup(name);
+  if (!cp)
+    message(InterpreterMessages::badCharName, 
+            StringMessageArg(name));
+  else if (lexCategory_[cp->c] != lexOther)
+    // FIXME give a more specific error
+    message(InterpreterMessages::badDeclaration);
+  else
+    lexCategory_.setChar(cp->c, lexAddWhiteSpace);
+}
+
+void Interpreter::addSdataEntity(const StringC &ename, const StringC &etext, const StringC &name)
+{
+  const CharPart *cp = namedCharTable_.lookup(name);
+  if (!cp) { 
+    message(InterpreterMessages::badCharName, 
+            StringMessageArg(name));
+    return; 
+  }
+
+  CharPart ch;
+  ch.c = cp->c;
+  ch.defPart = dPartIndex_;
+
+  if (ename.size() > 0) {
+    const CharPart *def = sdataEntityNameTable_.lookup(ename);
+    if (def) {
+      if (dPartIndex_ < def->defPart)
+       sdataEntityNameTable_.insert(ename, ch);
+      else if (def->defPart == dPartIndex_ && def->c != cp->c) 
+               message(InterpreterMessages::duplicateSdataEntityName, 
+               StringMessageArg(ename));
+    }
+    else
+      sdataEntityNameTable_.insert(ename, ch);
+  }
+
+  if (etext.size() > 0) {
+    const CharPart *def = sdataEntityTextTable_.lookup(etext);
+    if (def) {
+      if (dPartIndex_ < def->defPart)
+       sdataEntityTextTable_.insert(etext, ch);
+      else if (def->defPart == dPartIndex_ && def->c != cp->c) 
+               message(InterpreterMessages::duplicateSdataEntityText, 
+               StringMessageArg(etext));
+    }
+    else
+      sdataEntityTextTable_.insert(etext, ch);
+  }
+}
+
+bool Interpreter::sdataMap(GroveString name, GroveString text, GroveChar &c) const
+{
+  StringC tem(name.data(), name.size());
+  StringC tem2(text.data(), text.size());
+
+  const CharPart *cp = sdataEntityNameTable_.lookup(tem);
+  if (cp) {
+    c = cp->c;
+    return 1;
+  }
+  
+  cp = sdataEntityTextTable_.lookup(tem2);
+  if (cp) {
+    c = cp->c;
+    return 1;
+  }
+  
+  if (convertUnicodeCharName(tem, c))
+    return 1;
+  // I think this is the best thing to do.
+  // At least it makes preserve-sdata work with unknown SDATA entities.
+  c = defaultChar;
+  return 1;
+}
+
+ELObj *Interpreter::convertGlyphId(const Char *str, size_t len, const Location &loc)
+{
+  unsigned long n = 0;
+  const char *publicId = 0;
+  for (size_t i = len; i > 1; --i) {
+    if (str[i - 1] == ':' && str[i - 2] == ':' && i < len && str[i] != '0') {
+      for (size_t j = i; j < len; j++)
+       n = n*10 + (str[j] - '0');
+      publicId = storePublicId(str, i - 2, loc);
+      break;
+    }
+    if (str[i - 1] < '0' || str[i - 1] > '9')
+      break;
+  }
+  if (!publicId)
+    publicId = storePublicId(str, len, loc);
+  return new (*this) GlyphIdObj(FOTBuilder::GlyphId(publicId, n));
+}
+
+bool Interpreter::convertCharName(const StringC &str, Char &c) const
+{
+  const CharPart *cp = namedCharTable_.lookup(str);
+  if (cp) {
+    c = cp->c;
+    return 1;
+  }
+  return convertUnicodeCharName(str, c);
+}
+
+bool Interpreter::convertUnicodeCharName(const StringC &str, Char &c)
+{
+  if (str.size() != 6 || str[0] != 'U' || str[1] != '-')
+    return 0;
+  Char value = 0;
+  for (int i = 2; i < 6; i++) {
+    value <<= 4;
+    switch (str[i]) {
+    case '0':
+    case '1':
+    case '2':
+    case '3':
+    case '4':
+    case '5':
+    case '6':
+    case '7':
+    case '8':
+    case '9':
+      value |= str[i] - '0';
+      break;
+    case 'A':
+    case 'B':
+    case 'C':
+    case 'D':
+    case 'E':
+    case 'F':
+      value |= 10 + (str[i] - 'A');
+      break;
+    default:
+      return 0;
+    }
+  }
+  c = value;
+  return 1;
+}
+
+SymbolObj *Interpreter::makeSymbol(const StringC &str)
+{
+  SymbolObj *sym = symbolTable_.lookup(str);
+  if (!sym) {
+    StringObj *strObj = new (*this) StringObj(str);
+    makePermanent(strObj);
+    sym = new (*this) SymbolObj(strObj);
+    makePermanent(sym);
+    symbolTable_.insert(sym);
+  }
+  return sym;
+}
+
+Identifier *Interpreter::lookup(const StringC &str)
+{
+  Identifier *ident = identTable_.lookup(str);
+  if (!ident) {
+    ident = new Identifier(str);
+    identTable_.insert(ident);
+  }
+  return ident;
+}
+
+bool Interpreter::lookupNodeProperty(const StringC &str, ComponentName::Id &id)
+{
+  const int *val = nodePropertyTable_.lookup(str);
+  if (!val) {
+    StringC tem(str);
+    for (size_t i = 0; i < tem.size(); i++) {
+      if (tem[i] >= 'A' && tem[i] <= 'Z')
+        tem[i] = 'a' + (tem[i] - 'A');
+    }
+    val = nodePropertyTable_.lookup(tem);
+    if (!val)
+      return 0;
+  }
+  id = ComponentName::Id(*val);
+  return 1;
+}
+
+Unit *Interpreter::lookupUnit(const StringC &str)
+{
+  Unit *unit = unitTable_.lookup(str);
+  if (!unit) {
+    unit = new Unit(str);
+    unitTable_.insert(unit);
+  }
+  return unit;
+}
+
+ProcessingMode *Interpreter::lookupProcessingMode(const StringC &str)
+{
+  ProcessingMode *mode = processingModeTable_.lookup(str);
+  if (!mode) {
+    mode = new ProcessingMode(str, &initialProcessingMode_);
+    processingModeTable_.insert(mode);
+  }
+  return mode;
+}
+
+StringC Interpreter::makeStringC(const char *s)
+{
+  StringC tem;
+  if (s)
+    while (*s)
+      tem += (unsigned char)*s++;
+  return tem;
+}
+
+void Interpreter::endPart()
+{
+  currentPartFirstInitialValue_ = initialValueNames_.size();
+  partIndex_++;
+}
+
+void Interpreter::dEndPart()
+{
+  dPartIndex_++;
+}
+
+void Interpreter::normalizeGeneralName(const NodePtr &nd, StringC &str)
+{
+  NamedNodeListPtr nnl;
+  NodePtr root;
+  if (nd->getGroveRoot(root) == accessOK
+      && root->getElements(nnl) == accessOK)
+    str.resize(nnl->normalize(str.begin(), str.size()));
+}
+
+ELObj *Interpreter::makeLengthSpec(const FOTBuilder::LengthSpec &ls)
+{
+  if (ls.displaySizeFactor != 0.0) {
+    LengthSpec result(LengthSpec::displaySize, ls.displaySizeFactor);
+    result += double(ls.length);
+    return new (*this) LengthSpecObj(result);
+  }
+  else
+    return new (*this) LengthObj(ls.length);
+}
+
+bool Interpreter::convertBooleanC(ELObj *obj, const Identifier *ident, const Location &loc,
+                                 bool &result)
+{
+  obj = convertFromString(obj, convertAllowBoolean, loc);
+  if (obj == makeFalse()) {
+    result = 0;
+    return 1;
+  }
+  if (obj == makeTrue()) {
+    result = 1;
+    return 1;
+  }
+  invalidCharacteristicValue(ident, loc);
+  return 0;
+}
+
+bool Interpreter::convertPublicIdC(ELObj *obj, const Identifier *ident,
+                                  const Location &loc,
+                                  FOTBuilder::PublicId &pubid)
+{
+  if (obj == makeFalse()) {
+    pubid = 0;
+    return 1;
+  }
+  const Char *s;
+  size_t n;
+  if (obj->stringData(s, n)) {
+    if (n == 0)
+      pubid = 0;
+    else
+      pubid = storePublicId(s, n, loc);
+    return 1;
+  }
+  invalidCharacteristicValue(ident, loc);
+  return 0;
+}
+
+const char *Interpreter::storePublicId(const Char *s, size_t n, const Location &loc)
+{
+  String<char> buf;
+  for (; n > 0; s++, n--) {
+    if (*s >= 128) {
+      setNextLocation(loc);
+      message(InterpreterMessages::invalidPublicIdChar,
+             StringMessageArg(StringC(s, 1)));
+    }
+    else
+      buf += char(*s);
+  }
+  buf += '\0';
+  return publicIds_.store(buf);
+}
+
+bool Interpreter::convertStringC(ELObj *obj, const Identifier *ident, const Location &loc,
+                                StringC &result)
+{
+  const Char *s;
+  size_t n;
+  if (obj->stringData(s, n)) {
+    result.assign(s, n);
+    return 1;
+  }
+  invalidCharacteristicValue(ident, loc);
+  return 0;
+}
+
+bool Interpreter::convertLengthSpec(ELObj *obj,
+                                   FOTBuilder::LengthSpec &result)
+{
+  int dim;
+  double d;
+  switch (obj->quantityValue(result.length, d, dim)) {
+  case ELObj::longQuantity:
+    if (dim == 1)
+      return 1;
+    break;
+  case ELObj::doubleQuantity:
+    if (dim == 1) {
+      // FIXME catch overflow
+      result.length = d < 0.0 ? long(d - .5) : long(d + .5);
+      return 1;
+    }
+    break;
+  default:
+    {
+      const LengthSpec *ls = obj->lengthSpec();
+      if (ls)
+       return ls->convert(result);
+    }
+    break;
+  }
+  return 0;
+}
+
+bool Interpreter::convertLengthC(ELObj *obj, const Identifier *ident,
+                                const Location &loc,
+                                FOTBuilder::Length &n)
+{
+  obj = convertFromString(obj, convertAllowNumber, loc);
+  int dim;
+  double d;
+  switch (obj->quantityValue(n, d, dim)) {
+  case ELObj::longQuantity:
+    if (dim == 1)
+      return 1;
+    break;
+  case ELObj::doubleQuantity:
+    if (dim == 1) {
+      // FIXME catch overflow
+      n = long(d);
+      return 1;
+    }
+    break;
+  default:
+    break;
+  }
+  invalidCharacteristicValue(ident, loc);
+  return 0;
+}
+
+bool Interpreter::convertLengthSpecC(ELObj *obj, const Identifier *ident,
+                                    const Location &loc,
+                                    FOTBuilder::LengthSpec &result)
+{
+  obj = convertFromString(obj, convertAllowNumber, loc);
+  if (convertLengthSpec(obj, result))
+    return 1;
+  invalidCharacteristicValue(ident, loc);
+  return 0;
+}
+
+bool Interpreter::convertOptLengthSpecC(ELObj *obj, const Identifier *ident,
+                                       const Location &loc,
+                                       FOTBuilder::OptLengthSpec &result)
+{
+  obj = convertFromString(obj, convertAllowBoolean|convertAllowNumber, loc);
+  if (obj == makeFalse()) {
+    result.hasLength = 0;
+    return 1;
+  }
+  if (convertLengthSpecC(obj, ident, loc, result.length)) {
+    result.hasLength = 1;
+    return 1;
+  }
+  return 0;
+}
+
+bool Interpreter::convertOptPositiveIntegerC(ELObj *obj, const Identifier *ident, const Location &loc,
+                                            long &result)
+{
+  obj = convertFromString(obj, convertAllowNumber|convertAllowBoolean, loc);
+  if (obj == makeFalse()) {
+    result = 0;
+    return 1;
+  }
+  if (obj->exactIntegerValue(result) && result > 0)
+    return 1;
+  // FIXME allow inexact value
+  invalidCharacteristicValue(ident, loc);
+  return 0;
+}
+
+bool Interpreter::convertIntegerC(ELObj *obj, const Identifier *ident, const Location &loc,
+                                 long &result)
+{
+  obj = convertFromString(obj, convertAllowNumber, loc);
+  if (obj->exactIntegerValue(result))
+    return 1;
+  // FIXME allow inexact value
+  invalidCharacteristicValue(ident, loc);
+  return 0;
+}
+
+
+bool Interpreter::convertLetter2C(ELObj *obj, const Identifier *ident, const Location &loc,
+                                 FOTBuilder::Letter2 &code)
+{
+  StringObj *strObj = obj->convertToString();
+  if (strObj) {
+    const StringC &str = *strObj;
+    if (str.size() == 2
+       && str[0] >= 'A' && str[0] <= 'Z'
+       && str[1] >= 'A' && str[1] <= 'Z') {
+      code = SP_LETTER2(str[0], str[1]);
+      return 1;
+    }
+    if (str.size() == 0) {
+      code = 0;
+      return 1;
+    }
+  }
+  else if (obj == makeFalse()) {
+    code = 0;
+    return 1;
+  }
+  invalidCharacteristicValue(ident, loc);
+  return 0;
+}
+
+bool Interpreter::convertCharC(ELObj *obj, const Identifier *ident, const Location &loc,
+                              Char &result)
+{
+  if (obj->charValue(result))
+    return 1;
+  const Char *s;
+  size_t n;
+  if (obj->stringData(s, n) && n == 1) {
+    result = s[0];
+    return 1;
+  }
+  invalidCharacteristicValue(ident, loc);
+  return 0;
+}
+
+bool Interpreter::convertColorC(ELObj *obj, const Identifier *ident, const Location &loc, ColorObj *&color)
+{
+  color = obj->asColor();
+  if (color)
+    return 1;
+  invalidCharacteristicValue(ident, loc);
+  return 0;
+}
+
+bool Interpreter::convertOptColorC(ELObj *obj, const Identifier *ident, const Location &loc, ColorObj *&color)
+{
+  color = obj->asColor();
+  if (color)
+    return 1;
+  if (obj == makeFalse())
+    return 1;
+  invalidCharacteristicValue(ident, loc);
+  return 0;
+}
+
+bool Interpreter::convertRealC(ELObj *obj, const Identifier *ident, const Location &loc,
+                              double &result)
+{
+  obj = convertFromString(obj, convertAllowNumber, loc);
+  if (obj->realValue(result))
+    return 1;
+  invalidCharacteristicValue(ident, loc);
+  return 0;
+}
+
+bool Interpreter::convertEnumC(ELObj *obj, const Identifier *ident, const Location &loc,
+                              FOTBuilder::Symbol &sym)
+{
+  obj = convertFromString(obj, convertAllowSymbol|convertAllowBoolean, loc);
+  if (obj == makeFalse()) {
+    sym = FOTBuilder::symbolFalse;
+    return 1;
+  }
+  SymbolObj *symObj = obj->asSymbol();
+  if (symObj) {
+    sym = symObj->cValue();
+    if (sym != FOTBuilder::symbolFalse)
+      return 1;
+  }
+  if (obj == makeTrue()) {
+    sym = FOTBuilder::symbolTrue;
+    return 1;
+  }
+  invalidCharacteristicValue(ident, loc);
+  return 0;
+}
+
+bool Interpreter::convertEnumC(const FOTBuilder::Symbol *syms,  size_t nSyms,
+                              ELObj *obj, const Identifier *ident, const Location &loc,
+                              FOTBuilder::Symbol &result)
+{
+  obj = convertFromString(obj, convertAllowSymbol|convertAllowBoolean, loc);
+  SymbolObj *symObj = obj->asSymbol();
+  FOTBuilder::Symbol val;
+  if (symObj) {
+    val = symObj->cValue();
+    if (val == FOTBuilder::symbolFalse) {
+      invalidCharacteristicValue(ident, loc);
+      return 0;
+    }
+  }
+  else if (obj == makeFalse())
+    val = FOTBuilder::symbolFalse;
+  else if (obj == makeTrue())
+    val = FOTBuilder::symbolTrue;
+  else {
+    invalidCharacteristicValue(ident, loc);
+    return 0;
+  }
+  for (size_t i = 0; i < nSyms; i++)
+    if (val == syms[i]) {
+      result = val;
+      return 1;
+    }
+  invalidCharacteristicValue(ident, loc);
+  return 0;
+}
+
+void Interpreter::invalidCharacteristicValue(const Identifier *ident, const Location &loc)
+{
+  setNextLocation(loc);
+  message(InterpreterMessages::invalidCharacteristicValue,
+         StringMessageArg(ident->name()));
+}
+
+static
+bool equal(const Char *s1, const char *s2, size_t n)
+{
+  while (n > 0) {
+    if (*s1++ != (unsigned char)*s2++)
+      return 0;
+    --n;
+  }
+  return 1;
+}
+
+ELObj *Interpreter::convertFromString(ELObj *obj, unsigned hints, const Location &loc)
+{
+  // FIXME fold to lower case
+  const Char *s;
+  size_t n;
+  if (!dsssl2() || !obj->stringData(s, n))
+    return obj;
+  if (hints & convertAllowNumber) {
+    ELObj *tem = convertNumber(StringC(s, n));
+    if (tem)
+      return tem->resolveQuantities(1, *this, loc);
+  }
+  if (hints & convertAllowSymbol) {
+    StringC tem(s, n);
+    SymbolObj *sym = symbolTable_.lookup(tem);
+    if (sym && sym->cValue() != FOTBuilder::symbolFalse)
+      return sym;
+  }
+  if (hints & convertAllowBoolean) {
+    switch (n) {
+    case 2:
+      if (equal(s, "no", n))
+       return makeFalse();
+      break;
+    case 3:
+      if (equal(s, "yes", n))
+       return makeTrue();
+      break;
+    case 4:
+      if (equal(s, "true", n))
+       return makeTrue();
+      break;
+    case 5:
+      if (equal(s, "false", n))
+       return makeFalse();
+      break;
+    }
+  }
+  return obj;
+}
+
+ELObj *Interpreter::convertNumber(const StringC &str, int radix)
+{
+  {
+    if (str.size() == 0)
+      return 0;
+    size_t i = 0;
+    if (str[0] == '#') {
+      if (str.size() < 2)
+       return 0;
+      switch (str[1]) {
+      case 'd':
+       radix = 10;
+       break;
+      case 'x':
+       radix = 16;
+       break;
+      case 'o':
+       radix = 8;
+       break;
+      case 'b':
+       radix = 2;
+       break;
+      default:
+       return 0;
+      }
+      i += 2;
+    }
+    if (i >= str.size())
+      return 0;
+    bool negative;
+    if (str[i] == '-') {
+      negative = 1;
+      i++;
+    }
+    else {
+      negative = 0;
+      if (str[i] == '+')
+      i++;
+    }
+    bool hadDecimalPoint = 0;
+    bool hadDigit = 0;
+    long n = 0;
+    int exp = 0;
+    for (; i < str.size(); i++) {
+      Char c = str[i];
+      int weight;
+      switch (c) {
+      case '0':
+       weight = 0;
+       break;
+      case '1':
+       weight = 1;
+       break;
+      case '2':
+       weight = 2;
+       break;
+      case '3':
+       weight = 3;
+       break;
+      case '4':
+       weight = 4;
+       break;
+      case '5':
+       weight = 5;
+       break;
+      case '6':
+       weight = 6;
+       break;
+      case '7':
+       weight = 7;
+       break;
+      case '8':
+       weight = 8;
+       break;
+      case '9':
+       weight = 9;
+       break;
+      case 'a':
+       weight = 10;
+       break;
+      case 'b':
+       weight = 11;
+       break;
+      case 'c':
+       weight = 12;
+       break;
+      case 'd':
+       weight = 13;
+       break;
+      case 'e':
+       weight = 14;
+       break;
+      case 'f':
+       weight = 15;
+       break;
+      default:
+       weight = -1;
+       break;
+      }
+      if (weight >= 0 && weight < radix) {
+       hadDigit = 1;
+       if (negative) {
+         if (-(unsigned long)n > (-(unsigned long)LONG_MIN - weight)/radix) {
+           if (radix != 10)
+             return 0;
+           return convertNumberFloat(str);
+         }
+         else
+           n = n*radix - weight;
+       }
+       else {
+         if (n > (LONG_MAX - weight)/radix) {
+           if (radix != 10)
+             return 0;
+           return convertNumberFloat(str);
+         }
+         else
+           n = n*radix + weight;
+       }
+       if (hadDecimalPoint)
+         exp--;
+      }
+      else if (c == '.' && radix == 10) {
+       if (hadDecimalPoint)
+         return 0;
+       hadDecimalPoint = 1;
+      }
+      else
+       break;
+    }
+    if (!hadDigit || (radix != 10 && i < str.size()))
+      return 0;
+    if (i + 1 < str.size() && str[i] == 'e'
+        && lexCategory(str[i + 1]) != lexLetter) {
+      hadDecimalPoint = 1;
+      i++;
+      int e;
+      if (!scanSignDigits(str, i, e))
+       return 0;
+      exp += e;
+    }
+    if (i < str.size()) {
+      int unitExp;
+      Unit *unit = scanUnit(str, i, unitExp);
+      if (!unit)
+       return 0;
+      if (unitExp == 1)
+       return new (*this) UnresolvedLengthObj(n, exp, unit);
+      else
+       return convertNumberFloat(str);
+    }
+    if (hadDecimalPoint)
+      return convertNumberFloat(str);
+    return makeInteger(n);
+  }
+}
+
+bool Interpreter::scanSignDigits(const StringC &str, size_t &i, int &n)
+{
+  bool negative = 0;
+  if (i < str.size()) {
+    if (str[i] == '-') {
+      i++;
+      negative = 1;
+    } else if (str[i] == '+')
+      i++;
+  }
+  size_t j = i;
+  n = 0;
+  while (i < str.size()
+        && ('0' <= str[i] && str[i] <= '9')) {
+    if (negative)
+      n = n*10 - (str[i] - '0');
+    else
+      n = n*10 + (str[i] - '0');
+    i++;
+  }
+  if (i == j)
+    return 0;
+  return 1;
+}
+
+ELObj *Interpreter::convertNumberFloat(const StringC &str)
+{
+  String<char> buf;
+  // omit an optional radix prefix
+  size_t i0 = 0;
+  if (str.size() > 1 && str[0] == '#' && str[1] == 'd')
+    i0 = 2;
+  for (size_t i = i0; i < str.size(); i++) {
+    if (str[i] > CHAR_MAX || str[i] == '\0')
+      return 0;
+    // 'E' is a valid exponent marker for C but not us
+    if (str[i] == 'E')
+      break;
+    buf += char(str[i]);
+  }
+  buf += '\0';
+  const char *endPtr;
+  double val = strtod((char *)buf.data(), (char **)&endPtr);
+  if (endPtr - buf.data() == str.size() - i0)
+    return new (*this) RealObj(val);
+  if (endPtr == buf.data())
+    return 0;
+  int unitExp;
+  Unit *unit = scanUnit(str, endPtr - buf.data() + i0, unitExp);
+  if (!unit)
+    return 0;
+  return new (*this) UnresolvedQuantityObj(val, unit, unitExp);
+}
+
+// Return 0 for error.
+
+Unit *Interpreter::scanUnit(const StringC &str, size_t i, int &unitExp)
+{
+  StringC unitName;
+  while (i < str.size()) {
+    if (str[i] == '-' || str[i] == '+' || ('0' <= str[i] && str[i] <= '9'))
+      break;
+    unitName += str[i++];
+  }
+  if (i >= str.size())
+    unitExp = 1;
+  else {
+    unitExp = 0;
+    bool neg = 0;
+    if (str[i] == '-' || str[i] == '+') {
+      if (str[i] == '-')
+      neg = 1;
+      i++;
+      if (i >= str.size())
+       return 0;
+    }
+    while (i < str.size()) {
+      if (str[i] < '0' || str[i] > '9')
+       return 0;
+      unitExp *= 10;
+      if (neg)
+       unitExp -= (str[i] - '0');
+      else
+       unitExp += (str[i] - '0');
+      i++;
+    }
+  }
+  return lookupUnit(unitName);
+}
+
+void Interpreter::setNodeLocation(const NodePtr &nd)
+{
+  const LocNode *lnp;
+  Location nodeLoc;
+  if ((lnp = LocNode::convert(nd)) != 0
+      && lnp->getLocation(nodeLoc) == accessOK)
+    setNextLocation(nodeLoc);
+}
+
+bool Interpreter::convertToPattern(ELObj *obj, const Location &loc, Pattern &pattern)
+{
+  IList<Pattern::Element> list;
+  if (!convertToPattern(obj, loc, 0, list))
+    return 0;
+  Pattern tem(list);
+  tem.swap(pattern);
+  return 1;
+}
+
+bool Interpreter::convertToPattern(ELObj *obj, const Location &loc,
+                                  bool isChild,
+                                  IList<Pattern::Element> &list)
+{
+  StringObj *str = obj->convertToString();
+  if (str) {
+    const Char *s;
+    size_t n;
+    str->stringData(s, n);
+    if (!n) {
+      setNextLocation(loc);
+      message(InterpreterMessages::patternEmptyGi);
+      return 0;
+    }
+    list.insert(new Pattern::Element(StringC(s, n)));
+    return 1;
+  }
+  if (obj == makeTrue()) {
+    list.insert(new Pattern::Element(StringC()));
+    return 1;
+  }
+  Pattern::Element *curElement = 0;
+  while (!obj->isNil()) {
+    PairObj *pair = obj->asPair();
+    if (!pair) {
+      setNextLocation(loc);
+      message(InterpreterMessages::patternNotList);
+      return 0;
+    }
+    ELObj *head = pair->car();
+    obj = pair->cdr();
+    if (head == makeTrue() && dsssl2()) {
+      list.insert(curElement = new Pattern::Element(StringC()));
+      continue;
+    }
+    str = head->convertToString();
+    if (str) {
+      const Char *s;
+      size_t n;
+      str->stringData(s, n);
+      if (!n) {
+       setNextLocation(loc);
+       message(InterpreterMessages::patternEmptyGi);
+       return 0;
+      }
+      list.insert(curElement = new Pattern::Element(StringC(s, n)));
+      continue;
+    }
+    if (!curElement) {
+      setNextLocation(loc);
+      message(InterpreterMessages::patternBadGi,
+             ELObjMessageArg(head, *this));
+      return 0;
+    }
+    if (head->isNil())
+      continue; // empty attribute list
+    if (head->asPair()) {
+      if (!patternAddAttributeQualifiers(head, loc, *curElement)) {
+       setNextLocation(loc);
+       message(InterpreterMessages::patternBadAttributeQualifier);
+       return 0;
+      }
+      continue;
+    }
+    KeywordObj *key = dsssl2() ? head->asKeyword() : 0;
+    if (!key) {
+      setNextLocation(loc);
+      message(InterpreterMessages::patternBadMember,
+             ELObjMessageArg(head, *this));
+      return 0;
+    }
+    pair = obj->asPair();
+    if (!pair) {
+      setNextLocation(loc);
+      message(obj->isNil()
+             ? InterpreterMessages::patternMissingQualifierValue
+             : InterpreterMessages::patternNotList);
+      return 0;
+    }
+    ELObj *value = pair->car();
+    obj = pair->cdr();
+    Identifier::SyntacticKey k;
+    if (!key->identifier()->syntacticKey(k)) {
+      setNextLocation(loc);
+      message(InterpreterMessages::patternUnknownQualifier,
+             StringMessageArg(key->identifier()->name()));
+      return 0;
+    }
+    switch (k) {
+    case Identifier::keyAttributes:
+      if (!patternAddAttributeQualifiers(value, loc, *curElement)) {
+       setNextLocation(loc);
+       message(InterpreterMessages::patternBadAttributeQualifier);
+       return 0;
+      }
+      break;
+    case Identifier::keyChildren:
+      {
+       IList<Pattern::Element> children;
+       if (!convertToPattern(value, loc, 1, children))
+         return 0;
+       if (!children.empty())
+         curElement->addQualifier(new Pattern::ChildrenQualifier(children));
+      }
+      break;
+    case Identifier::keyRepeat:
+      {
+       if (isChild) {
+         setNextLocation(loc);
+         message(InterpreterMessages::patternChildRepeat);
+         return 0;
+       }
+        SymbolObj *sym = value->asSymbol();
+       if (sym) {
+         const StringC &str = *sym->name();
+         if (str.size() == 1) {
+           switch (str[0]) {
+           case '*':
+             curElement->setRepeat(0, Pattern::Repeat(-1));
+             value = 0;
+             break;
+           case '?':
+             curElement->setRepeat(0, 1);
+             value = 0;
+             break;
+           case '+':
+             curElement->setRepeat(1, Pattern::Repeat(-1));
+             value = 0;
+             break;
+           default:
+             break;
+           }
+         }
+       }
+       if (value) {
+         setNextLocation(loc);
+         message(InterpreterMessages::patternBadQualifierValue,
+                 ELObjMessageArg(value, *this),
+                 StringMessageArg(key->identifier()->name()));
+         return 0;
+       }
+      }
+      break;
+    case Identifier::keyPosition:
+      {
+        SymbolObj *sym = value->asSymbol();
+       if (sym) {
+         Pattern::Qualifier *qual = 0;
+         const StringC &str = *sym->name();
+         if (str == "first-of-type")
+           qual = new Pattern::FirstOfTypeQualifier;
+         else if (str == "last-of-type")
+           qual = new Pattern::LastOfTypeQualifier;
+         else if (str == "first-of-any")
+           qual = new Pattern::FirstOfAnyQualifier;
+         else if (str == "last-of-any")
+           qual = new Pattern::LastOfAnyQualifier;
+         if (qual) {
+           curElement->addQualifier(qual);
+           break;
+         }
+       }
+        setNextLocation(loc);
+       message(InterpreterMessages::patternBadQualifierValue,
+               ELObjMessageArg(value, *this),
+               StringMessageArg(key->identifier()->name()));
+       return 0;
+      }
+    case Identifier::keyOnly:
+      {
+        SymbolObj *sym = value->asSymbol();
+       if (sym) {
+         Pattern::Qualifier *qual = 0;
+         const StringC &str = *sym->name();
+         if (str == "of-type")
+           qual = new Pattern::OnlyOfTypeQualifier;
+         else if (str == "of-any")
+           qual = new Pattern::OnlyOfAnyQualifier;
+         if (qual) {
+           curElement->addQualifier(qual);
+           break;
+         }
+       }
+       setNextLocation(loc);
+       message(InterpreterMessages::patternBadQualifierValue,
+               ELObjMessageArg(value, *this),
+               StringMessageArg(key->identifier()->name()));
+       return 0;
+      }
+      break;
+    case Identifier::keyId:
+      {
+       StringObj *str = value->convertToString();
+       if (!str) {
+         setNextLocation(loc);
+         message(InterpreterMessages::patternBadQualifierValue,
+                 ELObjMessageArg(value, *this),
+                 StringMessageArg(key->identifier()->name()));
+         return 0;
+       }
+       const Char *s;
+       size_t n;
+       str->stringData(s, n);
+       curElement->addQualifier(new Pattern::IdQualifier(StringC(s, n)));
+      }
+      break;
+    case Identifier::keyClass:
+      {
+       StringObj *str = value->convertToString();
+       if (!str) {
+         setNextLocation(loc);
+         message(InterpreterMessages::patternBadQualifierValue,
+                 ELObjMessageArg(value, *this),
+                 StringMessageArg(key->identifier()->name()));
+         return 0;
+       }
+       const Char *s;
+       size_t n;
+       str->stringData(s, n);
+       curElement->addQualifier(new Pattern::ClassQualifier(StringC(s, n)));
+      }
+      break;
+    case Identifier::keyImportance:
+      {
+       long n;
+       if (!value->exactIntegerValue(n)) {
+         setNextLocation(loc);
+         message(InterpreterMessages::patternBadQualifierValue,
+                 ELObjMessageArg(value, *this),
+                 StringMessageArg(key->identifier()->name()));
+         return 0;
+       }
+       curElement->addQualifier(new Pattern::ImportanceQualifier(n));
+      }
+      break;
+    case Identifier::keyPriority:
+      {
+       long n;
+       if (!value->exactIntegerValue(n)) {
+         setNextLocation(loc);
+         message(InterpreterMessages::patternBadQualifierValue,
+                 ELObjMessageArg(value, *this),
+                 StringMessageArg(key->identifier()->name()));
+         return 0;
+       }
+       curElement->addQualifier(new Pattern::PriorityQualifier(n));
+      }
+      break;
+    default:
+      setNextLocation(loc);
+      message(InterpreterMessages::patternUnknownQualifier,
+             StringMessageArg(key->identifier()->name()));
+      return 0;
+    }
+  }
+  return 1;
+}
+
+bool Interpreter::patternAddAttributeQualifiers(ELObj *obj,
+                                               const Location &loc,
+                                               Pattern::Element &elem)
+{
+  while (!obj->isNil()) {
+    PairObj *pair = obj->asPair();
+    if (!pair)
+      return 0;
+    StringObj *tem = pair->car()->convertToString();
+    if (!tem)
+      return 0;
+    const Char *s;
+    size_t n;
+    tem->stringData(s, n);
+    if (n == 0)
+      return 0;
+    StringC name(s, n);
+    obj = pair->cdr();
+    pair = obj->asPair();
+    if (!pair)
+      return 0;
+    obj = pair->cdr();
+    if (pair->car() == makeFalse() && dsssl2())
+      elem.addQualifier(new Pattern::AttributeMissingValueQualifier(name));
+    else if (pair->car() == makeTrue() && dsssl2())
+      elem.addQualifier(new Pattern::AttributeHasValueQualifier(name));
+    else {
+      tem = pair->car()->convertToString();
+      if (!tem)
+       return 0;
+      tem->stringData(s, n);
+      elem.addQualifier(new Pattern::AttributeQualifier(name, StringC(s, n)));
+    }
+  }
+  return 1;
+}
+
+void Interpreter::dispatchMessage(Message &msg)
+{
+  messenger_->dispatchMessage(msg);
+}
+
+void Interpreter::dispatchMessage(const Message &msg)
+{
+  messenger_->dispatchMessage(msg);
+}
+
+Interpreter::StringSet::StringSet()
+{
+}
+
+const char *Interpreter::StringSet::store(String<char> &str)
+{
+  str += '\0';
+  const String<char> *p = table_.lookup(str);
+  if (!p) {
+    String<char> *tem = new String<char>;
+    str.swap(*tem);
+    table_.insert(tem);
+    p = tem;
+  }
+  return p->data();
+}
+
+unsigned long Interpreter::StringSet::hash(const String<char> &str)
+{
+  const char *p = str.data();
+  unsigned long h = 0;
+  for (size_t n = str.size(); n > 0; n--)
+    h = (h << 5) + h + (unsigned char)*p++;    // from Chris Torek
+  return h;
+}
+
+bool Identifier::preferBuiltin_ = 0;
+
+Identifier::Identifier(const StringC &name)
+: Named(name), value_(0), syntacticKey_(notKey), beingComputed_(0), 
+  flowObj_(0), builtin_(0), defPart_(0), charNIC_(0)
+{
+}
+
+void Identifier::maybeSaveBuiltin()
+{
+  if (defPart_ == unsigned(-1) && !builtin_) {
+    builtin_ = new Identifier(name());
+    if (value_)
+      builtin_->setValue(value_, defPart_);
+    else
+      builtin_->setDefinition(def_, defPart_, defLoc_);
+  }
+}
+void Identifier::setDefinition(Owner<Expression> &expr,
+                              unsigned part,
+                              const Location &loc)
+{
+  maybeSaveBuiltin();
+  def_.swap(expr);
+  defPart_ = part;
+  defLoc_ = loc;
+  value_ = 0;
+}
+
+void Identifier::setValue(ELObj *value, unsigned partIndex)
+{
+  maybeSaveBuiltin();
+  value_ = value;
+  // Built in functions have lowest priority.
+  defPart_ = partIndex;
+}
+
+bool Identifier::defined(unsigned &part, Location &loc) const
+{
+  if (!def_ && !value_)
+    return 0;
+  part = defPart_;
+  loc = defLoc_;
+  return 1;
+}
+
+ELObj *Identifier::computeValue(bool force, Interpreter &interp) const
+{
+  if (builtin_ && preferBuiltin_)
+    return builtin_->computeValue(force, interp);
+  if (value_)
+    return value_;
+  bool preferred = 0;
+  if (defPart_ == unsigned(-1) && !preferBuiltin_) {
+    preferBuiltin_ = 1;
+    preferred = 1;
+  }
+  ASSERT(def_);
+  if (beingComputed_) {
+    if (force) {
+      interp.setNextLocation(defLoc_);
+      interp.message(InterpreterMessages::identifierLoop,
+                    StringMessageArg(name()));
+      ((Identifier *)this)->value_ = interp.makeError();
+    }
+  }
+  else {
+    ((Identifier *)this)->beingComputed_ = 1;
+    if (insn_.isNull())
+      ((Identifier *)this)->insn_ 
+        = Expression::optimizeCompile(((Identifier *)this)->def_, interp,
+                                     Environment(), 0, InsnPtr());
+    if (force || def_->canEval(0)) {
+      VM vm(interp);
+      ELObj *v = vm.eval(insn_.pointer());
+      interp.makePermanent(v);
+      ((Identifier *)this)->value_ = v;
+    }
+    ((Identifier *)this)->beingComputed_ = 0;
+  }
+  if (preferred)
+    preferBuiltin_ = 0;
+  return value_;
+}
+
+ELObj *Identifier::computeBuiltinValue(bool force, Interpreter &interp) const
+{
+  preferBuiltin_ = 1;
+  ELObj *res = computeValue(force, interp);
+  preferBuiltin_ = 0;
+  return res;
+}
+
+Unit::Unit(const StringC &name)
+: Named(name), computed_(notComputed)
+{
+}
+
+bool Unit::defined(unsigned &part, Location &loc) const
+{
+  if (!def_ && computed_ == notComputed)
+    return 0;
+  part = defPart_;
+  loc = defLoc_;
+  return 1;
+}
+
+void Unit::setDefinition(Owner<Expression> &expr,
+                        unsigned part,
+                        const Location &loc)
+{
+  def_.swap(expr);
+  defPart_ = part;
+  defLoc_ = loc;
+  computed_ = notComputed;
+}
+
+void Unit::setValue(long n)
+{
+  computed_ = computedExact;
+  exact_ = n;
+  dim_ = 1;
+  defPart_ = unsigned(-1);
+}
+
+void Unit::setValue(double n)
+{
+  computed_ = computedInexact;
+  inexact_ = n;
+  dim_ = 1;
+  defPart_ = unsigned(-1);
+}
+
+void Unit::tryCompute(bool force, Interpreter &interp)
+{
+  if (computed_ == notComputed) {
+    computed_ = beingComputed;
+    if (insn_.isNull())
+      insn_ = Expression::optimizeCompile(def_, interp, Environment(), 0, InsnPtr());
+    if (force || def_->canEval(0)) {
+      VM vm(interp);
+      ELObj *v = vm.eval(insn_.pointer());
+      switch (v->quantityValue(exact_, inexact_, dim_)) {
+      case ELObj::noQuantity:
+       if (!interp.isError(v)) {
+         interp.setNextLocation(defLoc_);
+         interp.message(InterpreterMessages::badUnitDefinition,
+                        StringMessageArg(name()));
+       }
+       computed_ = computedError;
+       break;
+      case ELObj::longQuantity:
+       computed_ = computedExact;
+       break;
+      case ELObj::doubleQuantity:
+       computed_ = computedInexact;
+       break;
+      default:
+       CANNOT_HAPPEN();
+      }
+    }
+    if (computed_ == beingComputed)
+      computed_ = notComputed;
+  }
+  else if (computed_ == beingComputed) {
+    interp.setNextLocation(defLoc_);
+    interp.message(InterpreterMessages::unitLoop,
+                  StringMessageArg(name()));
+    computed_ = computedError;
+  }
+}
+
+// multiply by 10^valExp
+// quantity has exponent of 1
+
+ELObj *Unit::resolveQuantity(bool force, Interpreter &interp,
+                            long val, int valExp)
+{
+  tryCompute(force, interp);
+  long result;
+  if (computed_ == computedExact && scale(val, valExp, exact_, result))
+    return new (interp) LengthObj(result);
+  double x = val;
+  while (valExp > 0) {
+    x *= 10.0;
+    valExp--;
+  }
+  while (valExp < 0) {
+    x /= 10.0;
+    valExp++;
+  }
+  return resolveQuantity(force, interp, x, 1);
+}
+
+// val * 10^valExp * factor
+// return 0 if it can't be done without overflow
+
+bool Unit::scale(long val, int valExp, long factor, long &result)
+{
+  if (factor <= 0)
+    return 0; // feeble
+  while (valExp > 0) {
+    if (factor > LONG_MAX/10)
+      return 0;
+    valExp--;
+    factor *= 10;
+  }
+  if (val >= 0) {
+    if (val > LONG_MAX/factor)
+      return 0;
+  }
+  else {
+    if (-(unsigned long)val > -(unsigned long)LONG_MIN/factor)
+      return 0;
+  }
+  result = val*factor;
+  while (valExp < 0) {
+    result /= 10;
+    valExp++;
+  }
+  return 1;
+}
+
+ELObj *Unit::resolveQuantity(bool force, Interpreter &interp,
+                            double val, int unitExp)
+{
+  tryCompute(force, interp);
+  double factor;
+  switch (computed_) {
+  case computedExact:
+    factor = exact_;
+    break;
+  case computedInexact:
+    factor = inexact_;
+    break;
+  case computedError:
+    return interp.makeError();
+  default:
+    return 0;
+  }
+  int resultDim = 0;
+  double resultVal = val;
+  while (unitExp > 0) {
+    resultDim += dim_;
+    resultVal *= factor;
+    unitExp--;
+  }
+  while (unitExp < 0) {
+    resultDim -= dim_;
+    resultVal /= factor;
+    unitExp++;
+  }
+  if (resultDim == 0)
+    return new (interp) RealObj(resultVal);
+  return new (interp) QuantityObj(resultVal, resultDim);
+}
+
+void ELObjDynamicRoot::trace(Collector &c) const
+{
+  c.trace(obj_);
+}
+
+bool operator==(const StringC &s, const char *p)
+{
+  for (size_t i = 0; i < s.size(); i++)
+    if (p[i] == '\0' || (unsigned char)p[i] != s[i])
+      return 0;
+  return p[s.size()] == '\0';
+}
+
+void Interpreter::installBuiltins()
+{
+  partIndex_ = unsigned(-1);
+  StringC sysid(makeStringC(DEFAULT_SCHEME_BUILTINS));
+  StringC src;
+  groveManager_->mapSysid(sysid);
+  if (groveManager_->readEntity(sysid, src)) {
+    Owner<InputSource> in(new InternalInputSource(src,
+                              InputSourceOrigin::make()));
+    SchemeParser scm(*this, in);
+    scm.parse();
+  }
+  endPart();
+  partIndex_ = 0;
+}
+
+void Interpreter::setDefaultLanguage(Owner<Expression> &expr,
+                                    unsigned part,
+                                    const Location &loc)
+{
+  defaultLanguageDef_.swap(expr);
+  defaultLanguageDefPart_ = part;
+  defaultLanguageDefLoc_ = loc;
+}
+
+ELObj *Interpreter::defaultLanguage() const
+{
+  return defaultLanguage_;
+}
+
+bool Interpreter::defaultLanguageSet(unsigned &part,Location &loc) const
+{
+  if(defaultLanguageDef_) {
+    part = defaultLanguageDefPart_;
+    loc = defaultLanguageDefLoc_;
+    return true;
+  }
+  return false;
+}
+
+void Interpreter::compileDefaultLanguage()
+{
+  if(defaultLanguageDef_) {
+    InsnPtr insn = Expression::optimizeCompile(defaultLanguageDef_, *this,
+                                              Environment(), 0, InsnPtr());
+    VM vm(*this);
+    ELObj *obj = vm.eval(insn.pointer());
+    if(!obj->asLanguage()) {
+      if(!isError(obj)) {
+       setNextLocation(defaultLanguageDefLoc_);
+       message(InterpreterMessages::defLangDeclRequiresLanguage,
+               ELObjMessageArg(obj, *this));
+      }
+      return;
+    }
+    makePermanent(obj);
+    defaultLanguage_ = obj;
+  }
+}
+
+void Interpreter::installCharProperties()
+{
+  //FIXME convert this to tables 
+  // initialize charProperties_;
+  // if a character doesn't have a value for a property,
+  // the CharMap contains 0. 
+
+  CharProp cp;
+
+  cp.def = ELObjPart(makeFalse(), unsigned(-1));
+  cp.loc = Location();
+  cp.map = new CharMap<ELObjPart>(ELObjPart(0, 0));
+  if (!strictMode_)
+    for (int i = 0; i < 10; i++) {
+      ELObjPart num(makeInteger(i), unsigned(-1));
+      makePermanent(num.obj);
+      cp.map->setChar(i+'0', num);
+    }
+  charProperties_.insert(makeStringC("numeric-equiv"), cp);
+  
+  cp.def = ELObjPart(makeFalse(), unsigned(-1));
+  cp.map = new CharMap<ELObjPart>(ELObjPart(0, 0));
+  if (!strictMode_) {
+    static struct {
+      Char c;
+      unsigned num;
+    } chars[] = {
+#define SPACE 
+#include "charProps.h"
+#undef SPACE
+    };
+   
+    for (size_t i = 0; i < SIZEOF(chars); i++) 
+      cp.map->setRange(chars[i].c, chars[i].c+chars[i].num-1,
+                      ELObjPart(makeTrue(), unsigned(-1)));
+  }
+  charProperties_.insert(makeStringC("space?"), cp);
+    
+  cp.def = ELObjPart(makeFalse(), unsigned(-1));
+  cp.map = new CharMap<ELObjPart>(ELObjPart(0, 0));
+  if (!strictMode_) {
+    static struct {
+      Char c;
+      unsigned num;
+    } chars[] = {
+#define RECORD_END
+#include "charProps.h"
+#undef RECORD_END
+    };
+    
+    for (size_t i = 0; i < SIZEOF(chars); i++) 
+      cp.map->setRange(chars[i].c, chars[i].c+chars[i].num-1,
+                      ELObjPart(makeTrue(), unsigned(-1)));
+  }
+  charProperties_.insert(makeStringC("record-end?"), cp);
+
+  cp.def = ELObjPart(makeFalse(), unsigned(-1));
+  cp.map = new CharMap<ELObjPart>(ELObjPart(0, 0));
+  if (!strictMode_) {
+    static struct {
+      Char c;
+      unsigned num;
+    } chars[] = {
+#define BLANK
+#include "charProps.h"
+#undef BLANK
+    };
+    
+    for (size_t i = 0; i < SIZEOF(chars); i++) 
+      cp.map->setRange(chars[i].c, chars[i].c+chars[i].num-1,
+                      ELObjPart(makeTrue(), unsigned(-1)));
+  }
+  charProperties_.insert(makeStringC("blank?"), cp);
+
+  cp.def = ELObjPart(makeFalse(), unsigned(-1));
+  cp.map = new CharMap<ELObjPart>(ELObjPart(0, 0));
+  if (!strictMode_) {
+    static struct {
+      Char c;
+      unsigned num;
+    } chars[] = {
+#define INPUT_TAB
+#include "charProps.h"
+#undef INPUT_TAB
+    };
+    
+    for (size_t i = 0; i < SIZEOF(chars); i++) 
+      cp.map->setRange(chars[i].c, chars[i].c+chars[i].num-1,
+                      ELObjPart(makeTrue(), unsigned(-1)));
+  }
+  charProperties_.insert(makeStringC("input-tab?"), cp);
+    
+  cp.def = ELObjPart(makeFalse(), unsigned(-1));
+  cp.map = new CharMap<ELObjPart>(ELObjPart(0, 0));
+  if (!strictMode_) {
+    static struct {
+      Char c;
+      unsigned num;
+    } chars[] = {
+#define INPUT_WHITESPACE
+#include "charProps.h"
+#undef INPUT_WHITESPACE
+    };
+    
+    for (size_t i = 0; i < SIZEOF(chars); i++) 
+      cp.map->setRange(chars[i].c, chars[i].c+chars[i].num-1,
+                      ELObjPart(makeTrue(), unsigned(-1)));
+  }
+  charProperties_.insert(makeStringC("input-whitespace?"), cp);
+
+  cp.def = ELObjPart(makeFalse(), unsigned(-1));
+  cp.map = new CharMap<ELObjPart>(ELObjPart(0, 0));
+  if (!strictMode_) {
+    static struct {
+      Char c;
+      unsigned num;
+    } chars[] = {
+#define PUNCT
+#include "charProps.h"
+#undef PUNCT
+    };
+    
+    for (size_t i = 0; i < SIZEOF(chars); i++) 
+      cp.map->setRange(chars[i].c, chars[i].c+chars[i].num-1,
+                      ELObjPart(makeTrue(), unsigned(-1)));
+  }
+  charProperties_.insert(makeStringC("punct?"), cp);
+
+  cp.def = ELObjPart(makeFalse(), unsigned(-1));
+  cp.map = new CharMap<ELObjPart>(ELObjPart(0, 0));
+  if (!strictMode_) {
+    static struct {
+      Char c1, c2;
+      char *script;
+    } chars[] = {
+#define SCRIPT
+#include "charProps.h"
+#undef SCRIPT
+    };
+    
+    StringC prefix = makeStringC("ISO/IEC 10179::1996//Script::");
+    for (size_t i = 0; i < SIZEOF(chars); i++) { 
+      StringC tem(prefix);
+      tem += makeStringC(chars[i].script);
+      StringObj *obj = new (*this) StringObj(tem);
+      makePermanent(obj);  
+      cp.map->setRange(chars[i].c1, chars[i].c2,
+                      ELObjPart(obj, unsigned(-1)));
+    }
+  }
+  charProperties_.insert(makeStringC("script"), cp);
+
+  cp.def = ELObjPart(makeFalse(), unsigned(-1));
+  cp.map = new CharMap<ELObjPart>(ELObjPart(0, 0));
+  charProperties_.insert(makeStringC("glyph-id"), cp);  
+
+  cp.def = ELObjPart(makeFalse(), unsigned(-1));
+  cp.map = new CharMap<ELObjPart>(ELObjPart(0, 0));
+  charProperties_.insert(makeStringC("drop-after-line-break?"), cp);  
+
+  cp.def = ELObjPart(makeFalse(), unsigned(-1));
+  cp.map = new CharMap<ELObjPart>(ELObjPart(0, 0));
+  charProperties_.insert(makeStringC("drop-unless-before-line-break?"), cp);  
+
+  cp.def = ELObjPart(makeInteger(0), unsigned(-1));
+  makePermanent(cp.def.obj);
+  cp.map = new CharMap<ELObjPart>(ELObjPart(0, 0));
+  CharProp cp2;
+  cp2.def = ELObjPart(cp.def.obj, unsigned(-1));
+  cp2.loc = Location();
+  cp2.map = new CharMap<ELObjPart>(ELObjPart(0, 0));
+  if(!strictMode_) {
+    static struct {
+      Char c;
+      unsigned short num;
+      unsigned short bbp;
+      unsigned short bap;
+    } chars[] ={
+#define BREAK_PRIORITIES
+#include "charProps.h"
+#undef BREAK_PRIORITIES
+    };
+    for(size_t i = 0; i<SIZEOF(chars); ++i) {
+      ELObj *obj = makeInteger(chars[i].bbp);
+      makePermanent(obj);
+      cp.map->setRange(chars[i].c, chars[i].c + chars[i].num-1,
+                      ELObjPart(obj, unsigned(-1)));
+      if(chars[i].bap!=chars[i].bbp) {
+       obj = makeInteger(chars[i].bap);
+       makePermanent(obj);
+      }
+      cp2.map->setRange(chars[i].c, chars[i].c+chars[i].num-1,
+                       ELObjPart(obj, unsigned(-1)));
+    }
+  }
+
+  charProperties_.insert(makeStringC("break-before-priority"), cp);  
+  charProperties_.insert(makeStringC("break-after-priority"), cp2);  
+
+  cp.def = ELObjPart(makeSymbol(makeStringC("ordinary")), unsigned(-1));
+  makePermanent(cp.def.obj);
+  cp.map = new CharMap<ELObjPart>(ELObjPart(0, 0));
+  charProperties_.insert(makeStringC("math-class"), cp);  
+
+  cp.def = ELObjPart(makeFalse(), unsigned(-1));
+  cp.map = new CharMap<ELObjPart>(ELObjPart(0, 0));
+  charProperties_.insert(makeStringC("math-font-posture"), cp);  
+}
+
+// return 1 if the character has the property, return 0 if no such property
+// or the character doesn't have the property
+// set ret to the value or the default value
+ELObj *Interpreter::charProperty(const StringC &prop, Char c, const Location &loc, ELObj *def) 
+{
+  const CharProp *cp = charProperties_.lookup(prop);
+  if (!cp) {
+    setNextLocation(loc);
+    message(InterpreterMessages::unknownCharProperty,
+            StringMessageArg(prop));
+    return makeError();
+  }
+
+  if ((*cp->map)[c].obj) 
+    return (*cp->map)[c].obj;
+  else if (def) 
+    return def;
+  else 
+    return cp->def.obj;
+}
+
+void Interpreter::addCharProperty(const Identifier *prop, Owner<Expression> &defval)
+{
+  // FIXME: what about variable default values ?
+  defval->optimize(*this, Environment(), defval);
+  if(!defval->constantValue()) {
+    setNextLocation(defval->location());
+    message(InterpreterMessages::varCharPropertyExprUnsupported);
+    return;
+  }
+  // FIXME: this is a kind of memory leak
+  makePermanent(defval->constantValue());
+  ELObjPart val(defval->constantValue(), partIndex_);
+  const CharProp *cp = charProperties_.lookup(prop->name());
+  if (cp) {
+    if (partIndex_ < cp->def.defPart) 
+      ((CharProp *)cp)->def = val;
+    else if (partIndex_ == cp->def.defPart && 
+             !ELObj::eqv(*val.obj, *cp->def.obj)) {
+      // FIXME: report previous location
+      setNextLocation(defval->location());
+      message(InterpreterMessages::duplicateCharPropertyDecl,
+              StringMessageArg(prop->name()), cp->loc);
+    }
+  }
+   else {
+    CharProp ncp;
+    ncp.map = new CharMap<ELObjPart>(ELObjPart(0,0));
+    ncp.def = val;
+    ncp.loc = defval->location();
+    charProperties_.insert(prop->name(), ncp);
+  }
+}
+
+void Interpreter::setCharProperty(const Identifier *prop, Char c, Owner<Expression> &val)
+{
+  // FIXME: what about variable default values ?
+  val->optimize(*this, Environment(), val);
+  if(!val->constantValue()) {
+    setNextLocation(val->location());
+    message(InterpreterMessages::varCharPropertyExprUnsupported);
+    return;
+  }
+  makePermanent(val->constantValue());
+  const CharProp *cp = charProperties_.lookup(prop->name());
+  if (!cp) {
+    CharProp ncp;
+    ncp.map = new CharMap<ELObjPart>(ELObjPart(0,0));
+    ncp.def = ELObjPart(0, unsigned(-1));
+    ncp.loc = val->location();
+    charProperties_.insert(prop->name(), ncp);
+    cp = charProperties_.lookup(prop->name());
+  }
+  ELObjPart obj = ELObjPart(val->constantValue(), partIndex_);
+  
+  ELObjPart def = (*cp->map)[c];
+  if (def.obj) {
+    if (partIndex_ < def.defPart) 
+      cp->map->setChar(c, obj);
+    else if (partIndex_ == def.defPart && !ELObj::eqv(*obj.obj, *def.obj)) {
+      setNextLocation(val->location());
+      // FIXME: report previous location
+      message(InterpreterMessages::duplicateAddCharProperty,
+              StringMessageArg(prop->name()),
+              StringMessageArg(StringC(&c, 1)));
+    }
+  }
+  else 
+    cp->map->setChar(c, obj);
+}
+
+void
+Interpreter::compileCharProperties()
+{
+  HashTableIter<StringC, CharProp> iter(charProperties_);
+  const StringC *key;
+  const CharProp *val;
+  while (iter.next(key, val)) 
+    if (!val->def.obj) {
+      // FIXME location
+      setNextLocation(val->loc);
+      message(InterpreterMessages::unknownCharProperty,
+              StringMessageArg(*key));
+      ((CharProp *)val)->def = ELObjPart(makeError(), 0);
+    }
+}
+
+
+void Interpreter::installExtensionCharNIC(Identifier *ident,
+                                         const StringC &pubid,
+                                         const Location &loc)
+{
+  ident->setCharNIC(currentPartIndex(), loc);
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
diff --git a/style/Interpreter.h b/style/Interpreter.h
new file mode 100644 (file)
index 0000000..4e33457
--- /dev/null
@@ -0,0 +1,894 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef Interpreter_INCLUDED
+#define Interpreter_INCLUDED 1
+
+#include "ELObj.h"
+#include "Expression.h"
+#include "Message.h"
+#include "PointerTable.h"
+#include "NamedTable.h"
+#include "Collector.h"
+#include "InputSource.h"
+#include "XcharMap.h"
+#include "Owner.h"
+#include "Style.h"
+#include "SosofoObj.h"
+#include "ProcessingMode.h"
+#include "NumberCache.h"
+#include "HashTable.h"
+#include "FOTBuilder.h"
+#include "Owner.h"
+#include "Boolean.h"
+#include "Node.h"
+#include "GroveManager.h"
+#include "Pattern.h"
+#include "CharMap.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class Interpreter;
+
+class Identifier : public Named {
+public:
+  enum SyntacticKey {
+    notKey,
+    keyQuote,
+    keyLambda,
+    keyIf,
+    keyCond,
+    keyAnd, 
+    keyOr,
+    keyCase,
+    keyLet, 
+    keyLetStar, 
+    keyLetrec,
+    keyQuasiquote,
+    keyUnquote, 
+    keyUnquoteSplicing,
+    keyDefine,
+    keyElse,
+    keyArrow,
+    keySet,
+    keyBegin,
+    keyThereExists,
+    keyForAll,
+    keySelectEach,
+    keyUnionForEach,
+    keyMake,
+    keyStyle,
+    keyWithMode,
+    keyDefineUnit,
+    keyQuery,
+    keyElement,
+    keyDefault,
+    keyRoot,
+    keyId,
+    keyMode,
+    keyDeclareInitialValue,
+    keyDeclareCharacteristic,
+    keyDeclareFlowObjectClass,
+    keyDeclareCharCharacteristicAndProperty,
+    keyDeclareReferenceValueType,
+    keyDeclareDefaultLanguage,
+    keyDeclareCharProperty,
+    keyDefinePageModel,
+    keyDefineColumnSetModel,
+    keyDefineLanguage,
+    keyAddCharProperties,
+    keyUse,
+    keyLabel,
+    keyContentMap,
+    keyIsKeepWithPrevious,
+    keyIsKeepWithNext,
+    keySpaceBefore,
+    keySpaceAfter,
+    keyLeftHeader,
+    keyCenterHeader,
+    keyRightHeader,
+    keyLeftFooter,
+    keyCenterFooter,
+    keyRightFooter,
+    keyDestination,
+    keyType,
+    keyCoalesceId,
+    keyIsDisplay,
+    keyScale,
+    keyMaxWidth,
+    keyMaxHeight,
+    keyEntitySystemId,
+    keyNotationSystemId,
+    keyPositionPointX,
+    keyPositionPointY,
+    keyEscapementDirection,
+    keyBreakBeforePriority,
+    keyBreakAfterPriority,
+    keyOrientation,
+    keyLength,
+    keyChar,
+    keyGlyphId,
+    keyIsSpace,
+    keyIsRecordEnd,
+    keyIsInputTab,
+    keyIsInputWhitespace,
+    keyIsPunct,
+    keyIsDropAfterLineBreak,
+    keyIsDropUnlessBeforeLineBreak,
+    keyMathClass,
+    keyMathFontPosture,
+    keyScript,
+    keyStretchFactor,
+    keyKeep,
+    keyBreakBefore,
+    keyBreakAfter,
+    keyIsMayViolateKeepBefore,
+    keyIsMayViolateKeepAfter,
+    keyBeforeRowBorder,
+    keyAfterRowBorder,
+    keyBeforeColumnBorder,
+    keyAfterColumnBorder,
+    keyColumnNumber,
+    keyRowNumber,
+    keyNColumnsSpanned,
+    keyNRowsSpanned,
+    keyWidth,
+    keyIsStartsRow,
+    keyIsEndsRow,
+    keyTableWidth,
+    keyMultiModes,
+    keyData,
+    keyMin,
+    keyMax,
+    keyIsConditional,
+    keyPriority,
+    keyGridNRows,
+    keyGridNColumns,
+    keyRadical,
+    keyNull,
+    keyIsRcs,
+    keyParent,
+    keyActive,
+    keyAttributes,
+    keyChildren,
+    keyRepeat,
+    keyPosition,
+    keyOnly,
+    keyClass,
+    keyImportance,
+    keyDeclareClassAttribute,
+    keyDeclareIdAttribute,
+    keyDeclareFlowObjectMacro,
+    keyOrElement,
+    keyPositionPreference,
+    keyCollate,
+    keyToupper,
+    keyTolower,
+    keySymbol,
+    keyOrder,
+    keyForward,
+    keyBackward,
+    keyWhitePoint,
+    keyBlackPoint,
+    keyRange,
+    keyRangeAbc,
+    keyRangeLmn,
+    keyRangeA,
+    keyDecodeAbc,
+    keyDecodeLmn,
+    keyDecodeA, 
+    keyMatrixAbc,
+    keyMatrixLmn,
+    keyMatrixA,
+    keyArchitecture
+  };
+  enum { lastSyntacticKey = keyWithMode };
+  Identifier(const StringC &name);
+  // Return 0 is value can't yet be computed.
+  ELObj *computeValue(bool force, Interpreter &) const;
+  ELObj *computeBuiltinValue(bool force, Interpreter &) const;
+  bool syntacticKey(SyntacticKey &) const;
+  void setSyntacticKey(SyntacticKey);
+  bool defined(unsigned &, Location &) const;
+  void setDefinition(Owner<Expression> &, unsigned part,
+                     const Location &);
+  void setValue(ELObj *, unsigned defPart = unsigned(-1));
+  bool evaluated() const;
+  const ConstPtr<InheritedC> &inheritedC() const;
+  bool inheritedCDefined(unsigned &, Location &) const;
+  bool charNICDefined(unsigned &, Location &) const;
+  void setCharNIC(unsigned, const Location &);
+  void setInheritedC(const ConstPtr<InheritedC> &);
+  void setInheritedC(const ConstPtr<InheritedC> &, unsigned, const Location &);
+  FlowObj *flowObj() const;
+  bool flowObjDefined(unsigned &, Location &) const;
+  void setFlowObj(FlowObj *);
+  void setFlowObj(FlowObj *, unsigned part, const Location &);
+private:
+  unsigned defPart_;
+  Owner<Expression> def_;
+  InsnPtr insn_;
+  // Value in top-level environment.
+  ELObj *value_;               // must be permanent
+  FlowObj *flowObj_;    // prototype FlowObj with this name
+  unsigned flowObjPart_;
+  Location flowObjLoc_;
+  Location defLoc_;
+  SyntacticKey syntacticKey_;
+  bool beingComputed_;
+  bool charNIC_;
+  ConstPtr<InheritedC> inheritedC_;
+  unsigned inheritedCPart_;
+  Location inheritedCLoc_;
+  void maybeSaveBuiltin();
+  Identifier *builtin_;
+  static bool preferBuiltin_;
+};
+
+class Unit : public Named {
+public:
+  Unit(const StringC &);
+  void setValue(long);
+  void setValue(double);
+  bool defined(unsigned &, Location &) const;
+  // return 0 if it can't be done
+  ELObj *resolveQuantity(bool force, Interpreter &, double val, int unitExp);
+  ELObj *resolveQuantity(bool force, Interpreter &, long val, int valExp);
+  void setDefinition(Owner<Expression> &, unsigned part, const Location &);
+private:
+  void tryCompute(bool force, Interpreter &);
+  static bool scale(long val, int valExp, long num, long &result);
+
+  unsigned defPart_;
+  Location defLoc_;
+  Owner<Expression> def_;
+  InsnPtr insn_;
+  enum {
+    notComputed,
+    beingComputed,
+    computedExact,
+    computedInexact,
+    computedError
+    } computed_;
+  union {
+    long exact_;
+    double inexact_;
+  };
+  int dim_;
+};
+
+class ELObjDynamicRoot : public Collector::DynamicRoot {
+public:
+  ELObjDynamicRoot(Collector &c, ELObj *obj = 0)
+    : Collector::DynamicRoot(c), obj_(obj) { }
+  void operator=(ELObj *obj) { obj_ = obj; }
+  operator ELObj *() const { return obj_; }
+private:
+  void trace(Collector &) const;
+  ELObj *obj_;
+};
+
+struct CharPart {
+  Char c;
+  unsigned defPart;
+};
+
+struct ELObjPart {
+  ELObjPart();
+  ELObjPart(ELObj *x, unsigned y);
+  void operator=(const ELObjPart &);
+  bool operator==(const ELObjPart &) const;
+  bool operator!=(const ELObjPart &) const;
+  ELObj *obj;
+  unsigned defPart;
+};
+
+struct CharProp {
+  CharMap<ELObjPart> *map;
+  ELObjPart def;
+  Location loc;
+};
+
+class Interpreter : 
+  public Collector,
+  public Pattern::MatchContext,
+  public NumberCache,
+  public Messenger {
+public:
+  enum PortName {
+    portNumerator,
+    portDenominator,
+    portPreSup,
+    portPreSub,
+    portPostSup,
+    portPostSub,
+    portMidSup,
+    portMidSub,
+    portOverMark,
+    portUnderMark,
+    portOpen,
+    portClose,
+    portDegree,
+    portOperator,
+    portLowerLimit,
+    portUpperLimit,
+    portHeader,
+    portFooter
+  };
+  enum { nPortNames = portFooter + 1 };
+  Interpreter(GroveManager *, Messenger *, int unitsPerInch, bool debugMode,
+             bool dsssl2, bool strictMode, const FOTBuilder::Extension *);
+  void endPart();
+  void dEndPart();
+  FalseObj *makeFalse();
+  TrueObj *makeTrue();
+  NilObj *makeNil();
+  SymbolObj *makeSymbol(const StringC &);
+  KeywordObj *makeKeyword(const StringC &);
+  IntegerObj *makeInteger(long n);
+  ErrorObj *makeError();
+  UnspecifiedObj *makeUnspecified();
+  PairObj *makePair(ELObj *, ELObj *);
+  ELObj *convertGlyphId(const Char *, size_t, const Location &);
+  bool isError(const ELObj *) const;
+  bool isUnspecified(const ELObj *) const;
+  CharObj *makeChar(Char);
+  ELObj *makeLengthSpec(const FOTBuilder::LengthSpec &);
+  AddressObj *makeAddressNone();
+  NodeListObj *makeEmptyNodeList();
+  void dispatchMessage(Message &);
+  void dispatchMessage(const Message &);
+  Identifier *lookup(const StringC &);
+  Unit *lookupUnit(const StringC &);
+  FunctionObj *lookupExternalProc(const StringC &);
+  int unitsPerInch() const;
+  unsigned currentPartIndex() const;
+  void compile();
+  static StringC makeStringC(const char *);
+  SymbolObj *portName(PortName);
+  ELObj *cValueSymbol(FOTBuilder::Symbol);
+  ELObj *charProperty(const StringC &, Char, const Location &, ELObj *);
+  void addCharProperty(const Identifier *, Owner<Expression> &);
+  void setCharProperty(const Identifier *, Char, Owner<Expression> &);
+  void compileCharProperties();
+  // Map of LexCategory
+  XcharMap<char> lexCategory_;
+  static void normalizeGeneralName(const NodePtr &, StringC &);
+  GroveManager *groveManager() const;
+  StyleObj *initialStyle() const;
+  StyleObj *borderTrueStyle() const;
+  StyleObj *borderFalseStyle() const;
+  bool convertBooleanC(ELObj *, const Identifier *, const Location &, bool &);
+  bool convertPublicIdC(ELObj *, const Identifier *, const Location &,
+                       FOTBuilder::PublicId &);
+  bool convertStringC(ELObj *, const Identifier *, const Location &, StringC &);
+  bool convertLengthC(ELObj *, const Identifier *, const Location &, FOTBuilder::Length &);
+  bool convertLengthSpecC(ELObj *, const Identifier *, const Location &, FOTBuilder::LengthSpec &);
+  bool convertLetter2C(ELObj *, const Identifier *, const Location &, FOTBuilder::Letter2 &);
+  bool convertOptLengthSpecC(ELObj *, const Identifier *, const Location &, FOTBuilder::OptLengthSpec &);
+  bool convertCharC(ELObj *, const Identifier *, const Location &, Char &);
+  bool convertColorC(ELObj *, const Identifier *, const Location &, ColorObj *&);
+  bool convertOptColorC(ELObj *, const Identifier *, const Location &, ColorObj *&);
+  // FIXME allow inexact value
+  bool convertIntegerC(ELObj *, const Identifier *, const Location &, long &);
+  bool convertOptPositiveIntegerC(ELObj *, const Identifier *, const Location &, long &);
+  bool convertRealC(ELObj *, const Identifier *, const Location &, double &);
+  bool convertEnumC(const FOTBuilder::Symbol *, size_t,
+                    ELObj *, const Identifier *, const Location &, FOTBuilder::Symbol &);
+  bool convertEnumC(ELObj *, const Identifier *, const Location &, FOTBuilder::Symbol &);
+  void invalidCharacteristicValue(const Identifier *ident, const Location &loc);
+  bool convertLengthSpec(ELObj *, FOTBuilder::LengthSpec &);
+  bool convertToPattern(ELObj *, const Location &, Pattern &);
+  const ConstPtr<InheritedC> &tableBorderC() const;
+  const ConstPtr<InheritedC> &cellBeforeRowBorderC() const;
+  const ConstPtr<InheritedC> &cellAfterRowBorderC() const;
+  const ConstPtr<InheritedC> &cellBeforeColumnBorderC() const;
+  const ConstPtr<InheritedC> &cellAfterColumnBorderC() const;
+  const ConstPtr<InheritedC> &fractionBarC() const;
+  const char *storePublicId(const Char *, size_t, const Location &);
+  unsigned allocGlyphSubstTableUniqueId();
+  bool lookupNodeProperty(const StringC &, ComponentName::Id &);
+  bool debugMode() const;
+  bool dsssl2() const;
+  bool strictMode() const;
+  void setNodeLocation(const NodePtr &);
+  void setDefaultLanguage(Owner<Expression> &,unsigned part,const Location &);
+  ELObj *defaultLanguage() const;
+  bool defaultLanguageSet(unsigned &,Location &) const;
+  void compileDefaultLanguage();
+  void makeReadOnly(ELObj *);
+  ProcessingMode *lookupProcessingMode(const StringC &);
+  ProcessingMode *initialProcessingMode();
+  void addClassAttributeName(const StringC &name);
+  void addIdAttributeName(const StringC &name);
+  void installInitialValue(Identifier *, Owner<Expression> &);
+  void installExtensionInheritedC(Identifier *, const StringC &, const Location &);
+  void installExtensionCharNIC(Identifier *, const StringC &, const Location &);
+  void installExtensionFlowObjectClass(Identifier *, const StringC &, const Location &);
+  // Return 0 if an invalid number.
+  ELObj *convertNumber(const StringC &, int radix = 10);
+  bool convertCharName(const StringC &str, Char &c) const;
+  enum LexCategory {
+    lexLetter,                 // a - z A - Z
+    lexOtherNameStart,         // !$%&*/<=>?~_^:
+    lexAddNameStart,
+    lexDigit,                  // 0-9
+    lexOtherNumberStart,       // -+.
+    lexOther,
+    lexDelimiter,              // ;()"
+    lexWhiteSpace,
+    lexAddWhiteSpace
+  };
+  LexCategory lexCategory(Xchar);
+  void addStandardChar(const StringC &, const StringC &);
+  void addSdataEntity(const StringC &, const StringC &, const StringC &);
+  void addNameChar(const StringC &);
+  void addSeparatorChar(const StringC &);
+  void setCharRepertoire(const StringC &);
+private:
+  Interpreter(const Interpreter &); // undefined
+  void operator=(const Interpreter &); // undefined
+  void installSyntacticKeys();
+  void installPortNames();
+  void installCValueSymbols();
+  void installPrimitives();
+  void installPrimitive(const char *, PrimitiveObj *);
+  void installXPrimitive(const char *, const char *, PrimitiveObj *);
+  void installBuiltins();
+  void installUnits();
+  void installCharNames();
+  void installInheritedCs();
+  void installInheritedC(const char *, InheritedC *);
+  void installInheritedCProc(const Identifier *);
+  void installFlowObjs();
+  void installSdata();
+  void installNodeProperties();
+  void installCharProperties();
+  void compileInitialValues();
+  bool sdataMap(GroveString, GroveString, GroveChar &) const;
+  static bool convertUnicodeCharName(const StringC &str, Char &c);
+  bool convertToPattern(ELObj *obj, const Location &loc,
+                       bool isChild, IList<Pattern::Element> &list);
+  bool patternAddAttributeQualifiers(ELObj *obj,
+                                    const Location &loc,
+                                    Pattern::Element &elem);
+  enum {
+    convertAllowBoolean = 01,
+    convertAllowSymbol = 02,
+    convertAllowNumber = 04
+  };
+  ELObj *convertFromString(ELObj *, unsigned hints, const Location &);
+  ELObj *convertNumberFloat(const StringC &);
+  bool scanSignDigits(const StringC &str, size_t &i, int &n);
+  Unit *scanUnit(const StringC &str, size_t i, int &unitExp);
+
+  NilObj *theNilObj_;
+  TrueObj *theTrueObj_;
+  FalseObj *theFalseObj_;
+  ErrorObj *theErrorObj_;
+  UnspecifiedObj *theUnspecifiedObj_;
+  typedef PointerTable<SymbolObj *, StringC, Hash, SymbolObj>
+    SymbolTable;
+  SymbolTable symbolTable_;
+  NamedTable<Identifier> identTable_;
+  NamedTable<Unit> unitTable_;
+  HashTable<StringC,FunctionObj *> externalProcTable_;
+  Messenger *messenger_;
+  const FOTBuilder::Extension *extensionTable_;
+  unsigned partIndex_;
+  unsigned dPartIndex_;
+  int unitsPerInch_;
+  unsigned nInheritedC_;
+  GroveManager *groveManager_;
+  ProcessingMode initialProcessingMode_;
+  NamedTable<ProcessingMode> processingModeTable_;
+  SymbolObj *portNames_[nPortNames];
+  ELObj *cValueSymbols_[FOTBuilder::nSymbols];
+  HashTable<StringC, CharPart> namedCharTable_;
+  HashTable<StringC, CharPart> sdataEntityNameTable_;
+  HashTable<StringC, CharPart> sdataEntityTextTable_;
+  Vector<const Identifier *> initialValueNames_;
+  NCVector<Owner<Expression> > initialValueValues_;
+  size_t currentPartFirstInitialValue_;
+  StyleObj *initialStyle_;
+  StyleObj *borderTrueStyle_;
+  StyleObj *borderFalseStyle_;
+  ConstPtr<InheritedC> tableBorderC_;
+  ConstPtr<InheritedC> cellBeforeRowBorderC_;
+  ConstPtr<InheritedC> cellAfterRowBorderC_;
+  ConstPtr<InheritedC> cellBeforeColumnBorderC_;
+  ConstPtr<InheritedC> cellAfterColumnBorderC_;
+  ConstPtr<InheritedC> fractionBarC_;
+  class StringSet {
+  public:
+    StringSet();
+    const char *store(String<char> &);
+    static unsigned long hash(const String<char> &);
+    static inline const String<char> &key(const String<char> &str) { return str; }
+  private:
+    OwnerTable<String<char>, String<char>, StringSet, StringSet> table_;
+  };
+  StringSet publicIds_;
+  unsigned nextGlyphSubstTableUniqueId_;
+  AddressObj *addressNoneObj_;
+  NodeListObj *emptyNodeListObj_;
+  HashTable<StringC,int> nodePropertyTable_;
+  bool debugMode_;
+  bool dsssl2_;
+  bool strictMode_;
+  ELObj *defaultLanguage_;
+  Owner<Expression> defaultLanguageDef_;
+  unsigned defaultLanguageDefPart_;
+  Location defaultLanguageDefLoc_;
+  friend class Identifier;
+  HashTable<StringC, CharProp> charProperties_;
+};
+
+inline
+ErrorObj *Interpreter::makeError()
+{
+  return theErrorObj_;
+}
+
+inline
+bool Interpreter::isError(const ELObj *obj) const
+{
+  return obj == theErrorObj_;
+}
+
+inline
+bool Interpreter::isUnspecified(const ELObj *obj) const
+{
+  return obj == theUnspecifiedObj_;
+}
+
+inline
+FalseObj *Interpreter::makeFalse()
+{
+  return theFalseObj_;
+}
+
+inline
+TrueObj *Interpreter::makeTrue()
+{
+  return theTrueObj_;
+}
+
+inline
+NilObj *Interpreter::makeNil()
+{
+  return theNilObj_;
+}
+
+inline
+UnspecifiedObj *Interpreter::makeUnspecified()
+{
+  return theUnspecifiedObj_;
+}
+
+inline
+IntegerObj *Interpreter::makeInteger(long n)
+{
+  return new (*this) IntegerObj(n);
+}
+
+inline
+PairObj *Interpreter::makePair(ELObj *car, ELObj *cdr)
+{
+  return new (*this) PairObj(car, cdr);
+}
+
+inline
+CharObj *Interpreter::makeChar(Char c)
+{
+  return new (*this) CharObj(c);
+}
+
+inline
+AddressObj *Interpreter::makeAddressNone()
+{
+  return addressNoneObj_;
+}
+
+inline
+NodeListObj *Interpreter::makeEmptyNodeList()
+{
+  return emptyNodeListObj_;
+}
+
+inline
+ELObj *Interpreter::cValueSymbol(FOTBuilder::Symbol sym)
+{
+  return cValueSymbols_[sym];
+}
+
+inline
+SymbolObj *Interpreter::portName(PortName i)
+{
+  return portNames_[i];
+}
+
+inline
+ProcessingMode *Interpreter::initialProcessingMode()
+{
+  return &initialProcessingMode_;
+}
+
+inline
+int Interpreter::unitsPerInch() const
+{
+  return unitsPerInch_;
+}
+
+inline
+unsigned Interpreter::currentPartIndex() const
+{
+  return partIndex_;
+}
+
+inline
+KeywordObj *Interpreter::makeKeyword(const StringC &str)
+{
+  return new (*this) KeywordObj(lookup(str));
+}
+
+inline
+StyleObj *Interpreter::initialStyle() const
+{
+  return initialStyle_;
+}
+
+inline
+StyleObj *Interpreter::borderTrueStyle() const
+{
+  return borderTrueStyle_;
+}
+
+inline
+StyleObj *Interpreter::borderFalseStyle() const
+{
+  return borderFalseStyle_;
+}
+
+inline
+GroveManager *Interpreter::groveManager() const
+{
+  return groveManager_;
+}
+
+inline
+const ConstPtr<InheritedC> &Interpreter::tableBorderC() const
+{
+  return tableBorderC_;
+}
+
+inline
+const ConstPtr<InheritedC> &Interpreter::cellBeforeRowBorderC() const
+{
+  return cellBeforeRowBorderC_;
+}
+
+inline
+const ConstPtr<InheritedC> &Interpreter::cellAfterRowBorderC() const
+{
+  return cellAfterRowBorderC_;
+}
+
+inline
+const ConstPtr<InheritedC> &Interpreter::cellBeforeColumnBorderC() const
+{
+  return cellBeforeColumnBorderC_;
+}
+
+inline
+const ConstPtr<InheritedC> &Interpreter::cellAfterColumnBorderC() const
+{
+  return cellAfterColumnBorderC_;
+}
+
+inline
+const ConstPtr<InheritedC> &Interpreter::fractionBarC() const
+{
+  return fractionBarC_;
+}
+
+inline
+FunctionObj *Interpreter::lookupExternalProc(const StringC &pubid)
+{
+  FunctionObj *const *func = externalProcTable_.lookup(pubid);
+  return func ? *func : 0;
+}
+
+inline
+unsigned Interpreter::allocGlyphSubstTableUniqueId()
+{
+  return nextGlyphSubstTableUniqueId_++;
+}
+
+inline
+bool Interpreter::debugMode() const
+{
+  return debugMode_;
+}
+
+inline
+bool Interpreter::dsssl2() const
+{
+  return dsssl2_;
+}
+
+inline
+bool Interpreter::strictMode() const
+{
+  return strictMode_;
+}
+
+inline
+void Interpreter::makeReadOnly(ELObj *obj)
+{
+  if (dsssl2())
+    Collector::makeReadOnly(obj);
+}
+
+inline
+void Interpreter::addClassAttributeName(const StringC &name)
+{
+  classAttributeNames_.push_back(name);
+}
+
+inline
+void Interpreter::addIdAttributeName(const StringC &name)
+{
+  idAttributeNames_.push_back(name);
+}
+
+inline
+Interpreter::LexCategory Interpreter::lexCategory(Xchar c)
+{
+  return LexCategory(lexCategory_[c]);
+}
+
+inline
+bool Identifier::syntacticKey(SyntacticKey &key) const
+{
+  if (syntacticKey_ == notKey)
+    return 0;
+  key = syntacticKey_;
+  return 1;
+}
+
+inline
+void Identifier::setSyntacticKey(SyntacticKey key)
+{
+  syntacticKey_ = key;
+}
+
+inline
+bool Identifier::evaluated() const
+{
+  return value_ != 0;
+}
+
+inline
+const ConstPtr<InheritedC> &Identifier::inheritedC() const
+{
+  return inheritedC_;
+}
+
+inline
+bool Identifier::inheritedCDefined(unsigned &part, Location &loc) const
+{
+  if (inheritedC_.isNull())
+    return 0;
+  part = inheritedCPart_;
+  loc = inheritedCLoc_;
+  return 1;
+}
+
+inline
+bool Identifier::charNICDefined(unsigned &part, Location &loc) const
+{
+  if (!charNIC_)
+    return 0;
+  part = inheritedCPart_;
+  loc = inheritedCLoc_;
+  return 1;
+}
+
+inline
+void Identifier::setCharNIC(unsigned part,
+                           const Location &loc)
+{
+  charNIC_ = 1;
+  inheritedC_ = ConstPtr<InheritedC>(0);
+  inheritedCPart_ = part;
+  inheritedCLoc_ = loc;
+}
+
+inline
+void Identifier::setInheritedC(const ConstPtr<InheritedC> &ic, unsigned part,
+                              const Location &loc)
+{
+  inheritedC_ = ic;
+  inheritedCPart_ = part;
+  inheritedCLoc_ = loc;
+}
+
+inline
+void Identifier::setInheritedC(const ConstPtr<InheritedC> &ic)
+{
+  inheritedC_ = ic;
+  inheritedCPart_ = unsigned(-1);
+  inheritedCLoc_ = Location();
+}
+
+inline
+FlowObj *Identifier::flowObj() const
+{
+  return flowObj_;
+}
+
+inline
+bool Identifier::flowObjDefined(unsigned &part, Location &loc) const
+{
+  if (!flowObj_)
+    return 0;
+  part = flowObjPart_;
+  loc = flowObjLoc_;
+  return 1;
+}
+
+inline
+void Identifier::setFlowObj(FlowObj *fo)
+{
+  flowObj_ = fo;
+  flowObjPart_ = unsigned(-1);
+}
+
+inline
+void Identifier::setFlowObj(FlowObj *fo, unsigned part, const Location &loc)
+{
+  flowObj_ = fo;
+  flowObjPart_ = part;
+  flowObjLoc_ = loc;
+}
+
+inline
+ELObjPart::ELObjPart()
+: obj(0), defPart(0)
+{
+}
+
+inline
+ELObjPart::ELObjPart(ELObj *o, unsigned p)
+: obj(o), defPart(p)
+{
+}
+
+inline
+void ELObjPart::operator=(const ELObjPart &x)
+{
+  obj = x.obj;
+  defPart = x.defPart;
+}
+
+inline
+bool ELObjPart::operator==(const ELObjPart &x) const
+{
+  return defPart == x.defPart && obj && x.obj && ELObj::eqv(*obj, *x.obj);
+}
+
+inline
+bool ELObjPart::operator!=(const ELObjPart &x) const
+{
+  return !(*this == x);
+}
+
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not Interpreter_INCLUDED */
diff --git a/style/InterpreterMessages.msg b/style/InterpreterMessages.msg
new file mode 100644 (file)
index 0000000..4bece48
--- /dev/null
@@ -0,0 +1,158 @@
+!cxx
+E0+unexpectedEof++unexpected end of file
+E0+invalidChar++invalid character
+E0+unknownHash++invalid character after '#'
+E1+unknownNamedConstant++unknown #! named constant %1
+E1+unexpectedToken++unexpected token %1
+E0+unterminatedString++string with no closing quote
+E0+missingCloseParen++missing closing parenthesis
+E1+invalidNumber++invalid number %1
+E1+invalidAfiiGlyphId++invalid AFII glyph identifier %1
+E1+callNonFunction++call of non-function object %1
+E0+tooManyArgs++too many arguments for function
+E0+oddKeyArgs++odd number of keyword/value arguments
+E0+missingArg++missing argument for function call
+E1+syntacticKeywordAsVariable++syntactic keyword %1 used as variable
+E1+undefinedVariableReference++reference to undefined variable %1
+E1+badCharName++no character with name %1
+E1+keywordNotAllowedCall++syntactic keyword %1 not valid in call position
+E1+symbolRequired++symbol required (got %1)
+E1+unknownTopLevelForm++unknown top level form %1
+E1+badModeForm++bad form %1 in mode group
+E1+duplicateDefinition++identifier %1 already defined in same part+first definition was here
+E1+identifierLoop++loop in specification of value of %1
+E0+outOfRange++argument out of range
+E1+unitLoop++loop in specification of value of unit %1
+E1+badUnitDefinition++bad value specified for unit %1
+E1+duplicateUnitDefinition++unit %1 already defined in same part+first definition was here
+E1+undefinedQuantity++quantity %1 undefined
+E0+incompatibleDimensions++incompatible dimensions
+E3+notABoolean++%2 argument for primitive %1 of wrong type: %3 not a boolean
+E3+notAPair++%2 argument for primitive %1 of wrong type: %3 not a pair
+E3+notAList++%2 argument for primitive %1 of wrong type: %3 not a list
+E3+notASymbol++%2 argument for primitive %1 of wrong type: %3 not a symbol
+E3+notAString++%2 argument for primitive %1 of wrong type: %3 not a string
+E3+notAStringOrSymbol++%2 argument for primitive %1 of wrong type: %3 not a string or symbol
+E3+notASymbolOrString++%2 argument for primitive %1 of wrong type: %3 neither a string not a symbol
+E3+notAChar++%2 argument for primitive %1 of wrong type: %3 not a char
+E3+notATimeString++%2 argument for primitive %1 of wrong type: %3 not an ISO8601 time string
+E3+notAStyle++%2 argument for primitive %1 of wrong type: %3 not a style
+E3+notAnExactInteger++%2 argument for primitive %1 of wrong type: %3 not an exact integer
+E3+notAQuantity++%2 argument for primitive %1 of wrong type: %3 not a quantity
+E3+notAColorSpace++%2 argument for primitive %1 of wrong type: %3 not a color-space
+E3+notANumber++%2 argument for primitive %1 of wrong type: %3 not a number
+E3+notASosofo++%2 argument for primitive %1 of wrong type: %3 not a sosofo
+E3+notAnOptSingletonNode++%2 argument for primitive %1 of wrong type: %3 not an optional singleton node list
+E3+notASingletonNode++%2 argument for primitive %1 of wrong type: %3 not a singleton node list
+E3+notANodeList++%2 argument for primitive %1 of wrong type: %3 not a node list
+E3+notANamedNodeList++%2 argument for primitive %1 of wrong type: %3 not a named node list
+E3+notALengthSpec++%2 argument for primitive %1 of wrong type: %3 not a length or length-spec
+E3+notAQuantityOrLengthSpec++%2 argument for primitive %1 of wrong type: %3 not a quantity or length-spec
+E3+notAPriority++%2 argument for primitive %1 of wrong type: %3 not an integer or the symbol "force"
+E3+notAPattern++%2 argument for primitive %1 of wrong type: %3 not a valid element matching pattern
+E3+notAnAddress++%2 argument for primitive %1 of wrong type: %3 not an address
+E3+notAGlyphId++%2 argument for primitive %1 of wrong type: %3 not a glyph-id
+E3+notAGlyphSubstTable++%2 argument for primitive %1 of wrong type: %3 not a glyph-subst-table
+E3+notAGlyphIdPairList++%2 argument for primitive %1 of wrong type: %3 not a list of pairs of glyph-ids
+E3+notAProcedure++%2 argument for primitive %1 of wrong type: %3 not a procedure
+E3+notAVector++%2 argument for primitive %1 of wrong type: %3 not a vector
+E0+duplicateRootRule++root rule already defined in same part with same importance+first definition was here
+E1+duplicateInitialValue++initial value already declared for characteristic %1 in same part+first declaration was here
+E1+invalidStyleKeyword++%1 is not a valid keyword in a style expression
+E2+invalidMakeKeyword++%1 is not a valid keyword in a make expression for flow object class %2
+E1+unknownFlowObjectClass++%1 is not the name of any flow object class
+E1+atomicContent++content expression cannot be specified in make expression for atomic flow object class %1
+E0+labelNotASymbol++value for "label:" not a symbol
+E1+badConnection++no port for label %1
+E0+badContentMap++invalid content map
+E1+contentMapBadPort++content map references non-existent port %1
+E1+invalidCharacteristicValue++invalid value for %1 characteristic
+E0+condFail++no clause in cond expression matched
+E1+caseFail++no clause in case expression matched %1
+E1+caseElse++expected "else" not %1
+E0+caseUnresolvedQuantities++sorry, cannot handle unresolvable quantities in datums in case expression
+E1+errorProc++%1
+E0+divideBy0++division by zero
+E1+invalidKeyArg++procedure does not have %1 keyword argument
+E0+keyArgsNotKey++argument not a keyword
+E0+oneBody++support for more than one style-specification-body not yet implemented
+E0+specNotArc++specification document does not have the DSSSL architecture as a base architecture
+E0+noStyleSpec++specification document did not contain a style-specification-body element
+E1+unknownCharName++unknown character name %1
+E0+noCurrentNode++attempt to use current node when there is none
+E0+noCurrentProcessingMode++attempt to process node in illegal context
+E0+invalidRadix++radix must be 2, 8, 10 or 16
+E0+sosofoContext++this context requires a sosofo
+E0+styleContext++this context requires a style object
+E0+notInCharacteristicValue++procedure can only be used in evaluation of characteristic value
+E1+expressionNotImplemented++sorry, %1 expression not implemented
+E1+colorArgCount++%1 color requires three arguments
+E1+colorArgType++arguments for %1 color must be numbers
+E1+colorArgRange++arguments for %1 color must be in the range 0 to 1
+E1+colorProcResType++result of procedure in %1 color must be a number
+E1+unknownColorSpaceFamily++unknown color-space family %1
+E1+colorSpaceNoArgs++%1 color-space family does not take any arguments
+E1+colorSpaceArgError++invalid parameters for %1 color-space family
+E1+notABuiltinInheritedC++%1 is not a pre-defined inherited characteristic
+E1+invalidNumberFormat++invalid number format %1
+E1+invalidPublicIdChar++invalid character %1 in public identifier
+I1+debug++debug %1
+E0+useLoop++circular use of specification parts
+E1+missingPart++no style-specification or external-specification with ID %1
+E0+noParts++document did not contain any style-specifications or external-specifications
+E0+tableCellOutsideTable++table-cell flow object not inside a table
+E0+tableRowOutsideTable++table-row flow object not inside a table
+E1+noNodePropertyValue++no value for node property %1
+E0+returnNotNodeList++value returned by procedure was not a node-list
+I0+stackTrace++called from here
+I1+stackTraceEllipsis++called from here...(%1 calls omitted)
+E0+processNodeLoop++node processing loop detected
+E0+spliceNotList++unquote-splicing expression does not evaluate to a list
+E0+readOnly++object is read-only
+E1+topLevelAssignment++assignment to top-level variable %1
+E0+continuationDead++invalid call to continuation
+E0+patternEmptyGi++empty generic identifier in pattern
+E0+patternNotList++pattern is not a list
+E1+patternBadGi++%1 cannot be used as a generic identifier in a pattern
+E1+patternBadMember++%1 cannot occur in a pattern
+E0+patternMissingQualifierValue++value missing for qualifier in pattern
+E1+patternUnknownQualifier++unknown pattern qualifier %1
+E2+patternBadQualifierValue++bad value %1 for %2 qualifier in pattern
+E0+patternChildRepeat++repeat qualifier not allowed inside children qualifier
+E0+patternBadAttributeQualifier++bad value for attributes qualifier in pattern
+E1+ambiguousStyle++characteristic %1 applied in style rule with same specificity+other style rule is here
+E0+ambiguousMatch++node matches more than one pattern with the same specificity
+E1+uninitializedVariableReference++reference to uninitialized variable %1
+E1+actualLoop++circular use of actual value of characteristic %1
+E1+duplicateCharacteristic++characteristic %1 already defined in same part+first definition was here
+E1+duplicateFlowObjectClass++flow object class %1 already defined in same part+first definition was here
+E1+undefinedMode++mode %1 not defined
+E1+duplicateCharName++duplicate character name %1
+E1+duplicateSdataEntityName++duplicate SDATA entity name %1
+E1+duplicateSdataEntityText++duplicate SDATA entity text %1
+W0+unsupportedDeclaration++unsupported declaration will be ignored
+W1+unsupportedCharRepertoire++unsupported character repertoire %1 will be ignored
+E0+badDeclaration++error in declaration element
+E1+duplicateDeclaration++duplicate declaration element (%1)
+E1+invalidIdentifier++%1 is not a valid identifier
+E0+badLanguageDefinition++error in language definition
+E0+noCurrentLanguage++no current language
+E3+notALanguage++%2 argument for primitive %1 of wrong type: %3 not a language
+E3+notAPositiveInteger++%2 argument for primitive %1 of wrong type: %3 not a po
+E3+notAnInteger++%2 argument for primitive %1 of wrong type: %3 not an integer
+E3+notAKeyword++%2 argument for primitive %1 of wrong type: %3 not a keyword
+E3+notAnAlist++%2 argument for primitive %1 of wrong type: %3 not an alist
+E3+notACharList++%2 argument for primitive %1 of wrong type: %3 not a list of characters
+E3+lengthError++%2 argument for primitive %1 has wrong length
+W1+noExactRepresentation++quantity %1 can't be represented exactly
+E0+duplicateDefLangDecl++default language already declared in this part+first declaration was here
+E1+defLangDeclRequiresLanguage++%1 not a language as required in a default-language-declaration
+E1+invalidUnitName++%1 is not a valid unit name
+E1+invalidCharName++%1 is not a valid character name
+E1+invalidCharNumber++%1 is not a valid character number
+E1+unknownCharProperty++unknown character property %1
+E0+badAddCharProperty++error in character property declaration
+E1+duplicateCharPropertyDecl++duplicate definition for character property %1+first definition was here
+E2+duplicateAddCharProperty++duplicate character property declaration %1 for character %2
+E0+returnNotSosofo++value returned by procedure was not a sosofo
+E0+varCharPropertyExprUnsupported++variable expressions for character property values currently not supported
diff --git a/style/LangObj.cxx b/style/LangObj.cxx
new file mode 100644 (file)
index 0000000..bf3ee52
--- /dev/null
@@ -0,0 +1,503 @@
+// Copyright (c) 1998, 1999 Matthias Clasen
+// See the file copying.txt for copying permission.
+
+#include "stylelib.h"
+#include "LangObj.h"
+#include "HashTable.h"
+#include "CharMap.h"
+#include "constant.h"
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <string.h>
+
+#ifdef SP_HAVE_LOCALE
+#ifdef SP_HAVE_WCHAR
+#include <wchar.h>
+#include <wctype.h>
+#include <locale.h>
+#endif
+#endif
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+#ifdef SP_HAVE_LOCALE
+#ifdef SP_HAVE_WCHAR
+# ifndef __GLIBC__
+static char *strdup(const char *s)
+{
+  size_t l = strlen(s) + 1;
+  return (char *) memcpy ((char *) malloc (sizeof (char) * l), s, l);
+}
+# endif /* __GLIBC__ */
+
+static char *stringify(const StringC &s)
+{
+  char *r = (char *) malloc (sizeof(char)*(s.size() + 1));
+  for (size_t i = 0; i < s.size(); i++) 
+    r[i] = char(s[i]);
+  r[s.size()] = 0;
+  return r;
+}
+
+// FIXME this is unneeded if SP_WCHAR_IS_USHORT
+static wchar_t *wchartify(const StringC &s)
+{
+  wchar_t *r = (wchar_t *) malloc (sizeof(wchar_t)*(s.size() + 1));
+  for (size_t i = 0; i < s.size(); i++) 
+    r[i] = wchar_t(s[i]);
+  r[s.size()] = 0;
+  return r;
+}
+
+char *RefLangObj::localeName(const StringC &lang, const StringC &country)
+{
+  char *p;
+
+  p = (char *) malloc (sizeof(char)*(lang.size() + country.size() + 2));
+  size_t i;
+  for (i = 0; i < lang.size(); i++)
+    p[i] = tolower(char(lang[i]));
+  p[i++] = '_';
+  for (size_t j = 0; j < country.size(); j++, i++)
+    p[i] = toupper(char(country[j]));
+  p[i] = 0;
+  return p;
+}
+
+bool RefLangObj::supportedLanguage(const StringC &lang, const StringC &country)
+{
+  char *p = RefLangObj::localeName(lang, country);
+  char *old = strdup(setlocale(LC_ALL, 0));
+  bool res = (setlocale(LC_ALL, p) != 0);
+  setlocale(LC_ALL, old);
+  free (p); free (old);
+  return res;
+}
+
+RefLangObj::RefLangObj(const StringC &lang, const StringC &country) 
+{
+  char *p = localeName(lang, country);
+  oldLocale_ = strdup(setlocale(LC_ALL, 0));  
+  newLocale_ = strdup(setlocale(LC_ALL, p));
+  free (p);
+}
+
+RefLangObj::~RefLangObj() 
+{
+  free (oldLocale_);
+  free (newLocale_);
+}
+
+LanguageObj *RefLangObj::asLanguage()
+{
+  return this;
+}
+
+Char RefLangObj::toUpper(const Char c) const
+{
+  setlocale(LC_ALL, newLocale_);  
+  Char uc = towupper(c);
+  setlocale(LC_ALL, oldLocale_);  
+  return uc;
+}
+
+Char RefLangObj::toLower(const Char c) const
+{
+  setlocale(LC_ALL, newLocale_);  
+  Char lc = towlower(c);
+  setlocale(LC_ALL, oldLocale_);  
+  return lc;
+}
+
+bool RefLangObj::areEquivalent(const StringC &r, const StringC &s, 
+                              const Char l) const
+{
+  setlocale(LC_ALL, newLocale_);  
+  wchar_t *rr = wchartify(r);
+  unsigned rn = wcsxfrm (0, rr, 0);
+  wchar_t *rx = (wchar_t *) malloc (sizeof(wchar_t)*rn); 
+  wcsxfrm(rx, rr, rn);
+  wchar_t *ss = wchartify(s);
+  unsigned sn = wcsxfrm (0, ss, 0);
+  wchar_t *sx = (wchar_t *) malloc (sizeof(wchar_t)*sn);
+  wcsxfrm(sx, ss, sn);
+  bool res;
+  unsigned k = 0;
+  for (unsigned i = 0; ; i++) {
+    if (rx[i] != sx[i]) { res = 0; break; } 
+    if (rx[i] == 1) k++;
+    if (k == l || rx[i] == 0) { res = 1; break; } 
+  }
+  free (rr); free (ss); free (rx); free (sx); 
+  setlocale(LC_ALL, oldLocale_);  
+  return res;
+}
+
+bool RefLangObj::isLess(const StringC &r, const StringC &s) const
+{
+  setlocale(LC_ALL, newLocale_);  
+  wchar_t *rr = wchartify(r);
+  wchar_t *ss = wchartify(s);
+  int res = wcscoll(rr, ss);
+  free (rr); free (ss);
+  setlocale(LC_ALL, oldLocale_);  
+  return (res < 0);
+}
+
+bool RefLangObj::isLessOrEqual(const StringC &r, const StringC &s) const
+{
+  setlocale(LC_ALL, newLocale_);  
+  wchar_t *rr = wchartify(r);
+  wchar_t *ss = wchartify(s);
+  int res = wcscoll(rr, ss);
+  free (rr); free (ss);
+  setlocale(LC_ALL, oldLocale_);  
+  return (res <= 0);
+}
+#endif /* SP_HAVE_WCHAR */
+#endif /* SP_HAVE_LOCALE */
+
+class LangBuildData {
+public:
+  LangBuildData() : currentpos(0) {};
+  HashTable<StringC, StringC> order;
+  Char currentpos;
+  HashTable<StringC, StringC> ce; 
+  HashTable<StringC, Char> syms;  
+};
+  
+  class LangData {
+  public:
+    LangData();
+    LangObj::LevelSort level[20]; // FIXME  
+    Char levels;
+    HashTable<StringC, StringC> weights;   
+    HashTable<StringC, Char> collate; 
+    CharMap<Char> toupper;
+    CharMap<Char> tolower;
+  };
+
+LangData::LangData() 
+{
+  toupper.setAll(charMax);
+  tolower.setAll(charMax);
+  levels = 0;
+}
+
+void LangObj::addMultiCollatingElement(const StringC &sym, 
+                                           const StringC &str)
+{
+  buildData_->ce.insert(sym, str); 
+}
+
+void LangObj::addCollatingSymbol(const StringC &sym)
+{
+  buildData_->syms.insert(sym, charMax); 
+}
+
+void LangObj::addLevel(const LevelSort &sort) 
+{
+  data_->level[data_->levels++] = sort;
+}
+
+void LangObj::addDefaultPos()
+{
+  StringC empty;
+  addCollatingPos(empty);
+}
+
+bool LangObj::addCollatingPos(const StringC &sym)
+{
+  if (!buildData_->ce.lookup(sym) && !buildData_->syms.lookup(sym)) 
+    if (sym.size() <= 1) 
+      buildData_->ce.insert(sym, sym);
+    else 
+      return 0;
+  buildData_->order.insert(StringC(&buildData_->currentpos, 1), sym);
+  buildData_->currentpos++;
+  return 1;
+}
+
+bool LangObj::addLevelWeight(const Char l, const StringC &w)
+{
+  if (!buildData_->ce.lookup(w) && !buildData_->syms.lookup(w)) 
+    if (w.size() <= 1) 
+      buildData_->ce.insert(w, w); 
+    else 
+      return 0;
+  StringC key;
+  key.resize(3);
+  key[0] = buildData_->currentpos - 1;
+  key[1] = l;
+  for (key[2] = 0; buildData_->order.lookup(key); key[2]++) ; 
+  buildData_->order.insert(key, w);
+  return 1;
+}
+
+void LangObj::addToupper(const Char lc, const Char uc)
+{
+  data_->toupper.setChar(lc, uc);
+}
+
+void LangObj::addTolower(const Char uc, const Char lc)
+{
+  data_->tolower.setChar(uc, lc);
+}
+
+LangObj::LangObj() 
+{
+  buildData_ = new LangBuildData;
+  data_ = new LangData;
+}
+
+LangObj::~LangObj()
+{
+  if (buildData_) delete buildData_;
+  if (data_) delete data_;
+}
+
+bool LangObj::compile()
+{
+  const Char *col;
+  StringC key, val, data;
+  StringC empty;
+  const StringC *match, *match2;
+
+  data_->collate.insert(empty, buildData_->currentpos); 
+  key.resize(1);
+  for (key[0] = 0; key[0] < buildData_->currentpos; key[0]++) {
+    match = buildData_->order.lookup(key);
+    if (match == 0) 
+      return 0;
+    match2 = buildData_->ce.lookup(*match);
+    if (match2 == 0) 
+      buildData_->syms.insert(*match, key[0]);
+    else  
+      data_->collate.insert(*match2, key[0]);
+  }
+  key.resize(2);
+  data.resize(3);
+  for (data[0] = 0; data[0] < buildData_->currentpos; data[0]++) {
+    key[0] = data[0];
+    for (data[1] = 0; data[1] < levels(); data[1]++) {
+      key[1] = data[1];
+      val.resize(0);
+      for (data[2] = 0; buildData_->order.lookup(data); data[2]++) {
+        match = buildData_->order.lookup(data);
+       if (match == 0) 
+         return 0;
+       match2 = buildData_->ce.lookup(*match);
+       if (match2 == 0) 
+         col = buildData_->syms.lookup(*match);
+       else 
+         col = data_->collate.lookup(*match2);
+       if (col == 0)  
+         return 0;
+       val += *col;
+      }
+      data_->weights.insert(key, val);
+     }
+  }
+  delete buildData_;
+  buildData_ = 0;
+  return 1;
+}
+
+LanguageObj *LangObj::asLanguage()
+{
+  return this;
+}
+
+bool LangObj::areEquivalent(const StringC &r, const StringC &s,
+                               const Char k) const
+{
+  return (compare(r, s, k) == 0);
+}
+
+int LangObj::compare(const StringC &rr, const StringC &ss, 
+                        const Char k) const
+{
+  StringC rc = asCollatingElts(rr);
+  StringC sc = asCollatingElts(ss);
+  for (Char l = 0; (l < k) && (l < levels()); l++) {
+    StringC r = atLevel(rc, l);
+    StringC s = atLevel(sc, l);
+    for (size_t i = 0; (i < r.size()) || (i < s.size()); i++) {
+      if (i == r.size()) return -1;
+      if (i == s.size()) return 1;
+      if (r[i] < s[i]) return -1;
+      if (r[i] > s[i]) return 1;
+    }
+  }
+  return 0;
+}
+
+StringC LangObj::asCollatingElts(const StringC &s) const
+{
+  StringC res, key, empty;
+  unsigned i, j;
+  int col;
+  const Char *c, *def;
+  Char def_val;
+
+  def = data_->collate.lookup(empty); 
+  def_val = (def == 0) ? charMax : *def;  
+  for (i = 0; i < s.size(); i = j) {
+    col = def_val;
+    key = empty;
+    for (j = i; j < s.size(); j++) {
+      key += s[j]; 
+      c = data_->collate.lookup(key);
+      if (c == 0) 
+        break;
+      col = *c;
+    }
+    if (i == j) 
+      // if we get here, s[j] is a single `unknown' char and 
+      // we better not reconsider it to avoid an infinite loop. 
+      j++;
+    res += col;
+  }
+  return res;
+}
+
+StringC LangObj::atLevel(const StringC &s, const Char l) const
+{
+  StringC cols, res, key;
+  const StringC *w;
+
+  if (data_->level[l].backward) 
+    for (int i = s.size() - 1; i >= 0; i--) 
+      cols += s[i];
+  else 
+    cols = s;
+  key.resize(2);
+  key[1] = l;
+  for (size_t i = 0; i < cols.size(); i++) {
+    key[0] = cols[i];
+    w = data_->weights.lookup(key);
+    if (w == 0) 
+      return res;
+    if (data_->level[l].backward) 
+      for (int j = w->size() - 1; j >= 0; j--) {
+       if (data_->level[l].position) 
+          res += i; 
+       res += (*w)[j]; 
+      }
+    else  // forward
+      for (int j = 0; j < w->size(); j++) {
+       if (data_->level[l].position) 
+          res += i; 
+       res += (*w)[j]; 
+      }
+  }
+  return res;
+}
+
+Char LangObj::toUpper(const Char c) const
+{
+  Char uc = data_->toupper[c];
+  return (uc == charMax) ? c : uc;
+}
+
+Char LangObj::toLower(const Char c) const
+{
+  Char lc = data_->tolower[c];
+  return (lc == charMax) ? c : lc;
+}
+
+unsigned LangObj::levels() const
+{
+  return data_->levels;
+}
+
+bool LangObj::isLess(const StringC &r, const StringC &s) const
+{
+  return (compare(r, s, levels()) < 0);
+}
+
+bool LangObj::isLessOrEqual(const StringC &r, const StringC &s) const
+{
+  return (compare(r, s, levels()) <= 0);
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+/*
+
+Notes on the LangObj class:
+
+All data is in the classes LanguageData and 
+LanguageBuildData. The LanguageBuildData is only
+needed until we call LanguageObj::compile() and
+is freed afterwards.
+
+Once a LangObj is built, we use the functions isLess(), 
+isLessOrEqual(), toUpper(), toLower() and areEquivalent()
+to implement the language-dependent functions of the
+expression language. 
+
+The LangBuildData stores a map symbols --> strings
+for multi-collating-elements (ce) and a second map
+positions --> symbols (order). These are incrementally 
+filled up while parsing a define-language expression.
+order also stores a map 
+
+  positions x levels x weight-numbers --> weights 
+
+(there may be more than one weight for a given position 
+and level). The empty string is used as key for the 
+default entry in syms.
+
+Compilation is done in two phases: In the first phase,
+we build the syms and collate maps (syms maps
+symbols --> positions and collate maps 
+multi-collating-elements --> positions). This is achived
+by inverting the corresponding part of order.
+
+In the next phase, the weights map is built. It maps
+positions x levels x weight-numbers --> positions.
+
+Comparing two string works in three phases: First, 
+the strings are converted to positions (done by 
+asCollatingElts()), then we are comparing one level
+at a time. For this, the strings of positions are
+converted into strings of weights. How this is done
+depends on the level.
+Finally the strings of weights are lexicographically
+compared.
+
+Notes on the RefLangObj class:
+
+It uses the underlying POSIX locale system and wchar_t. At least
+with GNU libc, wchar_t is always encoded as ISO-10646 UCS4, thus 
+the Char and wchar_t codes of a character have the same value. But
+since sizeof(wchar_t) = 4 != 2 = sizeof(Char), we have to do ugly 
+conversions (at least on i386-linux-glibc2) to be able to use the 
+libc wide character routines wcscoll() and wcsxfrm(). 
+
+To create a language by reference to a locale, use the external
+procedure with pubid UNREGISTERED::OpenJade//Procedure::language 
+
+(language lang country)
+
+where lang and country are symbols or strings like the ones used 
+for the language: and country: characteristics of the paragraph FO. 
+If the locale is not supported, language returns #f. If Jade is 
+compiled without locale support (!SP_HAVE_LOCALE) language *always* 
+returns #f.
+
+The implementation of string-equiv? depends on the fact that
+wcsxfrm() returns a 0-terminated string of integers where the 
+substrings for each level are separated by 1. This is true for
+glibc, but I don't know if it is universally true.
+
+*/
diff --git a/style/LangObj.h b/style/LangObj.h
new file mode 100644 (file)
index 0000000..50c07dd
--- /dev/null
@@ -0,0 +1,99 @@
+// Copyright (c) 1998, 1999 Matthias Clasen
+// See the file copying.txt for copying permission.
+
+#ifndef LangObj_INCLUDED
+#define LangObj_INCLUDED 1
+
+#include "config.h"
+#include "ELObj.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class LanguageObj : public ELObj {
+public:
+  virtual Char toUpper(const Char) const = 0;
+  virtual Char toLower(const Char) const = 0;
+  virtual bool areEquivalent(const StringC &, const StringC &, const Char) const = 0;
+  virtual bool isLess(const StringC &, const StringC &) const = 0;
+  virtual bool isLessOrEqual(const StringC &, const StringC &) const = 0;
+};
+
+#ifdef SP_HAVE_LOCALE
+#ifdef SP_HAVE_WCHAR
+class RefLangObj : public LanguageObj {
+ public:
+  static bool supportedLanguage(const StringC &, const StringC &);
+  RefLangObj(const StringC &, const StringC &);
+  ~RefLangObj();
+
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  LanguageObj *asLanguage();
+
+  Char toUpper(const Char) const;
+  Char toLower(const Char) const;
+  bool areEquivalent(const StringC &, const StringC &, const Char) const;
+  bool isLess(const StringC &, const StringC &) const;
+  bool isLessOrEqual(const StringC &, const StringC &) const;
+ private:
+  static char *localeName(const StringC &, const StringC &);
+  char *oldLocale_;
+  char *newLocale_;
+};
+#endif /* SP_HAVE_WCHAR */
+#endif /* SP_HAVE_LOCALE */ 
+
+class LangBuildData;
+class LangData;
+
+class LangObj : public LanguageObj {
+ public:
+  struct LevelSort {
+    unsigned int forward  :1;
+    unsigned int backward :1;
+    unsigned int position :1;
+  };
+
+  LangObj();
+  ~LangObj();
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  LanguageObj *asLanguage();
+  unsigned levels() const;
+
+  Char toUpper(const Char) const;
+  Char toLower(const Char) const;
+  bool areEquivalent(const StringC &, const StringC &, const Char) const;
+  bool isLess(const StringC &, const StringC &) const;
+  bool isLessOrEqual(const StringC &, const StringC &) const;
+
+ private:
+  void addMultiCollatingElement(const StringC &, const StringC &);
+  void addCollatingSymbol(const StringC &);
+  void addLevel(const LevelSort &);
+  void addDefaultPos();
+  bool addCollatingPos(const StringC &);
+  bool addLevelWeight(const Char, const StringC &);
+  void addToupper(const Char, const Char);
+  void addTolower(const Char, const Char);
+
+  bool compile();
+
+  int compare(const StringC &, const StringC &, const Char) const;
+  StringC asCollatingElts(const StringC &) const;
+  StringC atLevel(const StringC &, const Char) const;
+
+  LangBuildData *buildData_;
+  LangData *data_;
+  friend class SchemeParser;
+};
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not LangObj_INCLUDED */
diff --git a/style/MacroFlowObj.cxx b/style/MacroFlowObj.cxx
new file mode 100644 (file)
index 0000000..7d51972
--- /dev/null
@@ -0,0 +1,196 @@
+// Copyright (c) 1997 James Clark
+// See the file copying.txt for copying permission.
+
+#include "stylelib.h"
+#include "MacroFlowObj.h"
+#include "VM.h"
+#include "Insn2.h"
+#include "Insn.h"
+#include "Expression.h"
+#include "Interpreter.h"
+#include "ProcessContext.h"
+#include "macros.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+MacroFlowObj::MacroFlowObj(Vector<const Identifier *> &nics,
+                          NCVector<Owner<Expression> > &inits,
+                          const Identifier *contentsId,
+                          Owner<Expression> &body)
+: def_(new Definition(nics, inits, contentsId, body))
+{
+  size_t n = def_->nics().size();
+  charicVals_ = new ELObj *[n];
+  for (size_t i = 0; i < n; i++)
+    charicVals_[i] = 0;
+}
+
+MacroFlowObj::MacroFlowObj(const MacroFlowObj &obj)
+: CompoundFlowObj(obj), def_(obj.def_)
+{
+  size_t n = def_->nics().size();
+  charicVals_ = new ELObj *[n];
+  for (size_t i = 0; i < n; i++)
+    charicVals_[i] = obj.charicVals_[i];
+}
+
+MacroFlowObj::~MacroFlowObj()
+{
+  delete [] charicVals_;
+}
+
+FlowObj *MacroFlowObj::copy(Collector &c) const
+{
+  return new (c) MacroFlowObj(*this);
+}
+
+CompoundFlowObj *MacroFlowObj::asCompoundFlowObj()
+{
+  if (def_->isCompound())
+    return this;
+  else
+    return 0;
+}
+
+bool MacroFlowObj::hasNonInheritedC(const Identifier *id) const
+{
+  const Vector<const Identifier *> &nics = def_->nics();
+  for (size_t i = 0; i < nics.size(); i++)
+    if (nics[i] == id)
+      return 1;
+  return 0;
+}
+
+void MacroFlowObj::setNonInheritedC(const Identifier *id, ELObj *obj, const Location &, Interpreter &)
+{
+  const Vector<const Identifier *> &nics = def_->nics();
+  for (size_t i = 0;; i++) {
+    if (nics[i] == id) {
+      charicVals_[i] = obj;
+      return;
+    }
+  }
+}
+
+void MacroFlowObj::traceSubObjects(Collector &c) const
+{
+  size_t n = def_->nics().size();
+  for (size_t i = 0; i < n; i++)
+    c.trace(charicVals_[i]);
+  CompoundFlowObj::traceSubObjects(c);
+}
+
+class EmptyStyleObj : public StyleObj {
+public:
+  void appendIter(StyleObjIter &) const { }
+};
+
+void MacroFlowObj::unpack(VM &vm)
+{
+  size_t n = def_->nics().size();
+  vm.needStack(n + 1 + def_->isCompound());
+  for (size_t i = 0; i < n; i++)
+    *vm.sp++ = charicVals_[i];
+  if (def_->isCompound()) {
+    ELObj *tem = content();
+    if (!tem)
+      tem = new (*vm.interp) ProcessChildrenSosofoObj(vm.interp->initialProcessingMode());
+    *vm.sp++ = tem;
+  }
+}
+
+void MacroFlowObj::processInner(ProcessContext &context)
+{
+  FOTBuilder &fotb = context.currentFOTBuilder();
+  fotb.startSequence();
+  def_->process(context, this);
+  fotb.endSequence();
+}
+
+MacroFlowObj::Definition::Definition(Vector<const Identifier *> &charics,
+                                    NCVector<Owner<Expression> > &charicInits,
+                                    const Identifier *contentsId,
+                                    Owner<Expression> &body)
+: contentsId_(contentsId)
+{
+  charics.swap(charics_);
+  charicInits.swap(charicInits_);
+  charicInits_.resize(charics_.size());
+  body.swap(body_);
+}
+
+void MacroFlowObj::Definition::process(ProcessContext &context,
+                                      MacroFlowObj *macro)
+{
+  VM &vm = context.vm();
+  Interpreter &interp = *vm.interp;;
+  if (code_.isNull())
+    compile(interp);
+  StyleStack *saveStyleStack = vm.styleStack;
+  vm.styleStack = &context.currentStyleStack();
+  unsigned saveSpecLevel = vm.specLevel;
+  vm.specLevel = vm.styleStack->level();
+  Vector<size_t> dep;
+  vm.actualDependencies = &dep;
+  ELObj *obj = context.vm().eval(code_.pointer(), 0, macro);
+  vm.styleStack = saveStyleStack;
+  vm.specLevel = saveSpecLevel;
+  if (!interp.isError(obj)) {
+    ELObjDynamicRoot protect(interp, obj);
+    ((SosofoObj *)obj)->process(context);
+  }
+}
+
+class UnpackMacroFlowObjInsn : public Insn {
+public:
+  UnpackMacroFlowObjInsn(InsnPtr next) : next_(next) { }
+  const Insn *execute(VM &vm) const {
+    ((MacroFlowObj *)*--vm.sp)->unpack(vm);
+    return next_.pointer();
+  }
+private:
+  InsnPtr next_;
+};
+
+void MacroFlowObj::Definition::compile(Interpreter &interp)
+{
+  InsnPtr result;
+  result = new CheckSosofoInsn(body_->location(), result);
+  int nPush = charics_.size() + (contentsId_ != 0);
+  result = PopBindingsInsn::make(nPush, result);
+  BoundVarList frameVars;
+  for (size_t i = 0; i < charics_.size(); i++) {
+    if (i > 0 && charicInits_[i])
+      charicInits_[i]->markBoundVars(frameVars, 0);
+    frameVars.append(charics_[i], 0);
+  }
+  if (contentsId_)
+    frameVars.append(contentsId_, 0);
+  body_->markBoundVars(frameVars, 0);
+  result = Expression::optimizeCompile(body_, interp,
+                                      Environment(frameVars, BoundVarList()),
+                                      nPush, result);
+  for (size_t i = charics_.size(); i > 0; i--) {
+    int stackOffset = int(i) - nPush - 1;
+    if (frameVars[i - 1].boxed())
+      result = new BoxStackInsn(stackOffset, result);
+    InsnPtr ifNull = new SetKeyArgInsn(stackOffset, result);
+    if (charicInits_[i - 1]) {
+      BoundVarList f(frameVars);
+      f.resize(i - 1);
+      ifNull = Expression::optimizeCompile(charicInits_[i - 1], interp,
+                                          Environment(f, BoundVarList()),
+                                          nPush, ifNull);
+    }
+    else
+      ifNull = new ConstantInsn(interp.makeFalse(), ifNull);
+    result = new TestNullInsn(stackOffset, ifNull, result);
+  }
+  code_ = new UnpackMacroFlowObjInsn(result);
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
diff --git a/style/MacroFlowObj.h b/style/MacroFlowObj.h
new file mode 100644 (file)
index 0000000..c037089
--- /dev/null
@@ -0,0 +1,86 @@
+// Copyright (c) 1997 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef MacroFlowObj_INCLUDED
+#define MacroFlowObj_INCLUDED 1
+
+#include "SosofoObj.h"
+#include "Insn.h"
+#include "Resource.h"
+#include "Ptr.h"
+#include "Vector.h"
+#include "NCVector.h"
+#include "Owner.h"
+#include "Expression.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class ProcessContext;
+class Identifier;
+class Interpreter;
+
+class MacroFlowObj : public CompoundFlowObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  class Definition : public Resource {
+  public:
+    Definition(Vector<const Identifier *> &,
+              NCVector<Owner<Expression> > &,
+              const Identifier *contentsId,
+              Owner<Expression> &);
+
+    void process(ProcessContext &, MacroFlowObj *);
+    bool isCompound() const;
+    const Vector<const Identifier *> &nics() const;
+  private:
+    Definition(const Definition &); // undefined
+    void operator=(const Definition &); // undefined
+    void compile(Interpreter &);
+
+    Vector<const Identifier *> charics_;
+    NCVector<Owner<Expression> > charicInits_;
+    const Identifier *contentsId_;
+    Owner<Expression> body_;
+    InsnPtr code_;
+  };
+
+  MacroFlowObj(Vector<const Identifier *> &,
+              NCVector<Owner<Expression> > &,
+              const Identifier *contentsId,
+              Owner<Expression> &);
+  MacroFlowObj(const MacroFlowObj &);
+  ~MacroFlowObj();
+  FlowObj *copy(Collector &) const;
+  CompoundFlowObj *asCompoundFlowObj();
+  bool hasNonInheritedC(const Identifier *) const;
+  void setNonInheritedC(const Identifier *, ELObj *, const Location &, Interpreter &);
+  void traceSubObjects(Collector &) const;
+  void processInner(ProcessContext &);
+  void unpack(VM &);
+private:
+  void operator=(const MacroFlowObj &); // undefined
+  Ptr<Definition> def_;
+  ELObj **charicVals_;
+};
+
+inline
+bool MacroFlowObj::Definition::isCompound() const
+{
+  return contentsId_ != 0;
+}
+
+inline
+const Vector<const Identifier *> &MacroFlowObj::Definition::nics() const
+{
+  return charics_;
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not MacroFlowObj_INCLUDED */
diff --git a/style/Makefile.sub b/style/Makefile.sub
new file mode 100644 (file)
index 0000000..18e04f6
--- /dev/null
@@ -0,0 +1,44 @@
+LTVERSION=0:1:0
+LIB=ostyle
+DEPLIBS=-lm -L$(TOP)/grove -L$(TOP)/grove/.libs \
+  -L$(TOP)/lib -L$(TOP)/lib/.libs \
+  -L$(TOP)/spgrove -L$(TOP)/spgrove/.libs 
+OBJS=LangObj.o \
+  Collector.o \
+  DssslApp.o \
+  InterpreterMessages.o \
+  DssslSpecEventHandler.o \
+  ELObj.o \
+  ELObjMessageArg.o \
+  Expression.o \
+  FOTBuilder.o \
+  FlowObj.o \
+  InheritedC.o \
+  Insn.o \
+  Interpreter.o \
+  NumberCache.o \
+  ProcessContext.o \
+  ProcessingMode.o \
+  SchemeParser.o \
+  Style.o \
+  StyleEngine.o \
+  primitive.o \
+  GroveManager.o \
+  Pattern.o \
+  MacroFlowObj.o \
+  style_inst.o \
+  MessageModule.o \
+
+INCLUDE=-I$(srcdir)/../grove -I$(srcdir)/../spgrove
+
+GENSRCS=style_inst.cxx FlowObj_inst.cxx primitive_inst.cxx \
+  InterpreterMessages.h DssslAppMessages.h
+
+FlowObj.o: FlowObj_inst.cxx
+primitive.o: primitive_inst.cxx
+DssslApp.o: DssslAppMessages.h
+FlowObj.lo: FlowObj_inst.cxx
+primitive.lo: primitive_inst.cxx
+DssslApp.lo: DssslAppMessages.h
+InterpreterMessages.o: InterpreterMessages.h
+InterpreterMessages.lo: InterpreterMessages.h
diff --git a/style/MessageModule.cxx b/style/MessageModule.cxx
new file mode 100644 (file)
index 0000000..f3fc3d4
--- /dev/null
@@ -0,0 +1,24 @@
+// Copyright (c) 2002 Ian Castle
+// See the file COPYING for copying permission.
+
+#ifdef __GNUG__
+#pragma implementation
+#endif
+
+// #include "splib.h"
+// #include "MessageTable.h"
+
+#include "stylelib.h"
+
+#include <OpenSP/MessageModule.h>
+
+#ifdef SP_NAMESPACE
+namespace SP_NAMESPACE {
+#endif
+
+MessageModule jstyleModule;
+
+#ifdef SP_NAMESPACE
+}
+#endif
+
diff --git a/style/NumberCache.cxx b/style/NumberCache.cxx
new file mode 100644 (file)
index 0000000..7b3127f
--- /dev/null
@@ -0,0 +1,211 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#include "stylelib.h"
+#include "NumberCache.h"
+#include "macros.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+NumberCache::NumberCache()
+{
+}
+
+inline
+void advance(NodePtr &node)
+{
+  if (node.assignNextChunkAfter() != accessOK)
+    CANNOT_HAPPEN();
+}
+
+// This caching scheme will be defeated (but not disastrously so)
+// by numbering both notes and footnotes, say, per chapter.
+
+unsigned long NumberCache::elementNumberAfter(const NodePtr &node, const StringC &gi,
+                                             const StringC &resetGi)
+{
+  NodePtr start;
+  NodePtr lastMatch;
+  unsigned long resetCount = 0;
+  unsigned long count = 0;
+  ElementEntry *entry = elementNumbers_.lookup(resetGi);
+  if (entry) {
+    unsigned long nodeIndex, entryIndex;
+    bool useSubnode = 1;
+    node->elementIndex(nodeIndex);
+    unsigned long nodeGroveIndex = node->groveIndex();
+    if (entry->node) {
+      if (*entry->node == *node)
+       return 0;
+      entry->node->elementIndex(entryIndex);
+      if (entryIndex < nodeIndex && entry->node->groveIndex() == nodeGroveIndex) {
+       start = lastMatch = entry->node;
+       advance(start);
+       resetCount = entry->num;
+      }
+      else
+       useSubnode = 0;
+    }
+    if (entry->subNode && useSubnode) {
+      GroveString tem;
+      if (entry->subNode->getGi(tem) == accessOK
+         && tem == GroveString(gi.data(), gi.size())) {
+       if (*entry->subNode == *node)
+         return entry->subNum;
+       entry->subNode->elementIndex(entryIndex);
+       if (entryIndex < nodeIndex && entry->subNode->groveIndex() == nodeGroveIndex) {
+         start = entry->subNode;
+         advance(start);
+         count = entry->subNum;
+       }
+      }
+    }
+  }
+  else
+    elementNumbers_.insert(entry = new ElementEntry(resetGi));
+  if (!start) {
+    node->getGroveRoot(start);
+    start->getDocumentElement(start);
+  }
+  for (;;) {
+    GroveString tem;
+    if (start->getGi(tem) == accessOK) {
+      if (tem == GroveString(resetGi.data(), resetGi.size())) {
+       lastMatch = start;
+       resetCount++;
+       count = 0;
+      }
+      else if (tem == GroveString(gi.data(), gi.size()))
+       count++;
+    }
+    if (*start == *node)
+      break;
+    advance(start);
+  }
+  entry->node = lastMatch;
+  entry->num = resetCount;
+  entry->subNode = node;
+  entry->subNum = count;
+  return count;
+}
+
+unsigned long NumberCache::elementNumber(const NodePtr &node, const StringC &gi)
+{
+  NodePtr start;
+  NodePtr lastMatch;
+  unsigned long count = 0;
+  ElementEntry *entry = elementNumbers_.lookup(gi);
+  if (entry && entry->node) {
+    if (*entry->node == *node) {
+      lastMatch = node;
+      return entry->num;
+    }
+    unsigned long nodeIndex, entryIndex;
+    entry->node->elementIndex(entryIndex);
+    node->elementIndex(nodeIndex);
+    if (entryIndex < nodeIndex && node->groveIndex() == entry->node->groveIndex()) {
+      lastMatch = start = entry->node;
+      count = entry->num;
+      advance(start);
+    }
+  }
+  if (!start) {
+    node->getGroveRoot(start);
+    start->getDocumentElement(start);
+  }
+  for (;;) {
+    GroveString tem;
+    if (start->getGi(tem) == accessOK && tem == GroveString(gi.data(), gi.size())) {
+      lastMatch = start;
+      count++;
+    }
+    if (*start == *node)
+      break;
+    advance(start);
+  }
+  if (count) {
+    ASSERT(lastMatch);
+    if (!entry)
+      elementNumbers_.insert(entry = new ElementEntry(gi));
+    entry->node = lastMatch;
+    entry->subNode.clear();
+    entry->num = count;
+  }
+  return count;
+}
+
+bool NumberCache::childNumber(const NodePtr &node, unsigned long &result)
+{
+  GroveString gs;
+  if (node->getGi(gs) != accessOK)
+    return 0;
+  NodePtr tem;
+  if (node->getParent(tem) != accessOK) {
+    // must be document element
+    result = 0;
+    return 1;
+  }
+  NodePtr parent(tem);
+  unsigned level = 0;
+  while (tem->getParent(tem) == accessOK)
+    level++;
+  StringC gi(gs.data(), gs.size());
+  if (level >= childNumbers_.size())
+    childNumbers_.resize(level + 1);
+  NodePtr start;
+  unsigned long count = 0;
+  Entry *entry = childNumbers_[level].lookup(gi);
+  if (entry) {
+    if (*entry->node == *node) {
+      result = entry->num;
+      return 1;
+    }
+    // Start counting from the cached entry if it has the same
+    // parent as us and it is before us.
+    NodePtr entryParent;
+    entry->node->getParent(entryParent);
+    if (*entryParent == *parent) {
+      unsigned long nodeIndex, entryIndex;
+      entry->node->elementIndex(entryIndex);
+      node->elementIndex(nodeIndex);
+      if (entryIndex < nodeIndex && node->groveIndex() == entry->node->groveIndex()) {
+       start = entry->node;
+       count = entry->num;
+      }
+    }
+  }
+  else {
+    entry = new Entry(gi);
+    childNumbers_[level].insert(entry);
+  }
+  if (!start)
+    node->firstSibling(start);
+  while (*start != *node) {
+    GroveString tem;
+    if (start->getGi(tem) == accessOK && tem == gs)
+      count++;
+    if (start.assignNextChunkSibling() != accessOK)
+      CANNOT_HAPPEN();
+  }
+  entry->node = node;
+  entry->num = count;
+  result = count;
+  return 1;
+}
+
+NumberCache::Entry::Entry(const StringC &name)
+: Named(name)
+{
+}
+
+NumberCache::ElementEntry::ElementEntry(const StringC &name)
+: NumberCache::Entry(name)
+{
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
diff --git a/style/NumberCache.h b/style/NumberCache.h
new file mode 100644 (file)
index 0000000..6457023
--- /dev/null
@@ -0,0 +1,50 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef NumberCache_INCLUDED
+#define NumberCache_INCLUDED 1
+
+#include "Boolean.h"
+#include "Node.h"
+#include "NamedTable.h"
+#include "StringC.h"
+#include "NCVector.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class NumberCache {
+public:
+  NumberCache();
+  // Return 0 if argument is not a node.
+  bool childNumber(const NodePtr &node, unsigned long &);
+  // Number of elements before or equal to node whose gi is equal to s.
+  unsigned long elementNumber(const NodePtr &node, const StringC &s);
+  // Number of elements before or equal to node whose gi is equal to s,
+  // and that are after the last element before node with gi reset.
+  unsigned long elementNumberAfter(const NodePtr &, const StringC &s,
+                                  const StringC &reset);
+private:
+  struct Entry : Named {
+    Entry(const StringC &);
+    NodePtr node;
+    unsigned long num;
+  };
+  // A separate cache for each level of the tree.
+  NCVector<NamedTable<Entry> > childNumbers_;
+  struct ElementEntry : Entry {
+    ElementEntry(const StringC &);
+    NodePtr subNode;
+    unsigned long subNum;
+  };
+  NamedTable<ElementEntry> elementNumbers_;
+  friend struct ElementEntry;
+};
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not NumberCache_INCLUDED */
+
diff --git a/style/Pattern.cxx b/style/Pattern.cxx
new file mode 100644 (file)
index 0000000..c61de02
--- /dev/null
@@ -0,0 +1,474 @@
+// Copyright (c) 1997 James Clark
+// See the file copying.txt for copying permission.
+
+#include "stylelib.h"
+#include "Pattern.h"
+#include "macros.h"
+#include "Vector.h"
+#include "Interpreter.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+Pattern::Pattern()
+: trivial_(0)
+{
+}
+
+Pattern::Pattern(IList<Element> &ancestors)
+: trivial_(computeTrivial(ancestors))
+{
+  ancestors_.swap(ancestors);
+}
+
+bool Pattern::computeTrivial(const IList<Element> &ancestors)
+{
+  IListIter<Element> iter(ancestors);
+  if (iter.done())
+    return 1;
+  if (!iter.cur()->trivial())
+    return 0;
+  iter.next();
+  if (!iter.done())
+    return 0;
+  return 1;
+}
+
+Pattern::Element::Element(const StringC &gi)
+: gi_(gi), minRepeat_(1), maxRepeat_(1)
+{
+}
+
+bool Pattern::Element::matches(const NodePtr &nd, MatchContext &context) const
+{
+  if (gi_.size()) {
+    if (!nd->hasGi(GroveString(gi_.data(), gi_.size())))
+      return 0;
+  }
+  else {
+    GroveString tem;
+    if (nd->getGi(tem) != accessOK)
+      return 0;
+  }
+  for (IListIter<Qualifier> iter(qualifiers_); !iter.done(); iter.next())
+    if (!iter.cur()->satisfies(nd, context))
+      return 0;
+  return 1;
+}
+
+bool Pattern::Element::trivial() const
+{
+  if (minRepeat_ > 1)
+    return 0;
+  for (IListIter<Qualifier> iter(qualifiers_); !iter.done(); iter.next())
+    if (!iter.cur()->vacuous())
+      return 0;
+  return 1;
+}
+
+void Pattern::Element::contributeSpecificity(int *s) const
+{
+  if (gi_.size())
+    s[giSpecificity] += minRepeat_;
+  for (IListIter<Qualifier> iter(qualifiers_); !iter.done(); iter.next())
+    iter.cur()->contributeSpecificity(s);
+  if (minRepeat_ != maxRepeat_)
+    s[repeatSpecificity] -= 1;
+}
+
+Pattern::Qualifier::~Qualifier()
+{
+}
+
+bool Pattern::Qualifier::vacuous() const
+{
+  return 0;
+}
+
+bool Pattern::Qualifier::matchAttribute(const StringC &name,
+                                       const StringC &value,
+                                       const NodePtr &nd,
+                                       MatchContext &context)
+{
+  NamedNodeListPtr atts;
+  if (nd->getAttributes(atts) != accessOK)
+    return 0;
+  NodePtr att;
+  if (atts->namedNode(GroveString(name.data(), name.size()), att) != accessOK)
+    return 0;
+  bool implied;
+  if (att->getImplied(implied) == accessOK && implied)
+    return 0;
+  GroveString tokens;
+  if (att->tokens(tokens) == accessOK) {
+    if (tokens.size() != value.size())
+      return 0;
+    NodePtr node;
+    NamedNodeListPtr normalizer;
+    if (att->firstChild(node) != accessOK
+        || node->getEntity(node) != accessOK
+       || node->getGroveRoot(node) != accessOK
+       || node->getEntities(normalizer) != accessOK)
+      normalizer = atts;
+    StringC tem(value);
+    tem.resize(normalizer->normalize(&tem[0], tem.size()));
+    if (tokens != GroveString(tem.data(), tem.size()))
+      return 0;
+  }
+  else {
+    NodePtr tem;
+    StringC s;
+    if (att->firstChild(tem) == accessOK) {
+      do {
+       GroveString chunk;
+       if (tem->charChunk(context, chunk) == accessOK)
+         s.append(chunk.data(), chunk.size());
+       } while (tem.assignNextChunkSibling() == accessOK);
+    }
+    if (s != value)
+      return 0;
+  }
+  return 1;
+}
+
+Pattern::ChildrenQualifier::ChildrenQualifier(IList<Element> &children)
+{
+  children.swap(children_);
+}
+
+bool Pattern::ChildrenQualifier::satisfies(const NodePtr &nd,
+                                          MatchContext &context) const
+{
+  ASSERT(!children_.empty());
+  NodePtr child;
+  if (nd->firstChild(child) != accessOK)
+    return 0;
+  Vector<const Element *> toMatch;
+  for (IListIter<Element> iter(children_); !iter.done(); iter.next())
+    toMatch.push_back(iter.cur());
+  do {
+    size_t j = 0;
+    for (size_t i = 0; i < toMatch.size(); i++) {
+      if (!toMatch[i]->matches(child, context)) {
+       if (j != i)
+         toMatch[j] = toMatch[i];
+       j++;
+      }
+    }
+    if (j == 0)
+      return 1;
+    toMatch.resize(j);
+  } while (child.assignNextChunkSibling() == accessOK);
+  return 0;
+}
+
+void Pattern::ChildrenQualifier::contributeSpecificity(int *s) const
+{
+  for (IListIter<Element> iter(children_); !iter.done(); iter.next())
+    iter.cur()->contributeSpecificity(s);
+}
+
+Pattern::IdQualifier::IdQualifier(const StringC &id)
+: id_(id)
+{
+}
+
+bool Pattern::IdQualifier::satisfies(const NodePtr &nd, MatchContext &context) const
+{
+  GroveString nodeId;
+  if (nd->getId(nodeId) == accessOK) {
+    size_t len = id_.size();
+    if (nodeId.size() == len) {
+      StringC tem(id_);
+      Interpreter::normalizeGeneralName(nd, tem);
+      GroveString patternId(tem.data(), tem.size());
+      if (patternId == nodeId)
+       return 1;
+    }
+  }
+  const Vector<StringC> &idAtts = context.idAttributeNames();
+  for (size_t i = 0; i < idAtts.size(); i++)
+    if (matchAttribute(idAtts[i], id_, nd, context))
+      return 1;
+  return 0;
+}
+
+void Pattern::IdQualifier::contributeSpecificity(int *s) const
+{
+  s[idSpecificity] += 1;
+}
+
+Pattern::ClassQualifier::ClassQualifier(const StringC &cls)
+: class_(cls)
+{
+}
+
+bool Pattern::ClassQualifier::satisfies(const NodePtr &nd, MatchContext &context) const
+{
+  const Vector<StringC> &classAtts = context.classAttributeNames();
+  for (size_t i = 0; i < classAtts.size(); i++)
+    if (matchAttribute(classAtts[i], class_, nd, context))
+      return 1;
+  return 0;
+}
+
+void Pattern::ClassQualifier::contributeSpecificity(int *s) const
+{
+  s[classSpecificity] += 1;
+}
+
+Pattern::AttributeHasValueQualifier::AttributeHasValueQualifier(const StringC &name)
+: name_(name)
+{
+}
+
+bool Pattern::AttributeHasValueQualifier::satisfies(const NodePtr &nd, MatchContext &context) const
+{
+  NamedNodeListPtr atts;
+  if (nd->getAttributes(atts) != accessOK)
+    return 0;
+  NodePtr att;
+  if (atts->namedNode(GroveString(name_.data(), name_.size()), att) != accessOK)
+    return 0;
+  bool implied;
+  if (att->getImplied(implied) == accessOK && implied)
+    return 0;
+  return 1;
+}
+
+void Pattern::AttributeHasValueQualifier::contributeSpecificity(int *s) const
+{
+  s[attributeSpecificity] += 1;
+}
+
+Pattern::AttributeMissingValueQualifier::AttributeMissingValueQualifier(const StringC &name)
+: name_(name)
+{
+}
+
+bool Pattern::AttributeMissingValueQualifier::satisfies(const NodePtr &nd, MatchContext &context) const
+{
+  NamedNodeListPtr atts;
+  if (nd->getAttributes(atts) != accessOK)
+    return 1;
+  NodePtr att;
+  if (atts->namedNode(GroveString(name_.data(), name_.size()), att) != accessOK)
+    return 1;
+  bool implied;
+  if (att->getImplied(implied) == accessOK && implied)
+    return 1;
+  return 0;
+}
+
+void Pattern::AttributeMissingValueQualifier::contributeSpecificity(int *s) const
+{
+  s[attributeSpecificity] += 1;
+}
+
+Pattern::AttributeQualifier::AttributeQualifier(const StringC &name, const StringC &value)
+: name_(name), value_(value)
+{
+}
+
+bool Pattern::AttributeQualifier::satisfies(const NodePtr &nd, MatchContext &context) const
+{
+  return matchAttribute(name_, value_, nd, context);
+}
+
+void Pattern::AttributeQualifier::contributeSpecificity(int *s) const
+{
+  s[attributeSpecificity] += 1;
+}
+
+void Pattern::PositionQualifier::contributeSpecificity(int *s) const
+{
+  s[positionSpecificity] += 1;
+}
+
+bool Pattern::FirstOfTypeQualifier::satisfies(const NodePtr &nd, MatchContext &context) const
+{
+  GroveString ndType;
+  nd->getGi(ndType);
+  NodePtr tem;
+  if (nd->firstSibling(tem) != accessOK)
+    return 1; // must be document element
+  while (*tem != *nd) {
+    GroveString temType;
+    if (tem->getGi(temType) == accessOK && temType == ndType)
+      return 0;
+    tem.assignNextChunkSibling();
+  }
+  return 1;
+}
+
+bool Pattern::LastOfTypeQualifier::satisfies(const NodePtr &nd, MatchContext &context) const
+{
+  NodePtr tem;
+  if (nd->nextChunkSibling(tem) != accessOK)
+    return 1;
+  GroveString ndType;
+  nd->getGi(ndType);
+  do {
+    GroveString temType;
+    if (tem->getGi(temType) == accessOK && temType == ndType)
+      return 0;
+  } while (tem.assignNextChunkSibling() == accessOK);
+  return 1;
+}
+
+bool Pattern::FirstOfAnyQualifier::satisfies(const NodePtr &nd, MatchContext &) const
+{
+  NodePtr tem;
+  if (nd->firstSibling(tem) != accessOK)
+    return 1; // must be document element
+  while (*tem != *nd) {
+    GroveString temType;
+    if (tem->getGi(temType) == accessOK)
+      return 0;
+    tem.assignNextChunkSibling();
+  }
+  return 1;
+}
+
+bool Pattern::LastOfAnyQualifier::satisfies(const NodePtr &nd, MatchContext &context) const
+{
+  NodePtr tem;
+  if (nd->nextChunkSibling(tem) != accessOK)
+    return 1;
+  GroveString ndType;
+  nd->getGi(ndType);
+  do {
+    GroveString temType;
+    if (tem->getGi(temType) == accessOK)
+      return 0;
+  } while (tem.assignNextChunkSibling() == accessOK);
+  return 1;
+}
+
+void Pattern::OnlyQualifier::contributeSpecificity(int *s) const
+{
+  s[onlySpecificity] += 1;
+}
+
+bool Pattern::OnlyOfTypeQualifier::satisfies(const NodePtr &nd, MatchContext &context) const
+{
+  GroveString ndType;
+  nd->getGi(ndType);
+  NodePtr tem;
+  if (nd->firstSibling(tem) != accessOK)
+    return 1; // must be document element
+  unsigned count = 0;
+  do {
+    GroveString temType;
+    if (tem->getGi(temType) == accessOK && temType == ndType) {
+      if (count++)
+       return 0;
+    }
+  } while (tem.assignNextChunkSibling() == accessOK);
+  return 1;
+}
+
+bool Pattern::OnlyOfAnyQualifier::satisfies(const NodePtr &nd, MatchContext &context) const
+{
+  NodePtr tem;
+  if (nd->firstSibling(tem) != accessOK)
+    return 1; // must be document element
+  unsigned count = 0;
+  do {
+    GroveString temType;
+    if (tem->getGi(temType) == accessOK) {
+      if (count++)
+       return 0;
+    }
+  } while (tem.assignNextChunkSibling() == accessOK);
+  return 1;
+}
+
+bool Pattern::VacuousQualifier::vacuous() const
+{
+  return 1;
+}
+
+Pattern::PriorityQualifier::PriorityQualifier(long n)
+: n_(n)
+{
+}
+
+void Pattern::PriorityQualifier::contributeSpecificity(int *s) const
+{
+  s[prioritySpecificity] += n_;
+}
+
+bool Pattern::PriorityQualifier::satisfies(const NodePtr &, MatchContext &) const
+{
+  return 1;
+}
+
+Pattern::ImportanceQualifier::ImportanceQualifier(long n)
+: n_(n)
+{
+}
+
+void Pattern::ImportanceQualifier::contributeSpecificity(int *s) const
+{
+  s[importanceSpecificity] += n_;
+}
+
+bool Pattern::ImportanceQualifier::satisfies(const NodePtr &, MatchContext &) const
+{
+  return 1;
+}
+
+bool Pattern::matchAncestors1(const IListIter<Element> &ancestors,
+                             const NodePtr &node,
+                             MatchContext &context)
+{
+  const Element &r = *ancestors.cur();
+  NodePtr tem(node);
+  for (Repeat i = 0; i < r.minRepeat(); i++) {
+    if (!tem || !r.matches(tem, context))
+      return 0;
+    if (tem->getParent(tem) != accessOK)
+      tem.clear();
+  }
+  Repeat i = r.minRepeat();
+  for (;;) {
+    IListIter<Element> up(ancestors);
+    up.next();
+    if (matchAncestors(up, tem, context))
+      break;
+    if (i == r.maxRepeat() || !tem || !r.matches(tem, context))
+      return 0;
+    i++;
+    if (tem->getParent(tem) != accessOK)
+      tem.clear();
+  }
+  return 1;
+}
+
+void Pattern::computeSpecificity(int *s) const
+{
+  for (int i = 0; i < nSpecificity; i++)
+    s[i] = 0;
+  for (IListIter<Element> iter(ancestors_); !iter.done(); iter.next())
+    iter.cur()->contributeSpecificity(s);
+}
+
+int Pattern::compareSpecificity(const Pattern &pattern1, const Pattern &pattern2)
+{
+  int s1[nSpecificity];
+  int s2[nSpecificity];
+  int i;  // declare here to avoid gcc bug
+  pattern1.computeSpecificity(s1);
+  pattern2.computeSpecificity(s2);
+  for (i = 0; i < nSpecificity; i++) {
+    if (s1[i] != s2[i])
+      return s1[i] > s2[i] ? -1 : 1;
+  }
+  return 0;
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
diff --git a/style/Pattern.h b/style/Pattern.h
new file mode 100644 (file)
index 0000000..931cbe5
--- /dev/null
@@ -0,0 +1,294 @@
+// Copyright (c) 1997 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef Pattern_INCLUDED
+#define Pattern_INCLUDED 1
+
+#include "Boolean.h"
+#include "Node.h"
+#include "Link.h"
+#include "IList.h"
+#include "IListIter.h"
+#include "StringC.h"
+#include "Vector.h"
+#include "Ptr.h"
+#include "Resource.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class Pattern {
+public:
+  class MatchContext : public SdataMapper {
+  public:
+    const Vector<StringC> &classAttributeNames() const;
+    const Vector<StringC> &idAttributeNames() const;
+  protected:
+    Vector<StringC> classAttributeNames_;
+    Vector<StringC> idAttributeNames_;
+  };
+  class Qualifier : public Link {
+  public:
+    virtual ~Qualifier();
+    virtual bool satisfies(const NodePtr &, MatchContext &) const = 0;
+    virtual void contributeSpecificity(int *) const = 0;
+    virtual bool vacuous() const;
+  protected:
+    static bool matchAttribute(const StringC &name,
+                              const StringC &value,
+                              const NodePtr &nd,
+                              MatchContext &context);
+  };
+  class IdQualifier : public Qualifier {
+  public:
+    IdQualifier(const StringC &);
+    bool satisfies(const NodePtr &, MatchContext &) const;
+    void contributeSpecificity(int *) const;
+  private:
+    StringC id_;
+  };
+  class ClassQualifier : public Qualifier {
+  public:
+    ClassQualifier(const StringC &);
+    bool satisfies(const NodePtr &, MatchContext &) const;
+    void contributeSpecificity(int *) const;
+  private:
+    StringC class_;
+  };
+  class AttributeHasValueQualifier : public Qualifier {
+  public:
+    AttributeHasValueQualifier(const StringC &);
+    bool satisfies(const NodePtr &, MatchContext &) const;
+    void contributeSpecificity(int *) const;
+  private:
+    StringC name_;
+  };
+  class AttributeMissingValueQualifier : public Qualifier {
+  public:
+    AttributeMissingValueQualifier(const StringC &);
+    bool satisfies(const NodePtr &, MatchContext &) const;
+    void contributeSpecificity(int *) const;
+  private:
+    StringC name_;
+  };
+  class AttributeQualifier : public Qualifier {
+  public:
+    AttributeQualifier(const StringC &, const StringC &);
+    bool satisfies(const NodePtr &, MatchContext &) const;
+    void contributeSpecificity(int *) const;
+  private:
+    StringC name_;
+    StringC value_;
+  };
+  class PositionQualifier : public Qualifier {
+  public:
+    void contributeSpecificity(int *) const;
+  };
+  class FirstOfTypeQualifier : public PositionQualifier {
+  public:
+    bool satisfies(const NodePtr &, MatchContext &) const;
+  };
+  class LastOfTypeQualifier : public PositionQualifier {
+  public:
+    bool satisfies(const NodePtr &, MatchContext &) const;
+  };
+  class FirstOfAnyQualifier : public PositionQualifier {
+  public:
+    bool satisfies(const NodePtr &, MatchContext &) const;
+  };
+  class LastOfAnyQualifier : public PositionQualifier {
+  public:
+    bool satisfies(const NodePtr &, MatchContext &) const;
+  };
+  class OnlyQualifier : public Qualifier {
+  public:
+    void contributeSpecificity(int *) const;
+  };
+  class OnlyOfTypeQualifier : public OnlyQualifier {
+  public:
+    bool satisfies(const NodePtr &, MatchContext &) const;
+  };
+  class OnlyOfAnyQualifier : public OnlyQualifier {
+  public:
+    bool satisfies(const NodePtr &, MatchContext &) const;
+  };
+  class VacuousQualifier : public Qualifier {
+  public:
+    bool vacuous() const;
+  };
+  class PriorityQualifier : public VacuousQualifier {
+  public:
+    PriorityQualifier(long);
+    void contributeSpecificity(int *) const;
+    bool satisfies(const NodePtr &, MatchContext &) const;
+  private:
+    long n_;
+  };
+  class ImportanceQualifier : public VacuousQualifier {
+  public:
+    ImportanceQualifier(long);
+    void contributeSpecificity(int *) const;
+    bool satisfies(const NodePtr &, MatchContext &) const;
+  private:
+    long n_;
+  };
+  typedef unsigned Repeat;
+  class Element : public Link {
+  public:
+    Element(const StringC &);
+    bool matches(const NodePtr &, MatchContext &) const;
+    void contributeSpecificity(int *) const;
+    void addQualifier(Qualifier *);
+    void setRepeat(Repeat minRepeat, Repeat maxRepeat);
+    Repeat minRepeat() const;
+    Repeat maxRepeat() const;
+    bool mustHaveGi(StringC &) const;
+    bool trivial() const;
+  private:
+    StringC gi_;
+    Repeat minRepeat_;
+    Repeat maxRepeat_;
+    IList<Qualifier> qualifiers_;
+  };
+  class ChildrenQualifier : public Qualifier {
+  public:
+    ChildrenQualifier(IList<Element> &);
+    bool satisfies(const NodePtr &, MatchContext &) const;
+    void contributeSpecificity(int *) const;
+  private:
+    IList<Element> children_;
+  };
+  Pattern();
+  Pattern(IList<Element> &);
+  void swap(Pattern &);
+  bool matches(const NodePtr &, MatchContext &) const;
+  // If mustHaveGi returns true, then any element that matches the pattern
+  // must have the string returned in str.
+  bool mustHaveGi(StringC &str) const;
+  // A pattern is trivial if any element that has the gi returned my mustHaveGi
+  // matches the pattern, or, if mustHaveGi returns false, if any element matches
+  // the pattern.
+  bool trivial() const;
+  static int compareSpecificity(const Pattern &, const Pattern &);
+  enum {
+    importanceSpecificity,
+    idSpecificity,
+    classSpecificity,
+    giSpecificity,
+    repeatSpecificity,
+    prioritySpecificity,
+    onlySpecificity,
+    positionSpecificity,
+    attributeSpecificity,
+    nSpecificity
+  };
+private:
+  Pattern(const Pattern &);    // undefined
+  void operator=(const Pattern &); // undefined
+  void computeSpecificity(int *) const;
+  static bool computeTrivial(const IList<Element> &);
+
+  static bool matchAncestors(const IListIter<Element> &,
+                            const NodePtr &,
+                            MatchContext &);
+  static bool matchAncestors1(const IListIter<Element> &,
+                             const NodePtr &,
+                             MatchContext &);
+
+  IList<Element> ancestors_; // first is self, second is parent ...
+  bool trivial_;
+};
+
+inline
+void Pattern::Element::setRepeat(Repeat minRepeat, Repeat maxRepeat)
+{
+  minRepeat_ = minRepeat;
+  maxRepeat_ = maxRepeat;
+}
+
+inline
+Pattern::Repeat Pattern::Element::minRepeat() const
+{
+  return minRepeat_;
+}
+
+inline
+Pattern::Repeat Pattern::Element::maxRepeat() const
+{
+  return maxRepeat_;
+}
+
+inline
+void Pattern::Element::addQualifier(Qualifier *q)
+{
+  qualifiers_.insert(q);
+}
+
+inline
+bool Pattern::matchAncestors(const IListIter<Element> &ancestors,
+                            const NodePtr &node,
+                            MatchContext &context)
+{
+  return ancestors.done() || matchAncestors1(ancestors, node, context);
+}
+
+inline
+bool Pattern::matches(const NodePtr &nd, MatchContext &context) const
+{
+  return matchAncestors(IListIter<Element>(ancestors_),
+                       nd,
+                       context);
+}
+
+inline
+void Pattern::swap(Pattern &pattern)
+{
+  ancestors_.swap(pattern.ancestors_);
+  bool tem = trivial_;
+  trivial_ = pattern.trivial_;
+  pattern.trivial_ = tem;
+}
+
+inline
+bool Pattern::Element::mustHaveGi(StringC &gi) const
+{
+  if (minRepeat_ == 0)
+    return 0;
+  else if (gi_.size()) {
+    gi = gi_;
+    return 1;
+  }
+  else
+    return 0;
+}
+
+inline
+bool Pattern::mustHaveGi(StringC &gi) const
+{
+  return !ancestors_.empty() && ancestors_.head()->mustHaveGi(gi);
+}
+
+inline
+const Vector<StringC> &Pattern::MatchContext::classAttributeNames() const
+{
+  return classAttributeNames_;
+}
+
+inline
+const Vector<StringC> &Pattern::MatchContext::idAttributeNames() const
+{
+  return idAttributeNames_;
+}
+
+inline
+bool Pattern::trivial() const
+{
+  return trivial_;
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not Pattern_INCLUDED */
diff --git a/style/ProcessContext.cxx b/style/ProcessContext.cxx
new file mode 100644 (file)
index 0000000..6a77742
--- /dev/null
@@ -0,0 +1,816 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#include "stylelib.h"
+#include "ProcessContext.h"
+#include "Interpreter.h"
+#include "InterpreterMessages.h"
+#include "SosofoObj.h"
+#include "macros.h"
+#include "IListIter.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+ProcessContext::ProcessContext(Interpreter &interp, FOTBuilder &fotb)
+: Collector::DynamicRoot(interp), vm_(interp), flowObjLevel_(0), havePageType_(0), connectableStackLevel_(0)
+{
+  connectionStack_.insert(new Connection(&fotb));
+}
+
+void ProcessContext::process(const NodePtr &node)
+{
+  Interpreter &interp = *vm_.interp;
+  StyleObj *style = interp.initialStyle();
+  if (style) {
+    currentStyleStack().push(style, vm(), currentFOTBuilder());
+    currentFOTBuilder().startSequence();
+  }
+  processNode(node, interp.initialProcessingMode());
+  if (style) {
+    currentFOTBuilder().endSequence();
+    currentStyleStack().pop();
+  }
+}
+
+void ProcessContext::processNodeSafe(const NodePtr &nodePtr,
+                                    const ProcessingMode *processingMode,
+                                    bool chunk)
+{
+  unsigned long elementIndex;
+  if (nodePtr->elementIndex(elementIndex) == accessOK) {
+    unsigned groveIndex = nodePtr->groveIndex();
+    for (size_t i = 0; i < nodeStack_.size(); i++) {
+      const NodeStackEntry &nse = nodeStack_[i];
+      if (nse.elementIndex == elementIndex
+         && nse.groveIndex == groveIndex
+         && nse.processingMode == processingMode) {
+       vm_.interp->setNodeLocation(nodePtr);
+       vm_.interp->message(InterpreterMessages::processNodeLoop);
+       return;
+      }
+    }
+    nodeStack_.resize(nodeStack_.size() + 1);
+    NodeStackEntry &e = nodeStack_.back();
+    e.elementIndex = elementIndex;
+    e.groveIndex = groveIndex;
+    e.processingMode = processingMode;
+    processNode(nodePtr, processingMode, chunk);
+    nodeStack_.resize(nodeStack_.size() - 1);
+  }
+  else
+    processNode(nodePtr, processingMode, chunk);
+}
+
+void ProcessContext::processNode(const NodePtr &nodePtr,
+                                const ProcessingMode *processingMode,
+                                bool chunk)
+{
+  ASSERT(processingMode != 0);
+  GroveString str;
+  if (nodePtr->charChunk(*vm_.interp, str) == accessOK) 
+    currentFOTBuilder().charactersFromNode(nodePtr, str.data(), chunk ? str.size() : 1);
+  else {
+    EvalContext::CurrentNodeSetter cns(nodePtr, processingMode, vm());
+    ProcessingMode::Specificity saveSpecificity(matchSpecificity_);
+    matchSpecificity_ = ProcessingMode::Specificity();
+    bool hadStyle = 0;
+    currentFOTBuilder().startNode(nodePtr, processingMode->name());
+    for (;;) {
+      const ProcessingMode::Rule *rule
+       = vm().processingMode->findMatch(nodePtr, *vm_.interp, *vm_.interp,
+                                       matchSpecificity_);
+      if (!rule) {
+       if (hadStyle) {
+         currentStyleStack().pushEnd(vm(), currentFOTBuilder());
+         currentFOTBuilder().startSequence();
+       }
+        processChildren(processingMode);
+       break;
+      }
+      if (!matchSpecificity_.isStyle()) {
+       SosofoObj *sosofoObj;
+        InsnPtr insn;
+       rule->action().get(insn, sosofoObj);
+       if (hadStyle) {
+         currentStyleStack().pushEnd(vm(), currentFOTBuilder());
+         currentFOTBuilder().startSequence();
+       }
+       if (sosofoObj)
+         sosofoObj->process(*this);
+       else {
+         ELObj *obj = vm().eval(insn.pointer());
+         if (vm_.interp->isError(obj)) {
+           if (processingMode->name().size() == 0)
+             processChildren(processingMode);
+         }
+         else {
+           ELObjDynamicRoot protect(*vm_.interp, obj);
+           ((SosofoObj *)obj)->process(*this);
+         }
+       }
+       break;
+      }
+      SosofoObj *sosofoObj;
+      InsnPtr insn;
+      rule->action().get(insn, sosofoObj);
+      ELObj *obj = vm().eval(insn.pointer());
+      if (!vm_.interp->isError(obj)) {
+       if (!hadStyle) {
+         currentStyleStack().pushStart();
+         hadStyle = 1;
+       }
+       currentStyleStack().pushContinue((StyleObj *)obj, rule, nodePtr, vm_.interp);
+      }
+    }
+    if (hadStyle) {
+      currentFOTBuilder().endSequence();
+      currentStyleStack().pop();
+    }
+    currentFOTBuilder().endNode();
+    matchSpecificity_ = saveSpecificity;
+  }
+}
+
+void ProcessContext::nextMatch(StyleObj *overridingStyle)
+{
+  ProcessingMode::Specificity saveSpecificity(matchSpecificity_);
+  StyleObj *saveOverridingStyle = vm().overridingStyle;
+  if (overridingStyle)
+    vm().overridingStyle = overridingStyle;
+  const ProcessingMode::Rule *rule
+   = vm().processingMode->findMatch(vm().currentNode, *vm_.interp, *vm_.interp,
+                                   matchSpecificity_);
+  if (rule) {
+    ASSERT(!matchSpecificity_.isStyle());
+    SosofoObj *sosofoObj;
+    InsnPtr insn;
+    rule->action().get(insn, sosofoObj);
+    if (sosofoObj)
+      sosofoObj->process(*this);
+    else {
+      ELObj *obj = vm().eval(insn.pointer());
+      if (vm_.interp->isError(obj)) 
+       processChildren(vm().processingMode);
+      else {
+       ELObjDynamicRoot protect(*vm_.interp, obj);
+       ((SosofoObj *)obj)->process(*this);
+      }
+    }
+  }
+  else
+    processChildren(vm().processingMode);
+  vm().overridingStyle = saveOverridingStyle;
+  matchSpecificity_ = saveSpecificity;
+}
+
+void ProcessContext::processChildren(const ProcessingMode *processingMode)
+{
+  if (vm().currentNode.assignFirstChild() == accessOK) {
+    do {
+      processNode(vm().currentNode, processingMode);
+    } while (vm().currentNode.assignNextChunkSibling() == accessOK);
+  }
+  else if (vm().currentNode->getDocumentElement(vm().currentNode) == accessOK)
+    processNode(vm().currentNode, processingMode);
+}
+
+inline
+bool isWhiteSpace(Char c, Interpreter &interp)
+{
+  return 
+    interp.charProperty(
+      interp.makeStringC("input-whitespace?"), c, Location(), 0)->isTrue(); 
+}
+
+static
+bool onlyWhiteSpaceFollows(const NodePtr &node, Interpreter &interp)
+{
+  NodePtr tem;
+  if (node->nextChunkSibling(tem) == accessOK) {
+    do {
+      GroveString str;
+      if (tem->charChunk(interp, str) == accessOK) {
+       for (size_t i = 0; i < str.size(); i++)
+         if (!isWhiteSpace(str[i], interp))
+           return 0;
+      }
+      else if (tem->getGi(str) == accessOK)
+       return 0;
+    } while (tem.assignNextChunkSibling() == accessOK);
+  }
+  return 1;
+}
+
+void ProcessContext::processChildrenTrim(const ProcessingMode *processingMode)
+{
+  if (vm().currentNode.assignFirstChild() == accessOK) {
+    bool atStart = 1;
+    do {
+      NodePtr curNode = vm().currentNode;
+      GroveString str;
+      if (curNode->charChunk(*vm().interp, str) == accessOK) {
+       if (atStart) {
+         const Char *s = str.data();
+         size_t n = str.size();
+         for (; n > 0; n--, s++) {
+           if (!isWhiteSpace(*s, *vm().interp))
+             break;
+         }
+         if (n == 0)
+           str.assign(0, 0);
+         else {
+           atStart = 0;
+           if (s != str.data()) {
+             if (curNode->followSiblingRef(str.size() - (n + 1), curNode) != accessOK)
+               CANNOT_HAPPEN();
+             str.assign(s, n);
+           }
+         }
+       }
+       if (str.size()) {
+         if (isWhiteSpace(str[str.size() - 1], *vm().interp)
+             && onlyWhiteSpaceFollows(curNode, *vm().interp)) {
+           for (size_t n = str.size() - 1; n > 0; n--) {
+             if (!isWhiteSpace(str[n - 1], *vm().interp)) {
+               currentFOTBuilder().charactersFromNode(curNode, str.data(), n);
+               return;
+             }
+           }
+           return;
+         }
+         currentFOTBuilder().charactersFromNode(curNode, str.data(), str.size());
+       }
+      }
+      else {
+       if (atStart && vm().currentNode->getGi(str) == accessOK)
+         atStart = 0;
+       processNode(vm().currentNode, processingMode);
+      }
+    } while (vm().currentNode.assignNextChunkSibling() == accessOK);
+  }
+  else if (vm().currentNode->getDocumentElement(vm().currentNode) == accessOK)
+    processNode(vm().currentNode, processingMode);
+}
+
+void ProcessContext::startConnection(SymbolObj *label, const Location &loc)
+{
+  unsigned connLevel = connectableStackLevel_;
+  for (IListIter<Connectable> iter(connectableStack_); !iter.done(); iter.next(), --connLevel) {
+    Connectable *conn = iter.cur();
+    for (size_t i = 0; i < conn->ports.size(); i++) {
+      Port &port = conn->ports[i];
+      for (size_t j = 0; j < port.labels.size(); j++)
+       if (port.labels[j] == label) {
+         restoreConnection(connLevel, i);
+         return;
+       }
+    }
+    for (size_t i = 0; i < conn->principalPortLabels.size(); i++)
+      if (conn->principalPortLabels[i] == label) {
+       restoreConnection(connLevel, size_t(-1));
+       return;
+      }
+  }
+  vm().interp->setNextLocation(loc);
+  vm().interp->message(InterpreterMessages::badConnection,
+                      StringMessageArg(*label->name()));
+  connectionStack_.head()->nBadFollow++;
+}
+
+
+void ProcessContext::endConnection()
+{
+  if (inTableRow() && tableStack_.head()->rowConnectableLevel == connectableStackLevel_)
+    endTableRow();
+  if (connectionStack_.head()->nBadFollow > 0)
+    connectionStack_.head()->nBadFollow--;
+  else {
+    currentFOTBuilder().endNode();
+    Port *port = connectionStack_.head()->port;
+    if (port && --(port->connected) == 0) {
+      while (!port->saveQueue.empty()) {
+       SaveFOTBuilder *saved = port->saveQueue.get();
+       saved->emit(*port->fotb);
+       delete saved;
+      }
+    }
+    delete connectionStack_.get();
+  }
+}
+
+void ProcessContext::restoreConnection(unsigned connectableLevel, size_t portIndex)
+{
+  unsigned connLevel = connectableStackLevel_;
+  IListIter<Connectable> iter(connectableStack_);
+  for (; connLevel != connectableLevel; iter.next(), --connLevel)
+    ;
+  Connectable *conn = iter.cur();
+  if (portIndex != size_t(-1)) {
+    Port &port = conn->ports[portIndex];
+    Connection *c = new Connection(conn->styleStack, &port, connLevel);
+    if (port.connected) {
+      port.connected++;
+      SaveFOTBuilder *save = new SaveFOTBuilder(vm().currentNode,
+                                               vm().processingMode->name());
+      c->fotb = save;
+      port.saveQueue.append(save);
+    }
+    else {
+      c->fotb = port.fotb;
+      port.connected = 1;
+    }
+    connectionStack_.insert(c);
+    currentFOTBuilder().startNode(vm().currentNode,
+                                 vm().processingMode->name());
+  }
+  else {
+    Connection *c = new Connection(conn->styleStack, 0, connLevel);
+    if (conn->flowObjLevel == flowObjLevel_) {
+      c->fotb = &currentFOTBuilder();
+    }
+    else {
+      SaveFOTBuilder *save = new SaveFOTBuilder(vm().currentNode,
+                                               vm().processingMode->name());
+      c->fotb = save;
+      if (conn->flowObjLevel >= principalPortSaveQueues_.size())
+       principalPortSaveQueues_.resize(conn->flowObjLevel + 1);
+      principalPortSaveQueues_[conn->flowObjLevel].append(save);
+    }
+    connectionStack_.insert(c);
+    currentFOTBuilder().startNode(vm().currentNode,
+                                 vm().processingMode->name());
+  }
+}
+
+void ProcessContext::endFlowObj()
+{
+  flowObjLevel_--;
+  if (flowObjLevel_ < principalPortSaveQueues_.size()) {
+    IQueue<SaveFOTBuilder> &saveQueue = principalPortSaveQueues_[flowObjLevel_];
+    while (!saveQueue.empty()) {
+      SaveFOTBuilder *saved = saveQueue.get();
+      saved->emit(currentFOTBuilder());
+      delete saved;
+    }
+  }
+}
+
+
+ProcessContext::Connection::Connection(const StyleStack &s, Port *p, unsigned connLevel)
+: styleStack(s), port(p), nBadFollow(0), connectableLevel(connLevel)
+{
+}
+
+ProcessContext::Connection::Connection(FOTBuilder *f)
+: fotb(f), port(0), nBadFollow(0), connectableLevel(0)
+{
+}
+
+void ProcessContext::pushPorts(bool,
+                              const Vector<SymbolObj *> &labels,
+                              const Vector<FOTBuilder *> &fotbs)
+{
+  Connectable *c = new Connectable(labels.size(), currentStyleStack(), flowObjLevel_);
+  connectableStack_.insert(c);
+  for (size_t i = 0; i < labels.size(); i++) {
+    c->ports[i].labels.push_back(labels[i]);
+    c->ports[i].fotb = fotbs[i];
+  }
+  connectableStackLevel_++;
+  // FIXME deal with !hasPrincipalPort
+}
+
+void ProcessContext::popPorts()
+{
+  connectableStackLevel_--;
+  delete connectableStack_.get();
+}
+
+void ProcessContext::pushPrincipalPort(FOTBuilder* principalPort)
+{
+  connectionStack_.insert(new Connection(principalPort));
+}
+
+void ProcessContext::popPrincipalPort()
+{
+  delete connectionStack_.get();
+}
+
+void ProcessContext::startDiscardLabeled(SymbolObj *label)
+{
+  startFlowObj();
+  Connectable *c = new Connectable(1, currentStyleStack(), flowObjLevel_);
+  connectableStack_.insert(c);
+  c->ports[0].labels.push_back(label);
+  c->ports[0].fotb = &ignoreFotb_;
+}
+
+void ProcessContext::endDiscardLabeled()
+{
+  delete connectableStack_.get();
+  endFlowObj();
+}
+
+void ProcessContext::startMapContent(ELObj *contentMap, const Location &loc)
+{
+  bool badFlag = 0;
+  if (!connectableStack_.head() || connectableStack_.head()->flowObjLevel != flowObjLevel_)
+    connectableStack_.insert(new Connectable(0, currentStyleStack(), flowObjLevel_));
+  Connectable &conn = *connectableStack_.head();
+  Vector<SymbolObj *> portNames(conn.ports.size());
+  for (size_t i = 0; i < conn.ports.size(); i++) {
+    portNames[i] = conn.ports[i].labels[0];
+    conn.ports[i].labels.clear();
+  }
+  for (;;) {
+    if (contentMap->isNil())
+      break;
+    PairObj *tem = contentMap->asPair();
+    if (!tem) {
+      badContentMap(badFlag, loc);
+      break;
+    }
+    ELObj *entry = tem->car();
+    contentMap = tem->cdr();
+    tem = entry->asPair();
+    if (tem) {
+      SymbolObj *label = tem->car()->asSymbol();
+      if (label) {
+       // FIXME check if label already specified
+       tem = tem->cdr()->asPair();
+       if (tem) {
+         SymbolObj *port = tem->car()->asSymbol();
+         if (port) {
+           for (size_t i = 0; i < portNames.size(); i++)
+             if (portNames[i] == port) {
+               conn.ports[i].labels.push_back(label);
+               port = 0;
+               break;
+             }
+           if (port) {
+             vm().interp->setNextLocation(loc);
+             vm().interp->message(InterpreterMessages::contentMapBadPort,
+                                  StringMessageArg(*port->name()));
+           }
+         }
+         else if (tem->car() == vm().interp->makeFalse())
+           conn.principalPortLabels.push_back(label);
+         else
+           badContentMap(badFlag, loc);
+         if (!tem->cdr()->isNil())
+           badContentMap(badFlag, loc);
+       }
+       else
+         badContentMap(badFlag, loc);
+      }
+      else
+       badContentMap(badFlag, loc);
+    }
+    else
+      badContentMap(badFlag, loc);
+  }
+}
+
+void ProcessContext::endMapContent()
+{
+  if (connectableStack_.head()->ports.size() == 0)
+    delete connectableStack_.get();
+}
+void ProcessContext::badContentMap(bool &badFlag, const Location &loc)
+{
+  if (badFlag)
+    return;
+  badFlag = 1;
+  vm().interp->setNextLocation(loc);
+  vm().interp->message(InterpreterMessages::badContentMap);
+}
+
+ProcessContext::Connectable::Connectable(int nPorts, const StyleStack &ss, unsigned fol)
+: ports(nPorts), styleStack(ss), flowObjLevel(fol)
+{
+}
+
+ProcessContext::Port::Port()
+: connected(0), fotb(0)
+{
+}
+
+void ProcessContext::trace(Collector &c) const
+{
+  for (IListIter<Connection> iter(connectionStack_); !iter.done(); iter.next())
+    iter.cur()->styleStack.trace(c);
+  for (IListIter<Connectable> iter(connectableStack_); !iter.done(); iter.next())
+    iter.cur()->styleStack.trace(c);
+  for (IListIter<Table> iter(tableStack_); !iter.done(); iter.next()) {
+    c.trace(iter.cur()->rowStyle);
+    Vector<Vector<StyleObj *> > &styles = iter.cur()->columnStyles;
+    for (size_t i = 0; i < styles.size(); i++)
+      for (size_t j = 0; j < styles[i].size(); j++)
+        c.trace(styles[i][j]);
+  }
+}
+SosofoObj *SosofoObj::asSosofo()
+{
+  return this;
+}
+
+bool SosofoObj::tableBorderStyle(StyleObj *&)
+{
+  return 0;
+}
+
+bool SosofoObj::isRule()
+{
+  return 0;
+}
+
+bool SosofoObj::ruleStyle(ProcessContext &, StyleObj *&)
+{
+  return 0;
+}
+
+bool SosofoObj::isCharacter()
+{
+  return 0;
+}
+
+bool SosofoObj::characterStyle(ProcessContext &, StyleObj *&, FOTBuilder::CharacterNIC &)
+{
+  return 0;
+}
+
+AppendSosofoObj *AppendSosofoObj::asAppendSosofo()
+{
+  return this;
+}
+
+void AppendSosofoObj::process(ProcessContext &context)
+{
+  for (size_t i = 0; i < v_.size(); i++)
+    v_[i]->process(context);
+}
+
+void AppendSosofoObj::traceSubObjects(Collector &c) const
+{
+  for (size_t i = 0; i < v_.size(); i++)
+    c.trace(v_[i]);
+}
+
+void LiteralSosofoObj::process(ProcessContext &context)
+{
+  const Char *s;
+  size_t n;
+  if (str_->stringData(s, n))
+    context.currentFOTBuilder().characters(s, n);
+}
+
+void LiteralSosofoObj::traceSubObjects(Collector &c) const
+{
+  c.trace(str_);
+}
+
+void ProcessChildrenSosofoObj::process(ProcessContext &context)
+{
+  NodePtr node(context.vm().currentNode);
+  context.processChildren(mode_);
+  context.vm().currentNode = node;
+}
+
+void ProcessChildrenTrimSosofoObj::process(ProcessContext &context)
+{
+  NodePtr node(context.vm().currentNode);
+  context.processChildrenTrim(mode_);
+  context.vm().currentNode = node;
+}
+
+NextMatchSosofoObj::NextMatchSosofoObj(StyleObj *style)
+: style_(style)
+{
+}
+
+void NextMatchSosofoObj::process(ProcessContext &context)
+{
+  context.nextMatch(style_);
+}
+
+void EmptySosofoObj::process(ProcessContext &)
+{
+  // nothing needed
+}
+
+ProcessNodeListSosofoObj::ProcessNodeListSosofoObj(NodeListObj *nodeList,
+                                                  const ProcessingMode *mode)
+: nodeList_(nodeList), mode_(mode)
+{
+  hasSubObjects_ = 1;
+}
+
+void ProcessNodeListSosofoObj::process(ProcessContext &context)
+{
+  NodeListObj *nl = nodeList_;
+  Interpreter &interp = *context.vm().interp;
+  ELObjDynamicRoot protect(interp, nl);
+  for (;;) {
+    NodePtr node = nl->nodeListFirst(context.vm(), interp);
+    if (!node)
+      break;
+    bool chunk;
+    nl = nl->nodeListChunkRest(context.vm(), interp, chunk);
+    protect = nl;
+    context.processNodeSafe(node, mode_, chunk);
+  }
+}
+
+void ProcessNodeListSosofoObj::traceSubObjects(Collector &c) const
+{
+  c.trace(nodeList_);
+}
+
+ProcessNodeSosofoObj::ProcessNodeSosofoObj(const NodePtr &node, const ProcessingMode *mode)
+: node_(node), mode_(mode)
+{
+}
+
+void ProcessNodeSosofoObj::process(ProcessContext &context)
+{
+  context.processNode(node_, mode_);
+}
+
+void CurrentNodePageNumberSosofoObj::process(ProcessContext &context)
+{
+  context.currentFOTBuilder().currentNodePageNumber(node_);
+}
+
+void PageNumberSosofoObj::process(ProcessContext &context)
+{
+  context.currentFOTBuilder().pageNumber();
+}
+
+SetNonInheritedCsSosofoObj
+::SetNonInheritedCsSosofoObj(FlowObj *flowObj, const InsnPtr &code, ELObj **display, const NodePtr &node)
+: flowObj_(flowObj), code_(code), display_(display), node_(node)
+{
+  hasSubObjects_ = 1;
+}
+
+SetNonInheritedCsSosofoObj::~SetNonInheritedCsSosofoObj()
+{
+  delete [] display_;
+}
+
+ELObj *SetNonInheritedCsSosofoObj::resolve(ProcessContext &context)
+{
+  VM &vm = context.vm();
+  EvalContext::CurrentNodeSetter cns(node_, 0, vm);
+  StyleStack *saveStyleStack = vm.styleStack;
+  vm.styleStack = &context.currentStyleStack();
+  unsigned saveSpecLevel = vm.specLevel;
+  vm.specLevel = vm.styleStack->level();
+  Vector<size_t> dep;
+  vm.actualDependencies = &dep;
+  ELObj *obj = vm.eval(code_.pointer(), display_, flowObj_->copy(*vm.interp));
+  vm.styleStack = saveStyleStack;
+  vm.specLevel = saveSpecLevel;
+  if (vm.interp->isError(obj))
+    return 0;
+  return obj;
+}
+
+void SetNonInheritedCsSosofoObj::process(ProcessContext &context)
+{
+  context.startFlowObj();
+  unsigned flags = 0;
+  flowObj_->pushStyle(context, flags);
+  ELObj *obj = resolve(context);
+  if (obj) {
+    ELObjDynamicRoot protect(*context.vm().interp, obj);
+    ((FlowObj *)obj)->processInner(context);
+  }
+  flowObj_->popStyle(context, flags);
+  context.endFlowObj();
+}
+
+bool SetNonInheritedCsSosofoObj::isCharacter()
+{
+  return flowObj_->isCharacter();
+}
+
+bool SetNonInheritedCsSosofoObj::isRule()
+{
+  return flowObj_->isRule();
+}
+
+bool SetNonInheritedCsSosofoObj::characterStyle(ProcessContext &context, StyleObj *&style, FOTBuilder::CharacterNIC &nic)
+{
+  ELObj *obj = resolve(context);
+  if (obj) {
+    ELObjDynamicRoot protect(*context.vm().interp, obj);
+    return ((SosofoObj *)obj)->characterStyle(context, style, nic);
+  }
+  return 0;
+}
+
+bool SetNonInheritedCsSosofoObj::ruleStyle(ProcessContext &context, StyleObj *&style)
+{
+  ELObj *obj = resolve(context);
+  if (obj) {
+    ELObjDynamicRoot protect(*context.vm().interp, obj);
+    return ((SosofoObj *)obj)->ruleStyle(context, style);
+  }
+  return 0;
+}
+
+void SetNonInheritedCsSosofoObj::traceSubObjects(Collector &c) const
+{
+  c.trace(flowObj_);
+  if (display_)
+    for (ELObj **p = display_; *p; p++)
+      c.trace(*p);
+}
+
+LabelSosofoObj::LabelSosofoObj(SymbolObj *label, const Location &loc, SosofoObj *content)
+: label_(label), locp_(new Location(loc)), content_(content)
+{
+  hasSubObjects_ = 1;
+}
+
+void LabelSosofoObj::process(ProcessContext &context)
+{
+  context.startConnection(label_, *locp_);
+  content_->process(context);
+  context.endConnection();
+}
+
+void LabelSosofoObj::traceSubObjects(Collector &c) const
+{
+  // Symbols are permanent and don't need tracing.
+  c.trace(content_);
+}
+
+ContentMapSosofoObj::ContentMapSosofoObj(ELObj *contentMap,
+                                        const Location *locp, SosofoObj *content)
+: contentMap_(contentMap), locp_(locp), content_(content)
+{
+  hasSubObjects_ = 1;
+}
+
+void ContentMapSosofoObj::process(ProcessContext &context)
+{
+  context.startMapContent(contentMap_, *locp_);
+  content_->process(context);
+  context.endMapContent();
+}
+
+void ContentMapSosofoObj::traceSubObjects(Collector &c) const
+{
+  c.trace(contentMap_);
+  c.trace(content_);
+}
+
+DiscardLabeledSosofoObj::DiscardLabeledSosofoObj(SymbolObj *label, SosofoObj *content)
+: label_(label), content_(content)
+{
+  hasSubObjects_ = 1;
+}
+
+void DiscardLabeledSosofoObj::process(ProcessContext &context)
+{
+  context.startDiscardLabeled(label_);
+  content_->process(context);
+  context.endDiscardLabeled();
+}
+
+void DiscardLabeledSosofoObj::traceSubObjects(Collector &c) const
+{
+  c.trace(content_);
+}
+
+PageTypeSosofoObj::PageTypeSosofoObj(unsigned pageTypeFlag, SosofoObj *match, SosofoObj *noMatch)
+: pageTypeFlag_(pageTypeFlag), match_(match), noMatch_(noMatch)
+{
+  hasSubObjects_ = 1;
+}
+
+void PageTypeSosofoObj::process(ProcessContext &context)
+{
+  unsigned pageType;
+  if (context.getPageType(pageType)) {
+    if (pageType & pageTypeFlag_)
+      match_->process(context);
+    else
+      noMatch_->process(context);
+  }
+}
+
+void PageTypeSosofoObj::traceSubObjects(Collector &c) const
+{
+  c.trace(match_);
+  c.trace(noMatch_);
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
diff --git a/style/ProcessContext.h b/style/ProcessContext.h
new file mode 100644 (file)
index 0000000..ea03a8c
--- /dev/null
@@ -0,0 +1,204 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef ProcessContext_INCLUDED
+#define ProcessContext_INCLUDED 1
+
+#include "Resource.h"
+#include "Ptr.h"
+#include "Vector.h"
+#include "NCVector.h"
+#include "Owner.h"
+#include "Collector.h"
+#include "Style.h"
+#include "FOTBuilder.h"
+#include "ELObj.h"
+#include "SosofoObj.h"
+#include "VM.h"
+#include "ProcessingMode.h"
+#include "Link.h"
+#include "IList.h"
+#include "IQueue.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class Expression;
+
+class ProcessContext : public Collector::DynamicRoot {
+public:
+  ProcessContext(Interpreter &, FOTBuilder &);
+  FOTBuilder &currentFOTBuilder();
+  StyleStack &currentStyleStack();
+  void process(const NodePtr &);
+  void processNode(const NodePtr &, const ProcessingMode *, bool chunk = 1);
+  void processNodeSafe(const NodePtr &, const ProcessingMode *, bool chunk = 1);
+  void nextMatch(StyleObj *);
+  void processChildren(const ProcessingMode *);
+  void processChildrenTrim(const ProcessingMode *);
+  void trace(Collector &) const;
+  void startFlowObj();
+  void endFlowObj();
+  // Uses of label: do this
+  void startConnection(SymbolObj *, const Location &);
+  void endConnection();
+  // happens only for object with a non-principal port
+  void pushPorts(bool hasPrincipalPort,
+                const Vector<SymbolObj *> &ports, const Vector<FOTBuilder *> &fotbs);
+  void popPorts();
+  void pushPrincipalPort(FOTBuilder* principalPort);
+  void popPrincipalPort();
+  // happens inside pushPorts() (if any)
+  void startMapContent(ELObj *, const Location &);
+  void endMapContent();
+  void startDiscardLabeled(SymbolObj *);
+  void endDiscardLabeled();
+  // table support
+  void startTable();
+  void endTable();
+  void startTablePart();
+  void endTablePart();
+  void addTableColumn(unsigned columnIndex, unsigned span, StyleObj *);
+  unsigned currentTableColumn();
+  void noteTableCell(unsigned colIndex, unsigned colSpan, unsigned rowSpan);
+  StyleObj *tableColumnStyle(unsigned columnIndex, unsigned span);
+  StyleObj *tableRowStyle();
+  void startTableRow(StyleObj *);
+  bool inTable() const;
+  bool inTableRow();
+  void endTableRow();
+  void clearPageType();
+  void setPageType(unsigned);
+  bool getPageType(unsigned &) const;
+
+  VM &vm();
+private:
+  ProcessContext(const ProcessContext &); // undefined
+  void operator=(const ProcessContext &); // undefined
+  void badContentMap(bool &, const Location &);
+  void coverSpannedRows();
+  void restoreConnection(unsigned connectableLevel, size_t portIndex);
+  struct Port {
+    Port();
+    FOTBuilder *fotb;
+    IQueue<SaveFOTBuilder> saveQueue;
+    Vector<SymbolObj *> labels;
+    unsigned connected;
+  };
+  // A flow object with a port that can be connected to.
+  struct Connectable;
+  friend struct Connectable;
+  struct Connectable : public Link {
+    Connectable(int nPorts, const StyleStack &, unsigned);
+    NCVector<Port> ports;
+    StyleStack styleStack;
+    unsigned flowObjLevel;
+    Vector<SymbolObj *> principalPortLabels;
+  };
+  // An connection between a flow object and its flow parent
+  // made with label:.
+  struct Connection;
+  friend struct Connection;
+  struct Connection : public Link {
+    Connection(FOTBuilder *);
+    Connection(const StyleStack &, Port *, unsigned connectableLevel);
+    FOTBuilder *fotb;
+    StyleStack styleStack;
+    Port *port;
+    unsigned connectableLevel;
+    unsigned nBadFollow;
+  };
+  struct Table : public Link {
+    Table();
+    unsigned currentColumn;
+    // first index is column (zero-based)
+    // second is span - 1.
+    Vector<Vector<StyleObj *> > columnStyles;
+    // for each column, how many rows are covered
+    // starting with the current row
+    Vector<unsigned> covered;
+    unsigned nColumns;
+    StyleObj *rowStyle;
+    bool inTableRow;
+    unsigned rowConnectableLevel;
+  };
+  struct NodeStackEntry {
+    unsigned long elementIndex;
+    unsigned groveIndex;
+    const ProcessingMode *processingMode;
+  };
+  FOTBuilder ignoreFotb_;
+  IList<Connection> connectionStack_;
+  IList<Connectable> connectableStack_;
+  unsigned connectableStackLevel_;
+  IList<Table> tableStack_;
+  NCVector<IQueue<SaveFOTBuilder> > principalPortSaveQueues_;
+  VM vm_;
+  ProcessingMode::Specificity matchSpecificity_;
+  unsigned flowObjLevel_;
+  bool havePageType_;
+  unsigned pageType_;
+  Vector<NodeStackEntry> nodeStack_;
+  friend class CurrentNodeSetter;
+  friend struct Table;
+};
+
+inline
+FOTBuilder &ProcessContext::currentFOTBuilder()
+{
+  return *connectionStack_.head()->fotb;
+}
+
+inline
+StyleStack &ProcessContext::currentStyleStack()
+{
+  return connectionStack_.head()->styleStack;
+}
+
+inline
+VM &ProcessContext::vm()
+{
+  return vm_;
+}
+
+inline
+void ProcessContext::startFlowObj()
+{
+  flowObjLevel_++;
+}
+
+inline
+void ProcessContext::setPageType(unsigned n)
+{
+  havePageType_ = 1;
+  pageType_ = n;
+}
+
+inline
+void ProcessContext::clearPageType()
+{
+  havePageType_ = 0;
+}
+
+inline
+bool ProcessContext::getPageType(unsigned &n) const
+{
+  if (!havePageType_)
+    return 0;
+  n = pageType_;
+  return 1;
+}
+
+inline
+bool ProcessContext::inTable() const
+{
+  return !tableStack_.empty();
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not ProcessContext_INCLUDED */
+
diff --git a/style/ProcessingMode.cxx b/style/ProcessingMode.cxx
new file mode 100644 (file)
index 0000000..515a985
--- /dev/null
@@ -0,0 +1,318 @@
+// Copyright (c) 1996, 1997 James Clark
+// See the file copying.txt for copying permission.
+
+#include "stylelib.h"
+#include "ProcessingMode.h"
+#include "Interpreter.h"
+#include "MessageArg.h"
+#include "InterpreterMessages.h"
+#include "Expression.h"
+#include "Insn.h"
+#include "Insn2.h"
+#include "IListIter.h"
+#include "LocNode.h"
+#include "macros.h"
+#include <stdlib.h>
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+ProcessingMode::ProcessingMode(const StringC &name, const ProcessingMode *initial)
+: Named(name), initial_(initial), defined_(0)
+{
+}
+
+void ProcessingMode::compile(Interpreter &interp)
+{
+  for (int i = 0; i < nRuleType; i++) {
+    for (size_t j = 0; j < rootRules_[i].size(); j++)
+      rootRules_[i][j].action().compile(interp, RuleType(i));
+    for (IListIter<ElementRule> iter(elementRules_[i]); !iter.done(); iter.next())
+      iter.cur()->action().compile(interp, RuleType(i));
+  }
+}
+
+void ProcessingMode::GroveRules::build(const IList<ElementRule> *lists,
+                                      const NodePtr &node,
+                                      Messenger &)
+{
+  built = 1;
+  for (int ruleType = 0; ruleType < nRuleType; ruleType++) {
+    for (IListIter<ElementRule> iter(lists[ruleType]); !iter.done(); iter.next()) {
+      StringC gi;
+      if (iter.cur()->mustHaveGi(gi)) {
+       Interpreter::normalizeGeneralName(node, gi);
+       ElementRules *p = elementTable.lookup(gi);
+       if (!p) {
+         p = new ElementRules(gi);
+         elementTable.insert(p);
+       }
+       p->rules[ruleType].push_back(iter.cur());
+      }
+      else
+       otherRules[ruleType].push_back(iter.cur());
+    }
+  }
+  for (int ruleType = 0; ruleType < nRuleType; ruleType++) {
+    NamedTableIter<ElementRules> iter(elementTable);
+    for (;;) {
+      ElementRules *p = iter.next();
+      if (!p)
+       break;
+      size_t j = p->rules[ruleType].size();
+      p->rules[ruleType].resize(p->rules[ruleType].size() + otherRules[ruleType].size());
+      for (size_t i = 0; i < otherRules[ruleType].size(); i++)
+       p->rules[ruleType][j++] = otherRules[ruleType][i];
+      sortRules(p->rules[ruleType]);
+    }
+    sortRules(otherRules[ruleType]);
+  }
+}
+
+extern "C" {
+
+static
+int ruleCompare(const void *p1, const void *p2)
+{
+  return (*(const ProcessingMode::Rule *const *)p1)
+         ->compareSpecificity(**(const ProcessingMode::Rule *const *)p2);
+}
+
+}
+
+void ProcessingMode::GroveRules::sortRules(Vector<const ElementRule *> &v)
+{
+  qsort(&v[0], v.size(), sizeof(v[0]), ruleCompare);
+}
+
+ProcessingMode::Action::Action(unsigned partIndex, Owner<Expression> &expr,
+                          const Location &loc)
+: partIndex_(partIndex), defLoc_(loc), sosofo_(0)
+{
+  expr.swap(expr_);
+}
+
+ProcessingMode::Rule::Rule()
+{
+}
+
+ProcessingMode::Rule::Rule(const Ptr<Action> &action)
+: action_(action)
+{
+}
+
+int ProcessingMode::Rule::compareSpecificity(const Rule &r) const
+{
+  unsigned i1 = action().partIndex();
+  unsigned i2 = r.action().partIndex();
+  if (i1 == i2)
+    return 0;
+  return i1 < i2 ? -1 : 1;
+}
+
+void ProcessingMode::Action::compile(Interpreter &interp, RuleType ruleType)
+{
+  expr_->optimize(interp, Environment(), expr_);
+  ELObj *tem = expr_->constantValue();
+  if (tem) {
+    if (ruleType == constructionRule) {
+      sosofo_ = tem->asSosofo();
+      if (sosofo_)
+       return;
+    }
+  }
+  InsnPtr check;
+  if (ruleType == constructionRule)
+    check = new CheckSosofoInsn(defLoc_, check);
+  insn_ = expr_->compile(interp, Environment(), 0, check);
+}
+
+ProcessingMode::ElementRule::ElementRule(const Ptr<Action> &action,
+                                        Pattern &pattern)
+: Rule(action)
+{
+  pattern.swap(*this);
+}
+
+int ProcessingMode::ElementRule::compareSpecificity(const Rule &r) const
+{
+  int result = Rule::compareSpecificity(r);
+  if (result)
+    return result;
+  return Pattern::compareSpecificity(*this, (const ElementRule &)r);
+}
+
+void ProcessingMode::addRule(bool root,
+                            NCVector<Pattern> &patterns,
+                            Owner<Expression> &expr,
+                            RuleType ruleType,
+                            const Location &loc,
+                            Interpreter &interp)
+{
+  Ptr<Action> action = new Action(interp.currentPartIndex(), expr, loc);
+  for (size_t i = 0; i < patterns.size(); i++)
+    elementRules_[ruleType].insert(new ElementRule(action, patterns[i]));
+  if (!root)
+    return;
+  Vector<Rule> &rules = rootRules_[ruleType];
+  rules.push_back(Rule(action));
+  for (size_t i = rules.size() - 1; i > 0; i--) {
+    int cmp = rules[i - 1].compareSpecificity(rules[i]);
+    if (cmp <= 0) {
+      if (cmp == 0 && ruleType == constructionRule) {
+       interp.setNextLocation(loc);
+       interp.message(InterpreterMessages::duplicateRootRule,
+                      rules[i - 1].location());
+      }
+      break;
+    }
+    rules[i - 1].swap(rules[i]);
+  }
+}
+
+ProcessingMode::GroveRules::GroveRules()
+: built(0)
+{
+}
+
+ProcessingMode::ElementRules::ElementRules(const StringC &name)
+: Named(name)
+{
+}
+
+// Specificity gives specificity of last match; get specificity of current match.
+
+const ProcessingMode::Rule *
+ProcessingMode::findMatch(const NodePtr &node,
+                         Pattern::MatchContext &context,
+                         Messenger &mgr,
+                         Specificity &specificity) const
+{
+  GroveString gi;
+  if (node->getGi(gi) == accessOK)
+    return findElementMatch(StringC(gi.data(), gi.size()), node, context, mgr,
+                           specificity);
+  NodePtr tem;
+  if (node->getOrigin(tem) != accessOK)
+    return findRootMatch(node, context, mgr, specificity);
+  return 0;
+}
+
+
+const ProcessingMode::Rule *
+ProcessingMode::findElementMatch(const StringC &gi,
+                                const NodePtr &node,
+                                Pattern::MatchContext &context,
+                                Messenger &mgr,
+                                Specificity &specificity) const
+{
+  const Vector<const ElementRule *> *vecP = 0;
+
+  for (;;) {
+    for (;;) {
+      const ProcessingMode &mode
+       = *(initial_ && specificity.toInitial_ ? initial_ : this);
+      if (!vecP) {
+       const GroveRules &gr = mode.groveRules(node, mgr);
+       const ElementRules *er = gr.elementTable.lookup(gi);
+       vecP = er ? er->rules : gr.otherRules;
+      }
+      const Vector<const ElementRule *> &vec = vecP[specificity.ruleType_];
+      ASSERT(specificity.nextRuleIndex_ <= vec.size());
+      for (size_t &i = specificity.nextRuleIndex_; i < vec.size(); i++) {
+       if (vec[i]->trivial() || vec[i]->matches(node, context)) {
+         const Rule *rule = vec[i];
+         elementRuleAdvance(node, context, mgr, specificity, vec);
+         return rule;
+       }
+      }
+      if (!initial_)
+       break;
+      vecP = 0;
+      if (specificity.toInitial_)
+       break;
+      specificity.nextRuleIndex_ = 0;
+      specificity.toInitial_ = 1;
+    }
+    if (specificity.ruleType_ == constructionRule)
+      break;
+    specificity.ruleType_ = constructionRule;
+    specificity.nextRuleIndex_ = 0;
+    specificity.toInitial_ = 0;
+  }
+  return 0;
+}
+
+const ProcessingMode::Rule *
+ProcessingMode::findRootMatch(const NodePtr &node,
+                             Pattern::MatchContext &context,
+                             Messenger &mgr,
+                             Specificity &specificity) const
+{
+  for (;;) {
+    for (;;) {
+      const ProcessingMode &mode = *(initial_ && specificity.toInitial_ ? initial_ : this);
+      const Vector<Rule> &rules = mode.rootRules_[specificity.ruleType_];
+      if (specificity.nextRuleIndex_ < rules.size())
+       return &rules[specificity.nextRuleIndex_++];
+      if (!initial_ || specificity.toInitial_)
+       break;
+      specificity.nextRuleIndex_ = 0;
+      specificity.toInitial_ = 1;
+    }
+    if (specificity.ruleType_ == constructionRule)
+      break;
+    specificity.ruleType_ = constructionRule;
+    specificity.nextRuleIndex_ = 0;
+    specificity.toInitial_ = 0;
+  }
+  return 0;
+}
+
+const ProcessingMode::GroveRules &ProcessingMode::groveRules(const NodePtr &node,
+                                                            Messenger &mgr) const
+{
+  unsigned long n = node->groveIndex();
+  ProcessingMode *cache = (ProcessingMode *)this;
+  if (n >= groveRules_.size())
+    cache->groveRules_.resize(n + 1);
+  if (!groveRules_[n].built)
+    cache->groveRules_[n].build(elementRules_, node, mgr);
+  return groveRules_[n];
+}
+
+void ProcessingMode::elementRuleAdvance(const NodePtr &node,
+                                       Pattern::MatchContext &context,
+                                       Messenger &mgr,
+                                       Specificity &specificity,
+                                       const Vector<const ElementRule *> &vec)
+{
+  size_t &i = specificity.nextRuleIndex_;
+  if (specificity.ruleType_ != constructionRule) {
+    ++i;
+    return;
+  }
+  size_t hit = i;
+  do {
+    ++i;
+    if (i >= vec.size()
+       || vec[hit]->ElementRule::compareSpecificity(*vec[i]) != 0)
+      return;
+  } while (!(vec[i]->trivial() || vec[i]->matches(node, context)));
+
+  const LocNode *lnp;
+  Location nodeLoc;
+  if ((lnp = LocNode::convert(node)) != 0
+      && lnp->getLocation(nodeLoc) == accessOK)
+    mgr.setNextLocation(nodeLoc);
+  mgr.message(InterpreterMessages::ambiguousMatch);
+  do {
+    ++i;
+  } while (i < vec.size()
+           && vec[hit]->ElementRule::compareSpecificity(*vec[i]) == 0);
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
diff --git a/style/ProcessingMode.h b/style/ProcessingMode.h
new file mode 100644 (file)
index 0000000..6de5636
--- /dev/null
@@ -0,0 +1,199 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef ProcessingMode_INCLUDED
+#define ProcessingMode_INCLUDED 1
+
+#include "Named.h"
+#include "StringC.h"
+#include "Location.h"
+#include "Owner.h"
+#include "Vector.h"
+#include "NCVector.h"
+#include "NamedTable.h"
+#include "Expression.h"
+#include "Insn.h"
+#include "Boolean.h"
+#include "Node.h"
+#include "FOTBuilder.h"
+#include "IList.h"
+#include "Pattern.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class Interpreter;
+class SosofoObj;
+
+class ProcessingMode : public Named {
+public:
+  enum RuleType {
+    styleRule,
+    constructionRule
+  };
+  enum { nRuleType = 2 };
+
+  class Specificity {
+  public:
+    Specificity();
+    bool isStyle() const;
+  private:
+    bool toInitial_; // 1 if the match fell through from a named processing mode to
+                    // the initial processing mode
+    RuleType ruleType_;
+    size_t nextRuleIndex_;
+    friend class ProcessingMode;
+  };
+
+  class Action : public Resource {
+  public:
+    Action(unsigned partIndex, Owner<Expression> &, const Location &);
+    void compile(Interpreter &, RuleType);
+    void get(InsnPtr &, SosofoObj *&) const;
+    const Location &location() const;
+    unsigned partIndex() const;
+  private:
+    Location defLoc_;
+    Owner<Expression> expr_;
+    // One of these will be non-null.
+    InsnPtr insn_;
+    // must be permanent
+    SosofoObj *sosofo_;
+    unsigned partIndex_;
+  };
+
+  class Rule {
+  public:
+    Rule();
+    Rule(const Ptr<Action> &);
+    const Action &action() const;
+    Action &action();
+    virtual int compareSpecificity(const Rule &) const;
+    const Location &location() const;
+    void swap(Rule &);
+  private:
+    Ptr<Action> action_;
+  };
+
+  class ElementRule : public Rule, public Pattern, public Link {
+  public:
+    ElementRule(const Ptr<Action> &, Pattern &);
+    int compareSpecificity(const Rule &) const;
+  };
+
+  ProcessingMode(const StringC &, const ProcessingMode *initial = 0);
+  void addRule(bool matchesRoot, NCVector<Pattern> &, Owner<Expression> &expr,
+              RuleType, const Location &, Interpreter &);
+  // Specificity gives specificity of last match; gets specificity of current match.
+  const Rule *findMatch(const NodePtr &, Pattern::MatchContext &, Messenger &,
+                       Specificity &) const;
+  void compile(Interpreter &);
+  bool defined() const;
+  void setDefined();
+
+  struct ElementRules : public Named {
+  public:
+    ElementRules(const StringC &);
+    Vector<const ElementRule *> rules[nRuleType];
+  };
+
+  struct GroveRules {
+    GroveRules();
+    bool built;
+    NamedTable<ElementRules> elementTable;
+    Vector<const ElementRule *> otherRules[nRuleType];
+    void build(const IList<ElementRule> *, const NodePtr &, Messenger &);
+    static void sortRules(Vector<const ElementRule *> &v);
+  };
+private:
+  const Rule *findElementMatch(const StringC &, const NodePtr &,
+                              Pattern::MatchContext &, Messenger &,
+                              Specificity &) const;
+  const Rule *findRootMatch(const NodePtr &, Pattern::MatchContext &, Messenger &,
+                           Specificity &) const;
+  const GroveRules &groveRules(const NodePtr &, Messenger &) const;
+  static void elementRuleAdvance(const NodePtr &nd, Pattern::MatchContext &context,
+                         Messenger &mgr, Specificity &specificity,
+                         const Vector<const ElementRule *> &vec);
+
+  Vector<Rule> rootRules_[nRuleType];
+  IList<ElementRule> elementRules_[nRuleType];
+  NCVector<GroveRules> groveRules_;
+  const ProcessingMode *initial_; // 0 for initial mode
+  bool defined_;
+};
+
+
+inline
+bool ProcessingMode::defined() const
+{
+  return defined_;
+}
+
+inline
+void ProcessingMode::setDefined()
+{
+  defined_ = 1;
+}
+
+inline
+ProcessingMode::Specificity::Specificity()
+: toInitial_(0), nextRuleIndex_(0), ruleType_(styleRule)
+{
+}
+
+inline
+bool ProcessingMode::Specificity::isStyle() const
+{
+  return ruleType_ == styleRule;
+}
+
+inline
+void ProcessingMode::Action::get(InsnPtr &insn, SosofoObj *&sosofo) const
+{
+  insn = insn_;
+  sosofo = sosofo_;
+}
+
+inline
+const Location &ProcessingMode::Action::location() const
+{
+  return defLoc_;
+}
+
+inline
+ProcessingMode::Action &ProcessingMode::Rule::action()
+{
+  return *action_;
+}
+
+inline
+const ProcessingMode::Action &ProcessingMode::Rule::action() const
+{
+  return *action_;
+}
+
+inline
+unsigned ProcessingMode::Action::partIndex() const
+{
+  return partIndex_;
+}
+
+inline
+const Location &ProcessingMode::Rule::location() const
+{
+  return action_->location();
+}
+
+inline
+void ProcessingMode::Rule::swap(Rule &r)
+{
+  action_.swap(r.action_);
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not ProcessingMode_INCLUDED */
diff --git a/style/SchemeParser.cxx b/style/SchemeParser.cxx
new file mode 100644 (file)
index 0000000..1fae36d
--- /dev/null
@@ -0,0 +1,2479 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#include "stylelib.h"
+#include "SchemeParser.h"
+#include "InterpreterMessages.h"
+#include "Pattern.h"
+#include "MacroFlowObj.h"
+#include "macros.h"
+#include <stdlib.h>
+#include "LangObj.h"
+#include "VM.h"
+#include "ELObjMessageArg.h"
+#include "DssslSpecEventHandler.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+const Char defaultChar = 0xfffd;
+
+SchemeParser::SchemeParser(Interpreter &interp,
+                          Owner<InputSource> &in)
+: interp_(&interp),
+  defMode_(interp.initialProcessingMode()),
+  dsssl2_(interp.dsssl2()),
+  lang_(0)
+{
+  in_.swap(in);
+  {
+    StringC tem(Interpreter::makeStringC("ISO/IEC 10036/RA//Glyphs"));
+    afiiPublicId_ = interp_->storePublicId(tem.data(), tem.size(), Location());
+  }
+}
+
+void SchemeParser::parseStandardChars() 
+{
+  for (;;) {
+    Token tok;
+    if (!getToken(allowIdentifier|allowEndOfEntity, tok) 
+         || tok == tokenEndOfEntity)
+      break;
+
+    StringC name(currentToken_);
+
+    if (!getToken(allowOtherExpr, tok) || tok != tokenNumber) {
+      message(InterpreterMessages::badDeclaration);
+      break;
+    }
+
+    int i; 
+    for (i = 0; i < name.size(); i++) 
+      if (interp_->lexCategory(name[i]) != Interpreter::lexLetter
+          && ((i == 0) || 
+              (interp_->lexCategory(name[i]) != Interpreter::lexDigit
+               && name[i] != '-' && name[i] != '.'))) 
+        break;
+    if (i < name.size() || name.size() == 1) {
+      message(InterpreterMessages::invalidCharName,
+              StringMessageArg(name));
+      continue;
+    } 
+
+    for (i = 0; i < currentToken_.size(); i++)
+      if (interp_->lexCategory(currentToken_[i]) != Interpreter::lexDigit)
+        break;       
+    if (i < currentToken_.size()) {
+      message(InterpreterMessages::invalidCharNumber,
+              StringMessageArg(currentToken_));
+      continue;
+    }
+
+    interp_->addStandardChar(name, currentToken_);
+  }
+}
+
+void SchemeParser::parseNameChars()
+{
+  for (;;) {
+    // FIXME we do not check that we have valid character names
+    Token tok;
+    if (!getToken(allowIdentifier|allowEndOfEntity, tok) 
+         || tok == tokenEndOfEntity)
+      break;
+    interp_->addNameChar(currentToken_);
+  }
+}
+
+void SchemeParser::parseSeparatorChars()
+{
+  for (;;) {
+    // FIXME we do not check that we have valid character names
+    Token tok;
+    if (!getToken(allowIdentifier|allowEndOfEntity, tok)
+        || tok == tokenEndOfEntity)
+      break;
+    interp_->addSeparatorChar(currentToken_);
+  }
+}
+
+void SchemeParser::parseMapSdataEntity(const StringC &ename, const StringC &etext)
+{
+  Token tok;
+  if (!getToken(allowIdentifier|allowEndOfEntity, tok) 
+       || tok == tokenEndOfEntity) {
+    message(InterpreterMessages::badDeclaration);
+    return;
+  }
+
+  interp_->addSdataEntity(ename, etext, currentToken_);
+}
+
+void SchemeParser::parse()
+{
+  bool recovering = 0;
+  for (;;) {
+    Token tok;
+    if (!getToken(recovering ? ~0 : allowOpenParen|allowEndOfEntity,
+                tok))
+      recovering = 1;
+    else {
+      if (tok == tokenEndOfEntity)
+       break;
+      if (tok != tokenOpenParen
+         || !getToken(recovering ? ~0 : unsigned(allowIdentifier), tok)
+         || tok != tokenIdentifier)
+       recovering = 1;
+      else {
+       const Identifier *ident = lookup(currentToken_);
+       Identifier::SyntacticKey key;
+       if (!ident->syntacticKey(key)) {
+         if (!recovering)
+           message(InterpreterMessages::unknownTopLevelForm,
+                   StringMessageArg(currentToken_));
+         recovering = 1;
+       }
+       else {
+         switch (key) {
+         case Identifier::keyDefine:
+           recovering = !doDefine();
+           break;
+         case Identifier::keyDefineUnit:
+           recovering = !doDefineUnit();
+           break;
+         case Identifier::keyDefault:
+           recovering = !doDefault();
+           break;
+         case Identifier::keyElement:
+           recovering = !doElement();
+           break;
+         case Identifier::keyOrElement:
+           recovering = !doOrElement();
+           break;
+         case Identifier::keyRoot:
+           recovering = !doRoot();
+           break;
+         case Identifier::keyId:
+           recovering = !doId();
+           break;
+         case Identifier::keyMode:
+           recovering = !doMode();
+           break;
+         case Identifier::keyDeclareInitialValue:
+           recovering = !doDeclareInitialValue();
+           break;
+         case Identifier::keyDeclareCharacteristic:
+           recovering = !doDeclareCharacteristic();
+           break;
+         case Identifier::keyDeclareFlowObjectClass:
+           recovering = !doDeclareFlowObjectClass();
+           break;
+         case Identifier::keyDeclareClassAttribute:
+           recovering = !doDeclareClassAttribute();
+           break;
+         case Identifier::keyDeclareIdAttribute:
+           recovering = !doDeclareIdAttribute();
+           break;
+         case Identifier::keyDeclareFlowObjectMacro:
+           recovering = !doDeclareFlowObjectMacro();
+           break;
+         case Identifier::keyDeclareDefaultLanguage:
+            recovering = !doDeclareDefaultLanguage();
+            break;
+         case Identifier::keyDefineLanguage:
+            recovering = !doDefineLanguage();
+            break;
+         case Identifier::keyDeclareCharProperty:
+            recovering = !doDeclareCharProperty();
+            break;
+         case Identifier::keyAddCharProperties:
+            recovering = !doAddCharProperties();
+            break;
+         case Identifier::keyDeclareCharCharacteristicAndProperty:
+           recovering = !doDeclareCharCharacteristicAndProperty();
+           break;
+         case Identifier::keyDeclareReferenceValueType:
+         case Identifier::keyDefinePageModel:
+         case Identifier::keyDefineColumnSetModel:
+           recovering = !skipForm();
+           break;
+         default:
+           if (!recovering)
+             message(InterpreterMessages::unknownTopLevelForm,
+                     StringMessageArg(currentToken_));
+           recovering = 1;
+           break;
+         }
+       }
+      }
+    }
+  }
+#if 0
+  NamedTableIter<Identifier> iter(identTable_);
+  for (;;) {
+    Identifier *ident = iter.next();
+    if (!ident)
+      break;
+    Location loc;
+    unsigned part;
+    if (ident->defined(part, loc)) {
+      ELObj *obj = ident->computeValue(1, *this);
+      if (!isError(obj)) {
+       *os_ << ident->name() << "=";
+       obj->print(*this, *os_);
+       *os_ << OutputCharStream::newline;
+       os_->flush();
+      }
+    }
+  }
+#endif
+}
+
+bool SchemeParser::parseExpression(Owner<Expression> &expr)
+{
+  Identifier::SyntacticKey key;
+  Token tok;
+  if (!parseExpression(0, expr, key, tok))
+    return 0;
+  getToken(allowEndOfEntity, tok);
+  return 1;
+}
+
+bool SchemeParser::doMode()
+{
+  Token tok;
+  if (!getToken(allowIdentifier, tok))
+    return 0;
+  defMode_ = lookupProcessingMode(currentToken_);
+  defMode_->setDefined();
+  for (;;) {
+    if (!getToken(allowOpenParen|allowCloseParen, tok))
+      return 0;
+    if (tok == tokenCloseParen)
+      break;
+    if (!getToken(allowIdentifier, tok))
+      return 0;
+    const Identifier *ident = lookup(currentToken_);
+    Identifier::SyntacticKey key;
+    if (!ident->syntacticKey(key)) {
+      message(InterpreterMessages::badModeForm,
+             StringMessageArg(currentToken_));
+      return 0;
+    }
+    else {
+      switch (key) {
+      case Identifier::keyDefault:
+       if (!doDefault())
+         return 0;
+       break;
+      case Identifier::keyElement:
+       if (!doElement())
+         return 0;
+       break;
+      case Identifier::keyOrElement:
+       if (!doOrElement())
+         return 0;
+       break;
+      case Identifier::keyRoot:
+       if (!doRoot())
+         return 0;
+       break;
+      case Identifier::keyId:
+       if (!doId())
+         return 0;
+       break;
+      default:
+       message(InterpreterMessages::badModeForm,
+               StringMessageArg(currentToken_));
+       return 0;
+      }
+    }
+  }
+  defMode_ = interp_->initialProcessingMode();
+  return 1;
+}
+
+bool SchemeParser::doElement()
+{
+  Location loc(in_->currentLocation());
+  Token tok;
+  ELObj *obj;
+  if (!parseDatum(0, obj, loc, tok))
+    return 0;
+  NCVector<Pattern> patterns(1);
+  Owner<Expression> expr;
+  ProcessingMode::RuleType ruleType;
+  if (interp_->convertToPattern(obj, loc, patterns[0])) {
+    if (!parseRuleBody(expr, ruleType))
+      return 0;
+    defMode_->addRule(0, patterns, expr, ruleType, loc, *interp_);
+  }
+  else if (!parseRuleBody(expr, ruleType))
+    return 0;
+  return 1;
+}
+
+bool SchemeParser::doOrElement()
+{
+  Location loc(in_->currentLocation());
+  Token tok;
+  if (!getToken(allowOpenParen, tok))
+    return 0;
+  NCVector<Pattern> patterns;
+  unsigned allowed = 0;
+  bool ok = 1;
+  for (;;) {
+    ELObj *obj;
+    if (!parseDatum(allowed, obj, loc, tok))
+      return 0;
+    if (!obj)
+      break;
+    allowed = allowCloseParen;
+    if (ok) {
+      patterns.resize(patterns.size() + 1);
+      if (!interp_->convertToPattern(obj, loc, patterns.back()))
+       ok = 0;
+    }
+  }
+  ProcessingMode::RuleType ruleType;
+  Owner<Expression> expr;
+  if (!parseRuleBody(expr, ruleType))
+    return 0;
+  if (ok)
+    defMode_->addRule(0, patterns, expr, ruleType, loc, *interp_);
+  return 1;
+}
+
+bool SchemeParser::doId()
+{
+  Location loc(in_->currentLocation());
+  Token tok;
+  if (!getToken(allowString|allowIdentifier, tok))
+    return 0;
+  StringC id(currentToken_);
+  Owner<Expression> expr;
+  ProcessingMode::RuleType ruleType;
+  if (!parseRuleBody(expr, ruleType))
+    return 0;
+  IList<Pattern::Element> list;
+  Pattern::Element *elem = new Pattern::Element(StringC());
+  list.insert(elem);
+  elem->addQualifier(new Pattern::IdQualifier(id));
+  Pattern pattern(list);
+  NCVector<Pattern> patterns(1);
+  patterns[0].swap(pattern);
+  defMode_->addRule(0, patterns, expr, ruleType, loc, *interp_);
+  return 1;
+}
+
+bool SchemeParser::doDefault()
+{
+  Location loc(in_->currentLocation());
+  Owner<Expression> expr;
+  ProcessingMode::RuleType ruleType;
+  if (!parseRuleBody(expr, ruleType))
+    return 0;
+  IList<Pattern::Element> list;
+  list.insert(new Pattern::Element(StringC()));
+  Pattern pattern(list);
+  NCVector<Pattern> patterns(1);
+  pattern.swap(patterns[0]);
+  defMode_->addRule(0, patterns, expr, ruleType, loc, *interp_);
+  return 1;
+}
+
+bool SchemeParser::doRoot()
+{
+  Location loc(in_->currentLocation());
+  Owner<Expression> expr;
+  ProcessingMode::RuleType ruleType;
+  if (!parseRuleBody(expr, ruleType))
+    return 0;
+  NCVector<Pattern> patterns;
+  defMode_->addRule(1, patterns, expr, ruleType, loc, *interp_);
+  return 1;
+}
+
+bool SchemeParser::parseRuleBody(Owner<Expression> &expr, ProcessingMode::RuleType &ruleType)
+{
+  Token tok;
+  Identifier::SyntacticKey key;
+  if (!parseExpression(0, expr, key, tok))
+    return 0;
+  const Identifier *k = dsssl2() ? expr->keyword() : 0;
+  if (k) {
+    // style rule
+    Vector<const Identifier *> keys;
+    NCVector<Owner<Expression> > exprs;
+    for (;;) {
+      keys.push_back(k);
+      exprs.resize(exprs.size() + 1);
+      if (!parseExpression(0, exprs.back(), key, tok))
+        return 0;
+      if (!getToken(allowKeyword|allowCloseParen, tok))
+       return 0;
+      if (tok == tokenCloseParen)
+       break;
+      k = lookup(currentToken_);
+    }
+    expr = new StyleExpression(keys, exprs, expr->location());
+    ruleType = ProcessingMode::styleRule;
+  }
+  else {
+    ruleType = ProcessingMode::constructionRule;
+    if (!getToken(allowCloseParen, tok))
+      return 0;
+  }
+  return 1;
+}
+
+bool SchemeParser::doDeclareInitialValue()
+{
+  Token tok;
+  if (!getToken(allowIdentifier, tok))
+    return 0;
+  Identifier *ident = lookup(currentToken_);
+  if (ident->inheritedC().isNull())
+    message(InterpreterMessages::notABuiltinInheritedC,
+           StringMessageArg(ident->name()));
+  Owner<Expression> expr;
+  Identifier::SyntacticKey key;
+  if (!parseExpression(0, expr, key, tok))
+    return 0;
+  if (!getToken(allowCloseParen, tok))
+    return 0;
+  if (ident->inheritedC().isNull())
+    return 1;
+  interp_->installInitialValue(ident, expr);
+  return 1;
+}
+
+bool SchemeParser::doDeclareCharCharacteristicAndProperty()
+{
+  Location loc(in_->currentLocation());
+  Token tok;
+  if (!getToken(allowIdentifier, tok))
+    return 0;
+  Identifier *ident = lookup(currentToken_);
+  if (!getToken(allowString|(dsssl2() ? unsigned(allowFalse) : 0), tok))
+    return 0;
+  StringC pubid;
+  if (tok == tokenString)
+    pubid = currentToken_;
+  Owner<Expression> expr;
+  Identifier::SyntacticKey key;
+  if (!parseExpression(0, expr, key, tok))
+    return 0;
+  if (!getToken(allowCloseParen, tok))
+    return 0;
+  Location defLoc;
+  unsigned defPart;
+  if (ident->inheritedCDefined(defPart, defLoc)) {
+      interp_->setNextLocation(loc);
+      interp_->message(InterpreterMessages::duplicateCharacteristic,
+                      StringMessageArg(ident->name()),
+                      defLoc);
+  } 
+  else if (ident->charNICDefined(defPart, defLoc)
+           && defPart <= interp_->currentPartIndex()) {
+    if (defPart == interp_->currentPartIndex()) {
+      interp_->setNextLocation(loc);
+      interp_->message(InterpreterMessages::duplicateCharacteristic,
+                      StringMessageArg(ident->name()),
+                      defLoc);
+    }
+  }
+  else {
+    interp_->installExtensionCharNIC(ident, pubid, loc);
+    interp_->addCharProperty(ident, expr);
+  }
+  return 1;
+}
+
+bool SchemeParser::doDeclareCharacteristic()
+{
+  Location loc(in_->currentLocation());
+  Token tok;
+  if (!getToken(allowIdentifier, tok))
+    return 0;
+  Identifier *ident = lookup(currentToken_);
+  if (!getToken(allowString|(dsssl2() ? unsigned(allowFalse) : 0), tok))
+    return 0;
+  StringC pubid;
+  if (tok == tokenString)
+    pubid = currentToken_;
+  Owner<Expression> expr;
+  Identifier::SyntacticKey key;
+  if (!parseExpression(0, expr, key, tok))
+    return 0;
+  if (!getToken(allowCloseParen, tok))
+    return 0;
+  Location defLoc;
+  unsigned defPart;
+  if (ident->charNICDefined(defPart, defLoc)) {
+      interp_->setNextLocation(loc);
+      interp_->message(InterpreterMessages::duplicateCharacteristic,
+                      StringMessageArg(ident->name()),
+                      defLoc);
+  } 
+  else if (ident->inheritedCDefined(defPart, defLoc)
+           && defPart <= interp_->currentPartIndex()) {
+    if (defPart == interp_->currentPartIndex()) {
+      interp_->setNextLocation(loc);
+      interp_->message(InterpreterMessages::duplicateCharacteristic,
+                      StringMessageArg(ident->name()),
+                      defLoc);
+    }
+  }
+  else {
+    interp_->installExtensionInheritedC(ident, pubid, loc);
+    interp_->installInitialValue(ident, expr);
+  }
+  return 1;
+}
+
+bool SchemeParser::doDeclareFlowObjectClass()
+{
+  Location loc(in_->currentLocation());
+  Token tok;
+  if (!getToken(allowIdentifier, tok))
+    return 0;
+  Identifier *ident = lookup(currentToken_);
+  if (!getToken(allowString, tok))
+    return 0;
+  Location defLoc;
+  unsigned defPart;
+  if (ident->inheritedCDefined(defPart, defLoc)
+      && defPart <= interp_->currentPartIndex()) {
+    if (defPart == interp_->currentPartIndex()) {
+      interp_->setNextLocation(loc);
+      interp_->message(InterpreterMessages::duplicateFlowObjectClass,
+                      StringMessageArg(ident->name()),
+                      defLoc);
+    }
+  }
+  else
+    interp_->installExtensionFlowObjectClass(ident, currentToken_, loc);
+  if (!getToken(allowCloseParen, tok))
+    return 0;
+  return 1;
+}
+
+bool SchemeParser::doDeclareFlowObjectMacro()
+{
+  Location loc(in_->currentLocation());
+  Token tok;
+  if (!getToken(allowIdentifier, tok))
+    return 0;
+  Identifier *ident = lookup(currentToken_);
+  if (ident->flowObj())
+    // FIXME report an error if same part
+    ;
+  if (!getToken(allowOpenParen, tok))
+    return 0;
+  Vector<const Identifier *> nics;
+  NCVector<Owner<Expression> > inits;
+  const Identifier *contentsId = 0;
+  unsigned allowed = (allowOpenParen|allowCloseParen|allowIdentifier|allowHashContents);
+  for (;;) {
+    if (!getToken(allowed, tok))
+      return 0;
+    if (tok == tokenCloseParen)
+      break;
+    switch (tok) {
+    case tokenHashContents:
+      if (!getToken(allowIdentifier, tok))
+       return 0;
+      contentsId = lookup(currentToken_);
+      allowed = allowCloseParen;
+      break;
+    case tokenIdentifier:
+      nics.push_back(lookup(currentToken_));
+      break;
+    case tokenOpenParen:
+      {
+       if (!getToken(allowIdentifier, tok))
+         return 0;
+       nics.push_back(lookup(currentToken_));
+       inits.resize(nics.size());
+       Identifier::SyntacticKey key;
+       if (!parseExpression(0, inits.back(), key, tok))
+         return 0;
+       if (!getToken(allowCloseParen, tok))
+         return 0;
+      }
+      break;
+    default:
+      CANNOT_HAPPEN();
+    }
+  }
+  // We could allow sequence which is appended together here.
+  Owner<Expression> body;
+  Identifier::SyntacticKey key;
+  if (!parseExpression(0, body, key, tok))
+    return 0;
+  if (!getToken(allowCloseParen, tok))
+    return 0;
+  Location defLoc;
+  unsigned defPart;
+  if (ident->inheritedCDefined(defPart, defLoc)
+      && defPart <= interp_->currentPartIndex()) {
+    if (defPart == interp_->currentPartIndex()) {
+      interp_->setNextLocation(loc);
+      interp_->message(InterpreterMessages::duplicateFlowObjectClass,
+                      StringMessageArg(ident->name()),
+                      defLoc);
+    }
+  }
+  else {
+    MacroFlowObj *flowObj
+      = new (*interp_) MacroFlowObj(nics, inits, contentsId, body);
+    interp_->makePermanent(flowObj);
+    ident->setFlowObj(flowObj);
+  }
+  return 1;
+}
+
+bool SchemeParser::doDeclareClassAttribute()
+{
+  Token tok;
+  if (!getToken(allowString|allowIdentifier, tok))
+    return 0;
+  interp_->addClassAttributeName(currentToken_);
+  if (!getToken(allowCloseParen, tok))
+    return 0;
+  return 1;
+}
+
+bool SchemeParser::doDeclareIdAttribute()
+{
+  Token tok;
+  if (!getToken(allowString|allowIdentifier, tok))
+    return 0;
+  interp_->addIdAttributeName(currentToken_);
+  if (!getToken(allowCloseParen, tok))
+    return 0;
+  return 1;
+}
+
+bool SchemeParser::doDefine()
+{
+  Location loc(in_->currentLocation());
+  Token tok;
+  if (!getToken(allowOpenParen|allowIdentifier, tok))
+    return 0;
+  Vector<const Identifier *> formals;
+  bool isProcedure;
+  if (tok == tokenOpenParen) {
+    if (!getToken(allowIdentifier, tok))
+      return 0;
+    isProcedure = 1;
+  }
+  else
+    isProcedure = 0;
+  Identifier *ident = lookup(currentToken_);
+  Identifier::SyntacticKey key;
+  if (ident->syntacticKey(key) && key <= int(Identifier::lastSyntacticKey))
+    message(InterpreterMessages::syntacticKeywordAsVariable,
+           StringMessageArg(currentToken_));
+  NCVector<Owner<Expression> > inits;
+  int nOptional;
+  int nKey;
+  bool hasRest;
+  if (isProcedure && !parseFormals(formals, inits, nOptional, hasRest, nKey))
+    return 0;
+  Owner<Expression> expr;
+  if (isProcedure) {
+    if (!parseBegin(expr))
+      return 0;
+  }
+  else {
+    if (!parseExpression(0, expr, key, tok))
+      return 0;
+    if (!getToken(allowCloseParen, tok))
+      return 0;
+  }
+  if (isProcedure)
+    expr = new LambdaExpression(formals, inits, nOptional, hasRest, nKey,
+                               expr, loc);
+  Location defLoc;
+  unsigned defPart;
+  if (ident->defined(defPart, defLoc)
+      && defPart <= interp_->currentPartIndex()) {
+    if (defPart == interp_->currentPartIndex())
+      message(InterpreterMessages::duplicateDefinition,
+             StringMessageArg(ident->name()),
+             defLoc);
+  }
+  else
+    ident->setDefinition(expr, interp_->currentPartIndex(), loc);
+  return 1;
+}
+
+bool SchemeParser::doDefineUnit()
+{
+  Location loc(in_->currentLocation());
+  Token tok;
+  if (!getToken(allowIdentifier, tok))
+    return 0;
+  int i;
+  for (i = 0; i < currentToken_.size(); i++)
+    if (interp_->lexCategory(currentToken_[i]) != Interpreter::lexLetter)
+      break;
+  if ((i < currentToken_.size())
+       || ((currentToken_.size() == 1) && (currentToken_[0] =='e'))) {
+    message(InterpreterMessages::invalidUnitName,
+            StringMessageArg(currentToken_));
+    return 0;
+  } 
+
+  Unit *unit = interp_->lookupUnit(currentToken_);
+  Owner<Expression> expr;
+  Identifier::SyntacticKey key;
+  if (!parseExpression(0, expr, key, tok))
+    return 0;
+  if (!getToken(allowCloseParen, tok))
+    return 0;
+  Location defLoc;
+  unsigned defPart;
+  if (unit->defined(defPart, defLoc)
+      && defPart <= interp_->currentPartIndex()) {
+    if (defPart == interp_->currentPartIndex())
+      message(InterpreterMessages::duplicateUnitDefinition,
+             StringMessageArg(unit->name()),
+             defLoc);
+  }
+  else
+    unit->setDefinition(expr, interp_->currentPartIndex(), loc);
+  return 1;
+}
+
+bool SchemeParser::skipForm()
+{
+  static const unsigned allow = (~0 & ~allowEndOfEntity);
+  unsigned level = 0;
+  for (;;) {
+    Token tok;
+    if (!getToken(allow, tok))
+      break;
+    switch (tok) {
+    case tokenOpenParen:
+      level++;
+      break;
+    case tokenCloseParen:
+      if (level == 0)
+       return 1;
+      level--;
+      break;
+    default:
+      break;
+    }
+  }
+  return 0;
+}
+
+bool SchemeParser::parseExpression(unsigned allowed,
+                                 Owner<Expression> &expr,
+                                 Identifier::SyntacticKey &key,
+                                 Token &tok)
+{
+  expr.clear();
+  key = Identifier::notKey;
+  ELObj *obj;
+  if (!parseSelfEvaluating(allowed, obj, tok))
+    return 0;
+  if (obj) {
+    interp_->makePermanent(obj);
+    expr = new ConstantExpression(obj, in_->currentLocation());
+    return 1;
+  }
+  switch (tok) {
+  case tokenQuote:
+    {
+      Location loc;
+      if (!parseDatum(0, obj, loc, tok))
+       return 0;
+      interp_->makePermanent(obj);
+      expr = new ConstantExpression(obj, loc);
+      break;
+    }
+  case tokenQuasiquote:
+    {
+      bool spliced;
+      return parseQuasiquoteTemplate(0, 0, expr, key, tok, spliced);
+    }
+  case tokenOpenParen:
+    {
+      Location loc(in_->currentLocation());
+      if (!parseExpression(allowExpressionKey, expr, key, tok))
+       return 0;
+      if (expr) {
+       NCVector<Owner<Expression> > args;
+       for (;;) {
+         args.resize(args.size() + 1);
+         if (!parseExpression(allowCloseParen, args.back(), key, tok))
+           return 0;
+         if (!args.back()) {
+           args.resize(args.size() - 1);
+           break;
+         }
+       }
+       expr = new CallExpression(expr, args, loc);
+      }
+      else {
+       switch (key) {
+       case Identifier::keyQuote:
+          return parseQuote(expr);
+       case Identifier::keyLambda:
+         return parseLambda(expr);
+       case Identifier::keyIf:
+         return parseIf(expr);
+       case Identifier::keyCond:
+         return parseCond(expr);
+       case Identifier::keyAnd:
+         return parseAnd(expr);
+       case Identifier::keyOr:
+         return parseOr(expr);
+       case Identifier::keyCase:
+         return parseCase(expr);
+       case Identifier::keyLet:
+         return parseLet(expr);
+       case Identifier::keyLetStar:
+         return parseLetStar(expr);
+       case Identifier::keyLetrec:
+         return parseLetrec(expr);
+        case Identifier::keyThereExists:
+          return parseSpecialQuery(expr, "node-list-some?");
+        case Identifier::keyForAll:
+          return parseSpecialQuery(expr, "node-list-every?");
+        case Identifier::keySelectEach:
+          return parseSpecialQuery(expr, "node-list-filter");
+        case Identifier::keyUnionForEach:
+          return parseSpecialQuery(expr, "node-list-union-map");
+       case Identifier::keyMake:
+         return parseMake(expr);
+       case Identifier::keyStyle:
+         return parseStyle(expr);
+       case Identifier::keyWithMode:
+         return parseWithMode(expr);
+       case Identifier::keyQuasiquote:
+         return parseQuasiquote(expr);
+       case Identifier::keySet:
+         return parseSet(expr);
+       case Identifier::keyBegin:
+         return parseBegin(expr);
+       default:
+         CANNOT_HAPPEN();
+       }
+      }
+      break;
+    }
+  case tokenIdentifier:
+    {
+      const Identifier *ident = lookup(currentToken_);
+      if (ident->syntacticKey(key) && key <= int(Identifier::lastSyntacticKey)) {
+       switch (key) {
+       case Identifier::keyDefine:
+         if (allowed & allowKeyDefine)
+           return 1;
+         break;
+       case Identifier::keyArrow:
+         if (allowed & allowKeyArrow)
+           return 1;
+         break;
+       case Identifier::keyElse:
+         if (allowed & allowKeyElse)
+           return 1;
+         break;
+       case Identifier::keyUnquote:
+       case Identifier::keyUnquoteSplicing:
+         break;
+       default:
+         if (allowed & allowExpressionKey)
+           return 1;
+         break;
+       }
+       message(InterpreterMessages::syntacticKeywordAsVariable,
+               StringMessageArg(currentToken_));
+      }
+      expr = new VariableExpression(ident, in_->currentLocation());
+    }
+    break;
+  default:
+    break;
+  }
+  return 1;
+}
+
+
+bool SchemeParser::parseQuote(Owner<Expression> &expr)
+{
+  Token tok;
+  Location loc;
+  ELObj *obj;
+  if (!parseDatum(0, obj, loc, tok))
+    return 0;
+  if (!getToken(allowCloseParen, tok))
+    return 0;
+  interp_->makePermanent(obj);
+  expr = new ConstantExpression(obj, loc);
+  return 1;
+}
+
+bool SchemeParser::parseQuasiquote(Owner<Expression> &expr)
+{
+  bool spliced;
+  Token tok;
+  Identifier::SyntacticKey key;
+  if (!parseQuasiquoteTemplate(0, 0, expr, key, tok, spliced))
+    return 0;
+  return getToken(allowCloseParen, tok);
+}
+
+bool SchemeParser::parseQuasiquoteTemplate(unsigned level,
+                                         unsigned allowed,
+                                         Owner<Expression> &expr,
+                                         Identifier::SyntacticKey &key,
+                                         Token &tok,
+                                         bool &spliced)
+{
+  key = Identifier::notKey;
+  spliced = 0;
+  ELObj *obj;
+  if (!parseSelfEvaluating(allowed|allowUnquote|allowVector, obj, tok))
+    return 0;
+  switch (tok) {
+  case tokenQuasiquote:
+    if (!parseQuasiquoteTemplate(level + 1, 0, expr, key, tok, spliced))
+      return 0;
+    createQuasiquoteAbbreviation("quasiquote", expr);
+    break;
+  case tokenQuote:
+    if (!parseQuasiquoteTemplate(level, 0, expr, key, tok, spliced))
+      break;
+    createQuasiquoteAbbreviation("quote", expr);
+    break;
+  case tokenUnquote:
+  case tokenUnquoteSplicing:
+    if (level == 0) {
+      spliced = (tok == tokenUnquoteSplicing);
+      if (!parseExpression(0, expr, key, tok))
+       return 0;
+    }
+    else {
+      Token tem;
+      if (!parseQuasiquoteTemplate(level - 1, 0, expr, key, tem, spliced))
+       break;
+      createQuasiquoteAbbreviation(tok == tokenUnquote ? "unquote" : "unquote-splicing", expr);
+    }
+    break;
+  case tokenOpenParen:
+  case tokenVector:      
+    {
+      QuasiquoteExpression::Type type
+       = (tok == tokenVector
+          ? QuasiquoteExpression::vectorType
+          : QuasiquoteExpression::listType);
+      Location loc(in_->currentLocation());
+      NCVector<Owner<Expression> > exprs(1);
+      Vector<PackedBoolean> exprsSpliced;
+      bool temSpliced;
+      if (!parseQuasiquoteTemplate(level,
+                                  allowCloseParen|allowQuasiquoteKey|allowUnquoteSplicing,
+                                  exprs[0], key, tok, temSpliced))
+       return 0;
+      if (!exprs[0]) {
+       switch (key) {
+       case Identifier::keyQuasiquote:
+         if (!parseQuasiquoteTemplate(level + 1, 0, expr, key, tok, spliced))
+           return 0;
+         createQuasiquoteAbbreviation("quasiquotation", expr);
+         break;
+       case Identifier::keyUnquoteSplicing:
+         spliced = 1;
+         // fall through
+       case Identifier::keyUnquote:
+         if (level == 0) {
+           if (!parseExpression(0, expr, key, tok))
+             return 0;
+         }
+         else {
+           if (!parseQuasiquoteTemplate(level - 1, 0, expr, key, tok, temSpliced))
+             return 0;
+           createQuasiquoteAbbreviation(spliced ? "unquote-splicing" : "unquote", expr);
+           spliced = 0;
+         }
+         break;
+       default:
+          expr = new ConstantExpression(interp_->makeNil(), loc);
+          return 1;
+       }
+       return getToken(allowCloseParen, tok);
+      }
+      exprsSpliced.push_back(PackedBoolean(temSpliced));
+      for (;;) {
+       Owner<Expression> tem;
+       if (!parseQuasiquoteTemplate(level,
+                                    allowCloseParen|allowUnquoteSplicing
+                                    |(type == QuasiquoteExpression::vectorType
+                                      ? 0
+                                      : allowPeriod),
+                                    tem, key, tok, temSpliced))
+         return 0;
+       if (!tem) {
+         if (tok == tokenCloseParen)
+           break;
+         exprs.resize(exprs.size() + 1);
+         type = QuasiquoteExpression::improperType;
+         if (!parseQuasiquoteTemplate(level, 0, exprs.back(), key, tok, temSpliced))
+           return 0;
+         if (!getToken(allowCloseParen, tok))
+           return 0;
+         exprsSpliced.push_back(0);
+         break;
+       }
+       exprs.resize(exprs.size() + 1);
+       exprs.back().swap(tem);
+       exprsSpliced.push_back(PackedBoolean(temSpliced));
+      }
+      expr = new QuasiquoteExpression(exprs, exprsSpliced, type, loc);
+    }
+    break;
+  case tokenIdentifier:
+    if (allowed & allowQuasiquoteKey) {
+      const Identifier *ident = lookup(currentToken_);
+      if (ident->syntacticKey(key)) {
+       switch (key) {
+       case Identifier::keyUnquoteSplicing:
+       case Identifier::keyUnquote:
+       case Identifier::keyQuasiquote:
+         return 1;
+       default:
+         break;
+       }
+      }
+    }
+    obj = interp_->makeSymbol(currentToken_);
+    // fall through
+  default:
+    if (obj) {
+      interp_->makePermanent(obj);
+      expr = new ConstantExpression(obj, in_->currentLocation());
+    }
+    break;
+  }
+  return 1;
+}
+
+void SchemeParser::createQuasiquoteAbbreviation(const char *sym, Owner<Expression> &expr)
+{
+  Location loc(expr->location());
+  NCVector<Owner<Expression> > v(2);
+  v[1].swap(expr);
+  v[0] = new ConstantExpression(interp_->makeSymbol(Interpreter::makeStringC(sym)), loc);
+  Vector<PackedBoolean> spliced;
+  spliced.push_back(0);
+  spliced.push_back(0);
+  expr = new QuasiquoteExpression(v, spliced, QuasiquoteExpression::listType, loc);
+}
+
+bool SchemeParser::parseIf(Owner<Expression> &expr)
+{
+  Location loc(in_->currentLocation());
+  Owner<Expression> expr0, expr1, expr2;
+  Token tok;
+  Identifier::SyntacticKey key;
+  if (!parseExpression(0, expr0, key, tok)
+      || !parseExpression(0, expr1, key, tok)      
+      || !parseExpression(dsssl2() ? allowCloseParen : 0, expr2, key, tok))
+    return 0;
+  if (!expr2)
+    expr2 = new ConstantExpression(interp_->makeUnspecified(), in_->currentLocation());
+  else if (!getToken(allowCloseParen, tok))
+    return 0;
+  expr = new IfExpression(expr0, expr1, expr2, loc);
+  return 1;
+}
+
+bool SchemeParser::parseCond(Owner<Expression> &expr, bool opt)
+{
+  Location loc(in_->currentLocation());
+  Token tok;
+  if (!getToken(allowOpenParen|(opt ? unsigned(allowCloseParen) : 0), tok))
+    return 0;
+  if (tok == tokenCloseParen) {
+    if (dsssl2())
+      expr = new ConstantExpression(interp_->makeUnspecified(), loc);
+    else
+      expr = new CondFailExpression(loc);
+    return 1;
+  }
+  Identifier::SyntacticKey key;
+  Owner<Expression> testExpr;
+  if (!parseExpression(allowKeyElse, testExpr, key, tok))
+    return 0;
+  if (!testExpr) {
+    if (!parseBegin(expr))
+      return 0;
+    return getToken(allowCloseParen, tok);
+  }
+  NCVector<Owner<Expression> > valExprs;
+  for (;;) {
+    Owner<Expression> tem;
+    if (!parseExpression(allowCloseParen, tem, key, tok))
+      return 0;
+    if (!tem)
+      break;
+    valExprs.resize(valExprs.size() + 1);
+    tem.swap(valExprs.back());
+  }
+  Owner<Expression> valExpr;
+  if (valExprs.size() == 1)
+    valExprs[0].swap(valExpr);
+  else if (valExprs.size())
+    valExpr = new SequenceExpression(valExprs, valExprs[0]->location());
+  Owner<Expression> elseExpr;
+  if (!parseCond(elseExpr, 1))
+    return 0;
+  if (valExpr)
+    expr = new IfExpression(testExpr, valExpr, elseExpr, loc);
+  else
+    expr = new OrExpression(testExpr, elseExpr, loc);
+  return 1;
+}
+
+bool SchemeParser::parseCase(Owner<Expression> &expr)
+{
+  Owner<Expression> keyExpr;
+  Owner<Expression> elseClause;
+  NCVector<CaseExpression::Case> cases;
+  Location loc(in_->currentLocation());
+  Token tok;
+  Identifier::SyntacticKey key;
+  if (!parseExpression(0, keyExpr, key, tok))
+    return 0;
+  for (;;) {
+    if (!getToken(allowOpenParen
+      |(cases.size() ? unsigned(allowCloseParen) : 0), tok))
+      return 0;
+    if (tok == tokenCloseParen)
+      break;
+    if (!getToken(allowOpenParen|allowIdentifier, tok))
+      return 0;
+    if (tok == tokenOpenParen) {
+      cases.resize(cases.size() + 1);
+      Location loc;
+      for (;;) {
+       ELObj *obj;
+       if (!parseDatum(allowCloseParen, obj, loc, tok))
+         return 0;
+       if (tok == tokenCloseParen)
+         break;
+       interp_->makePermanent(obj);
+       cases.back().datums.push_back(obj);
+      }
+      if (!parseBegin(cases.back().expr))
+       return 0;
+    }
+    else {
+      const Identifier *ident = lookup(currentToken_);
+      if (ident->syntacticKey(key) && key == Identifier::keyElse) {
+       if (!parseBegin(elseClause))
+         return 0;
+       if (!getToken(allowCloseParen, tok))
+         return 0;
+       break;
+      }
+      else {
+       message(InterpreterMessages::caseElse,
+               StringMessageArg(currentToken_));
+       return 0;
+      }
+    }
+  }
+  if (dsssl2() && !elseClause)
+    elseClause = new ConstantExpression(interp_->makeUnspecified(), loc);
+  expr = new CaseExpression(keyExpr, cases, elseClause, loc);
+  return 1;
+}
+
+bool SchemeParser::parseOr(Owner<Expression> &expr)
+{
+  Location loc(in_->currentLocation());
+  Token tok;
+  Identifier::SyntacticKey key;
+  Owner<Expression> test1Expr;
+  if (!parseExpression(allowCloseParen, test1Expr, key, tok))
+    return 0;
+  if (!test1Expr) {
+    expr = new ConstantExpression(interp_->makeFalse(), loc);
+    return 1;
+  }
+  Owner<Expression> test2Expr;
+  if (!parseOr(test2Expr))
+    return 0;
+  expr = new OrExpression(test1Expr, test2Expr, loc);
+  return 1;
+}
+
+bool SchemeParser::parseAnd(Owner<Expression> &expr, bool opt)
+{
+  Location loc(in_->currentLocation());
+  Token tok;
+  Identifier::SyntacticKey key;
+  Owner<Expression> testExpr;
+  if (!parseExpression(allowCloseParen, testExpr, key, tok))
+    return 0;
+  if (!testExpr) {
+    if (!opt)
+      expr = new ConstantExpression(interp_->makeTrue(), loc);
+    return 1;
+  }
+  Owner<Expression> restExpr;
+  if (!parseAnd(restExpr, 1))
+    return 0;
+  if (!restExpr)
+    testExpr.swap(expr);
+  else {
+    // This relies on the fact that #f is the only false value.
+    Owner<Expression> falseExpr(new ConstantExpression(interp_->makeFalse(), loc));
+    expr = new IfExpression(testExpr, restExpr, falseExpr, loc);
+  }
+  return 1;
+}
+
+bool SchemeParser::parseBegin(Owner<Expression> &expr)
+{
+  Location loc(in_->currentLocation());
+  Token tok;
+  Identifier::SyntacticKey key;
+  if (!parseExpression(0, expr, key, tok))
+    return 0;
+  if (dsssl2()) {
+    NCVector<Owner<Expression> > exprs;
+    for (size_t i = 1;; i++) {
+      Owner<Expression> tem;
+      if (!parseExpression(allowCloseParen, tem, key, tok))
+       return 0;
+      if (!tem)
+       break;
+      exprs.resize(i + 1);
+      tem.swap(exprs[i]);
+    }
+    if (exprs.size()) {
+      expr.swap(exprs[0]);
+      expr = new SequenceExpression(exprs, loc);
+    }
+    return 1;
+  }
+  else
+    return getToken(allowCloseParen, tok);
+}
+
+bool SchemeParser::parseSet(Owner<Expression> &expr)
+{
+  Location loc(in_->currentLocation());
+  Token tok;
+  if (!getToken(allowIdentifier, tok))
+      return 0;
+  const Identifier *var = lookup(currentToken_);
+  Identifier::SyntacticKey key;
+  Owner<Expression> value;
+  if (!parseExpression(0, value, key, tok))
+    return 0;
+  if (!getToken(allowCloseParen, tok))
+    return 0;
+  expr = new AssignmentExpression(var, value, loc);
+  return 1;
+}
+
+bool SchemeParser::parseWithMode(Owner<Expression> &expr)
+{
+  Location loc(in_->currentLocation());
+  Token tok;
+  if (!getToken(allowIdentifier|allowFalse, tok))
+    return 0;
+  const ProcessingMode *mode;
+  if (tok == tokenFalse)
+    mode = interp_->initialProcessingMode();
+  else
+    mode = interp_->lookupProcessingMode(currentToken_);
+  Owner<Expression> content;
+  Identifier::SyntacticKey key;
+  if (!parseExpression(0, content, key, tok))
+    return 0;
+  if (!getToken(allowCloseParen, tok))
+    return 0;
+  expr = new WithModeExpression(mode, content, loc);
+  return 1;
+}
+
+bool SchemeParser::parseMake(Owner<Expression> &expr)
+{
+  Location loc(in_->currentLocation());
+  Token tok;
+  if (!getToken(allowIdentifier, tok))
+    return 0;
+  const Identifier *foc = lookup(currentToken_);
+  NCVector<Owner<Expression> > exprs;
+  Vector<const Identifier *> keys;
+  for (;;) {
+    Owner<Expression> tem;
+    Identifier::SyntacticKey key;
+    if (!parseExpression(allowCloseParen, tem, key, tok))
+      return 0;
+    if (!tem)
+      break;
+    if (keys.size() == exprs.size()) {
+      const Identifier *k = tem->keyword();
+      if (k) {
+       tem.clear();
+       if (!parseExpression(0, tem, key, tok))
+         return 0;
+        size_t i;
+        for (i = 0; i < keys.size(); i++) 
+          if (keys[i]->name() == k->name()) 
+            break;
+        if (i < keys.size())
+          continue;
+        keys.push_back(k);
+      }
+    }
+    exprs.resize(exprs.size() + 1);
+    tem.swap(exprs.back());
+  }
+  expr = new MakeExpression(foc, keys, exprs, loc);
+  return 1; 
+}
+
+bool SchemeParser::parseStyle(Owner<Expression> &expr)
+{
+  Location loc(in_->currentLocation());
+  NCVector<Owner<Expression> > exprs;
+  Vector<const Identifier *> keys;
+  for (;;) {
+    Token tok;
+    if (!getToken(allowKeyword|allowCloseParen, tok))
+      return 0;
+    if (tok == tokenCloseParen)
+      break;
+    keys.resize(keys.size() + 1);
+    keys.back() = lookup(currentToken_);
+    exprs.resize(exprs.size() + 1);
+    Identifier::SyntacticKey key;
+    if (!parseExpression(0, exprs.back(), key, tok))
+      return 0;
+  }
+  expr = new StyleExpression(keys, exprs, loc);
+  return 1; 
+}
+
+bool SchemeParser::parseLambda(Owner<Expression> &expr)
+{
+  Location loc(in_->currentLocation());
+  Token tok;
+  if (!getToken(allowOpenParen, tok))
+    return 0;
+  Vector<const Identifier *> formals;
+  NCVector<Owner<Expression> > inits;
+  int nOptional;
+  int nKey;
+  bool hasRest;
+  if (!parseFormals(formals, inits, nOptional, hasRest, nKey))
+    return 0;
+  Owner<Expression> body;
+  if (!parseBegin(body))
+    return 0;
+  expr = new LambdaExpression(formals, inits, nOptional, hasRest, nKey,
+                             body, loc);
+  return 1;
+}
+
+// The rest arg is put last.
+
+bool SchemeParser::parseFormals(Vector<const Identifier *> &formals,
+                              NCVector<Owner<Expression> > &inits,
+                              int &nOptional,
+                              bool &hasRest,
+                              int &nKey)
+{
+  Token tok;
+  enum FormalType { required, optional, rest, key } type = required;
+  unsigned allowed = (allowCloseParen|allowIdentifier
+                     |allowHashOptional|allowHashRest|allowHashKey);
+  int argCount[4];
+  for (int i = 0; i < 4; i++)
+    argCount[i] = 0;
+  for (;;) {
+    if (!getToken(allowed, tok))
+      return 0;
+    switch (tok) {
+    case tokenHashOptional:
+      allowed |= allowOpenParen;
+      allowed &= ~allowHashOptional;
+      type = optional;
+      break;
+    case tokenHashRest:
+      allowed = allowIdentifier;
+      type = rest;
+      break;
+    case tokenHashKey:
+      allowed = (allowOpenParen|allowCloseParen|allowIdentifier);
+      type = key;
+      break;
+    case tokenOpenParen:
+      {
+       if (!getToken(allowIdentifier, tok))
+         return 0;
+       argCount[type]++;
+       formals.push_back(lookup(currentToken_));
+       inits.resize(argCount[optional] + argCount[key]);
+       Identifier::SyntacticKey key;
+       if (!parseExpression(0, inits.back(), key, tok))
+         return 0;
+       if (!getToken(allowCloseParen, tok))
+         return 0;
+      }
+      break;
+    case tokenIdentifier:
+      {
+       formals.push_back(lookup(currentToken_));
+       argCount[type]++;
+       if (type == rest)
+         allowed = (allowHashKey|allowCloseParen);
+      }
+      break;
+    case tokenCloseParen:
+      goto done;
+    default:
+      CANNOT_HAPPEN();
+    }
+  }
+done:
+  nOptional = argCount[optional];
+  nKey = argCount[key];
+  inits.resize(nOptional + nKey);
+  hasRest = argCount[rest];
+  return 1;
+}
+
+bool SchemeParser::parseLet(Owner<Expression> &expr)
+{
+  Location loc(in_->currentLocation());
+  Token tok;
+  if (!getToken(allowOpenParen|allowIdentifier, tok))
+    return 0;
+  Vector<const Identifier *> vars;
+  NCVector<Owner<Expression> > inits;
+  Owner<Expression> body;
+  const Identifier *name;
+  if (tok == tokenOpenParen) {
+    name = 0;
+    if (!parseBindingsAndBody1(vars, inits, body))
+      return 0;
+  }
+  else {
+    name = lookup(currentToken_);
+    if (!parseBindingsAndBody(vars, inits, body))
+      return 0;
+  }
+  if (name) {
+    // Named let
+    NCVector<Owner<Expression> > loopInit(1);
+    NCVector<Owner<Expression> > argsInit;
+    loopInit[0] = new LambdaExpression(vars, argsInit, 0, 0, 0, body, loc);
+    Vector<const Identifier *> loopFormal(1);
+    loopFormal[0] = name;
+    expr = new VariableExpression(name, loc);
+    expr = new LetrecExpression(loopFormal, loopInit, expr, loc);
+    expr = new CallExpression(expr, inits, loc);
+ }
+ else
+   expr = new LetExpression(vars, inits, body, loc);
+ return 1;
+}
+
+bool SchemeParser::parseLetStar(Owner<Expression> &expr)
+{
+  Location loc(in_->currentLocation());
+  Vector<const Identifier *> vars;
+  NCVector<Owner<Expression> > inits;
+  Owner<Expression> body;
+  if (!parseBindingsAndBody(vars, inits, body))
+    return 0;
+  expr = new LetStarExpression(vars, inits, body, loc);
+  return 1;
+}
+
+bool SchemeParser::parseLetrec(Owner<Expression> &expr)
+{
+  Location loc(in_->currentLocation());
+  Vector<const Identifier *> vars;
+  NCVector<Owner<Expression> > inits;
+  Owner<Expression> body;
+  if (!parseBindingsAndBody(vars, inits, body))
+    return 0;
+  expr = new LetrecExpression(vars, inits, body, loc);
+  return 1;
+}
+
+bool SchemeParser::parseBindingsAndBody(Vector<const Identifier *> &vars,
+                                      NCVector<Owner<Expression> > &inits,
+                                      Owner<Expression> &body)
+{
+  Token tok;
+  if (!getToken(allowOpenParen, tok))
+    return 0;
+  return parseBindingsAndBody1(vars, inits, body);
+}
+
+bool SchemeParser::parseBindingsAndBody1(Vector<const Identifier *> &vars,
+                                       NCVector<Owner<Expression> > &inits,
+                                       Owner<Expression> &body)
+{
+  Token tok;
+  Identifier::SyntacticKey key;
+  for (;;) {
+    if (!getToken(allowCloseParen|allowOpenParen, tok))
+      return 0;
+    if (tok == tokenCloseParen)
+      break;
+    if (!getToken(allowIdentifier, tok))
+      return 0;
+    vars.push_back(lookup(currentToken_));
+    inits.resize(inits.size() + 1);
+    if (!parseExpression(0, inits.back(), key, tok))
+      return 0;
+    if (!getToken(allowCloseParen, tok))
+      return 0;
+  }
+  return parseBegin(body);
+}
+
+bool SchemeParser::parseDatum(unsigned otherAllowed,
+                            ELObj *&result,
+                            Location &loc,
+                            Token &tok)
+{
+  if (!parseSelfEvaluating(otherAllowed|allowVector|allowUnquote|allowUnquoteSplicing, result, tok))
+    return 0;
+  loc = in_->currentLocation();
+  if (result)
+    return 1;
+  switch (tok) {
+  case tokenIdentifier:
+    result = interp_->makeSymbol(currentToken_);
+    break;
+  case tokenQuote:
+    return parseAbbreviation("quote", result);
+  case tokenQuasiquote:
+    return parseAbbreviation("quasiquote", result);
+  case tokenUnquote:
+    return parseAbbreviation("unquote", result);
+  case tokenUnquoteSplicing:
+    return parseAbbreviation("unquote-splicing", result);
+  case tokenOpenParen:
+    {
+      ELObj *tem;
+      Location ignore;
+      if (!parseDatum(allowCloseParen, tem, ignore, tok))
+       return 0;
+      if (!tem) {
+       result = interp_->makeNil();
+       break;
+      }
+      ELObjDynamicRoot list(*interp_, tem);
+      PairObj *last = new (*interp_) PairObj(tem, 0);
+      list = last;
+      for (;;) {
+       if (!parseDatum(allowCloseParen|allowPeriod, tem, ignore, tok))
+         return 0;
+       if (!tem) {
+         if (tok == tokenCloseParen) {
+           last->setCdr(interp_->makeNil());
+           break;
+         }
+         if (!parseDatum(0, tem, ignore, tok))
+           return 0;
+         last->setCdr(tem);
+         if (!getToken(allowCloseParen, tok))
+           return 0;
+         break;
+       }
+       last->setCdr(tem); // to protect it
+       PairObj *p = new (*interp_) PairObj(tem, 0);
+       last->setCdr(p);
+       last = p;
+      }
+      result = list;
+    }
+    break;
+  case tokenVector:
+    {
+      VectorObj *v = new (*interp_) VectorObj;
+      ELObjDynamicRoot protect(*interp_, v);
+      Vector<ELObj *> &vec = *v;
+      Location ignore;
+      for (;;) {
+       ELObj *tem;
+       if (!parseDatum(allowCloseParen, tem, ignore, tok))
+         return 0;
+       if (!tem)
+         break;
+       vec.push_back(tem);
+      }
+      result = v;
+    }
+    break;
+  default:
+    break;
+  }
+  return 1;
+}
+
+bool SchemeParser::parseSelfEvaluating(unsigned otherAllowed,
+                                     ELObj *&result,
+                                     Token &tok)
+{
+  if (!getToken(allowExpr|otherAllowed, tok))
+    return 0;
+  switch (tok) {
+  case tokenTrue:
+    result = interp_->makeTrue();
+    break;
+  case tokenFalse:
+    result = interp_->makeFalse();
+    break;
+  case tokenVoid:
+    result = interp_->makeUnspecified();
+    break;
+  case tokenString:
+    result = new (*interp_) StringObj(currentToken_);
+    break;
+  case tokenKeyword:
+    result = interp_->makeKeyword(currentToken_);
+    break;
+  case tokenChar:
+    result = interp_->makeChar(currentToken_[0]);
+    break;
+  case tokenNumber:
+    result = interp_->convertNumber(currentToken_);
+    if (!result) {
+      message(InterpreterMessages::invalidNumber,
+             StringMessageArg(currentToken_));
+      result = interp_->makeError();
+    }
+    break;
+  case tokenGlyphId:
+    result = convertAfiiGlyphId(currentToken_);
+    break;
+  default:
+    result = 0;
+    break;
+  }
+  return 1;
+}
+
+bool SchemeParser::parseAbbreviation(const char *sym, ELObj *&result)
+{
+  SymbolObj *quoteSym = interp_->makeSymbol(Interpreter::makeStringC(sym));
+  ELObj *obj;
+  Location ignore;
+  Token tok;
+  if (!parseDatum(0, obj, ignore, tok))
+    return 0;
+  ELObjDynamicRoot protect(*interp_, obj);
+  protect = new (*interp_) PairObj(protect, interp_->makeNil());
+  result = interp_->makePair(quoteSym, protect);
+  return 1;
+}
+
+bool SchemeParser::getToken(unsigned allowed, Token &tok)
+{
+  InputSource *in = in_.pointer();
+  for (;;) {
+    in->startToken();
+    Xchar c = in->tokenChar(*this);
+    switch (c) {
+    case InputSource::eE:
+      if (!(allowed & allowEndOfEntity))
+       return tokenRecover(allowed, tok);
+      tok = tokenEndOfEntity;
+      return 1;
+    case '(':
+      if (!(allowed & allowOpenParen))
+       return tokenRecover(allowed, tok);
+      tok = tokenOpenParen;
+      return 1;
+    case ')':
+      if (!(allowed & allowCloseParen))
+       return tokenRecover(allowed, tok);
+      tok = tokenCloseParen;
+      return 1;
+    case '\'':
+      if (!(allowed & allowOtherExpr))
+       return tokenRecover(allowed, tok);
+      tok = tokenQuote;
+      return 1;
+    case '`':
+      if (!(allowed & allowOtherExpr))
+       return tokenRecover(allowed, tok);
+      tok = tokenQuasiquote;
+      return 1;
+    case ',':
+      c = in->tokenChar(*this);
+      if (c == '@') {
+       if (!(allowed & allowUnquoteSplicing))
+         return tokenRecover(allowed, tok);
+       tok = tokenUnquoteSplicing;
+      }
+      else {
+       if (!(allowed & allowUnquote))
+         return tokenRecover(allowed, tok);
+       tok = tokenUnquote;
+       in->endToken(1);
+      }
+      return 1;
+    case ' ':
+    case '\r':
+    case '\n':
+    case '\t':
+    case '\f':
+      // whitespace
+      break;
+    case '#':
+      c = in->tokenChar(*this);
+      switch (c) {
+      case 't':
+       if (!(allowed & allowOtherExpr))
+         return tokenRecover(allowed, tok);
+       tok = tokenTrue;
+       return 1;
+      case 'f':
+       if (!(allowed & allowFalse))
+         return tokenRecover(allowed, tok);
+       tok = tokenFalse;
+       return 1;
+      case '\\':
+       {
+         c = in->tokenChar(*this);
+         if (c == InputSource::eE) {
+           message(InterpreterMessages::unexpectedEof);
+           if (allowed & allowEndOfEntity) {
+             tok = tokenEndOfEntity;
+             return 1;
+           }
+           return 0;
+         }
+         if (!(allowed & allowOtherExpr)) {
+           extendToken();
+           return tokenRecover(allowed, tok);
+         }
+         in->discardInitial();
+         extendToken();
+         tok = tokenChar;
+         if (in->currentTokenLength() == 1) {
+           currentToken_.assign(in->currentTokenStart(), 1);
+         }
+         else {
+           StringC tem(in->currentTokenStart(), in->currentTokenLength());
+           currentToken_.resize(1);
+           if (!interp_->convertCharName(tem, currentToken_[0])) {
+             message(InterpreterMessages::unknownCharName,
+                     StringMessageArg(tem));
+             currentToken_[0] = defaultChar;
+           }
+         }
+         return 1;
+       }
+      case '!':
+       {
+         extendToken();
+         StringC tem(in->currentTokenStart() + 2,
+                     in->currentTokenLength() - 2);
+         if (tem == Interpreter::makeStringC("optional")) {
+           if (!(allowed & allowHashOptional))
+             return tokenRecover(allowed, tok);
+           tok = tokenHashOptional;
+           return 1;
+         }
+         if (tem == Interpreter::makeStringC("key")) {
+           if (!(allowed & allowHashKey))
+             return tokenRecover(allowed, tok);
+           tok = tokenHashKey;
+           return 1;
+         }
+         if (tem == Interpreter::makeStringC("rest")) {
+           if (!(allowed & allowHashRest))
+             return tokenRecover(allowed, tok);
+           tok = tokenHashRest;
+           return 1;
+         }
+         if (tem == Interpreter::makeStringC("contents")) {
+           if (!(allowed & allowHashContents))
+             return tokenRecover(allowed, tok);
+           tok = tokenHashContents;
+           return 1;
+         }
+         message(InterpreterMessages::unknownNamedConstant,
+                 StringMessageArg(tem));
+         break;
+       }
+      case 'b':
+      case 'o':
+      case 'x':
+      case 'd':
+       extendToken();
+       if (!(allowed & allowOtherExpr))
+         return tokenRecover(allowed, tok);
+       tok = tokenNumber;
+       currentToken_.assign(in->currentTokenStart(),
+                             in->currentTokenLength());
+       return 1;
+      case 'A':
+       extendToken();
+       if (!(allowed & allowOtherExpr))
+         return tokenRecover(allowed, tok);
+       tok = tokenGlyphId;
+       currentToken_.assign(in->currentTokenStart() + 2,
+                             in->currentTokenLength() - 2);
+       return 1;
+      case InputSource::eE:
+       message(InterpreterMessages::unexpectedEof);
+       if (allowed & allowEndOfEntity) {
+         tok = tokenEndOfEntity;
+         return 1;
+       }
+       return 0;
+      case 'v':
+       if (dsssl2()) {
+         if (!(allowed & allowOtherExpr))
+           return tokenRecover(allowed, tok);
+         tok = tokenVoid;
+         return 1;
+       }
+       // fall through
+      case '(':
+       if (dsssl2()) {
+         if (!(allowed & allowVector))
+           return tokenRecover(allowed, tok);
+         tok = tokenVector;
+         return 1;
+       }
+       //fall through
+      default:
+       message(InterpreterMessages::unknownHash);
+       break;  
+      }
+      break;
+    case '"':
+      if (!(allowed & allowString))
+       return tokenRecover(allowed, tok);
+      return scanString(allowed, tok);
+    case ';':
+      skipComment();
+      break;
+    case '.':
+      extendToken();
+      switch (in->currentTokenLength()) {
+      case 1:
+       if (!(allowed & allowPeriod))
+         return tokenRecover(allowed, tok);
+       tok = tokenPeriod;
+       return 1;
+      case 3:
+        if (in_->currentTokenStart()[1] == '.'
+           && in_->currentTokenStart()[2] == '.')
+         return handleIdentifier(allowed, tok);
+       break;
+      }
+      return handleNumber(allowed, tok);
+    default:
+      switch (interp_->lexCategory(c)) {
+      case Interpreter::lexAddWhiteSpace:
+       break;
+      case Interpreter::lexOtherNumberStart:
+       extendToken();
+       // handle + and - as identifiers
+       if (in->currentTokenLength() == 1)
+         return handleIdentifier(allowed, tok);
+       return handleNumber(allowed, tok);
+      case Interpreter::lexDigit:
+       extendToken();
+       return handleNumber(allowed, tok);
+      case Interpreter::lexOther:
+       if (c < ' ') {
+         // ignore control characters
+         message(InterpreterMessages::invalidChar);
+         break;
+       }
+       in->ungetToken();
+       // fall through
+      default:
+       {
+         bool invalid = 0;
+         size_t length = in->currentTokenLength();
+         for (;;) {
+           Interpreter::LexCategory lc = interp_->lexCategory(in->tokenChar(*this));
+           if (lc > Interpreter::lexOther)
+             break;
+           if (lc == Interpreter::lexOther)
+             invalid = 1;
+           length++;
+         }
+         in->endToken(length);
+
+         if (in->currentTokenEnd()[-1] == ':' 
+              && in->currentTokenLength() > 1) {
+           if (!(allowed & allowKeyword))
+             return tokenRecover(allowed, tok);
+           currentToken_.assign(in->currentTokenStart(),
+                                in->currentTokenLength() - 1);
+           tok = tokenKeyword;
+           if (invalid || (currentToken_.size() > 1 
+                  && currentToken_[currentToken_.size() - 1] == ':'))
+             message(InterpreterMessages::invalidIdentifier, 
+                     StringMessageArg(currentToken_));
+           return 1;
+         }
+         if (invalid)
+           message(InterpreterMessages::invalidIdentifier, 
+                   StringMessageArg(StringC(in->currentTokenStart(),
+                                            in->currentTokenLength())));
+         return handleIdentifier(allowed, tok);
+       }
+      }
+    }
+  }
+}
+
+bool SchemeParser::handleNumber(unsigned allowed, Token &tok)
+{
+  if (!(allowed & allowOtherExpr))
+    return tokenRecover(allowed, tok);
+  tok = tokenNumber;
+  currentToken_.assign(in_->currentTokenStart(),
+                      in_->currentTokenLength());
+  return 1;
+}
+
+bool SchemeParser::handleIdentifier(unsigned allowed, Token &tok)
+{
+  if (!(allowed & allowIdentifier))
+    return tokenRecover(allowed, tok);
+  currentToken_.assign(in_->currentTokenStart(),
+                      in_->currentTokenLength());
+  tok = tokenIdentifier;
+  return 1;
+}
+
+bool SchemeParser::tokenRecover(unsigned allowed, Token &tok)
+{
+  if (allowed == allowCloseParen) {
+    in_->ungetToken();
+    tok = tokenCloseParen;
+    message(InterpreterMessages::missingCloseParen);
+    return 1;
+  }
+  if (in_->currentTokenLength() == 0)
+    message(InterpreterMessages::unexpectedEof);
+  else
+    message(InterpreterMessages::unexpectedToken,
+            StringMessageArg(StringC(in_->currentTokenStart(),
+                                    in_->currentTokenLength())));
+  return 0;
+}
+
+void SchemeParser::extendToken()
+{
+  // extend to a delimiter
+  InputSource *in = in_.pointer();
+  size_t length = in->currentTokenLength();
+  while (interp_->lexCategory(in->tokenChar(*this))
+         <= Interpreter::lexOther)
+    length++;
+  in->endToken(length);
+}
+
+bool SchemeParser::scanString(unsigned allowed, Token &tok)
+{
+  InputSource *in = in_.pointer();
+  currentToken_.resize(0);
+  for (;;) {
+    Xchar c = in->tokenChar(*this);
+    switch (c) {
+    case InputSource::eE:
+      message(InterpreterMessages::unterminatedString);
+      in->endToken(1);
+      return 0;
+    case '"':
+      tok = tokenString;
+      return 1;
+    case '\\':
+      c = in->tokenChar(*this);
+      if (c == '\\' || c == '"')
+       currentToken_ += c;
+      else if (c == InputSource::eE)
+       break;
+      else {
+       StringC name;
+       name += c;
+       while (interp_->lexCategory(c = in->tokenChar(*this)) < Interpreter::lexOther)
+         name += c;
+       if (c != ';')
+         in->endToken(in->currentTokenLength() - 1);
+       Char ch;
+       if (interp_->convertCharName(name, ch))
+         currentToken_ += ch;
+       else
+         message(InterpreterMessages::unknownCharName, StringMessageArg(name));
+      }
+      break;
+    default:
+      currentToken_ += c;
+      break;
+    }
+  }
+  return 0; // not reached
+}
+
+void SchemeParser::skipComment()
+{
+  for (;;) {
+    Xchar c = in_->get(*this);
+    if (c == InputSource::eE || c == '\r')
+      break;
+  }
+}
+
+ELObj *SchemeParser::convertAfiiGlyphId(const StringC &str)
+{
+  unsigned long n = 0;
+  for (size_t i = 0; i < str.size(); i++) {
+    if (str[i] < '0' || str[i] > '9') {
+      n = 0;
+      break;
+    }
+    // FIXME check for overflow
+    n = n*10 + (str[i] - '0');
+  }
+  if (n == 0) {
+    message(InterpreterMessages::invalidAfiiGlyphId, StringMessageArg(str));
+    return 0;
+  }
+  return new (*interp_) GlyphIdObj(FOTBuilder::GlyphId(afiiPublicId_, n));
+}
+
+void SchemeParser::dispatchMessage(Message &msg)
+{
+  interp_->dispatchMessage(msg);
+}
+
+void SchemeParser::dispatchMessage(const Message &msg)
+{
+  interp_->dispatchMessage(msg);
+}
+
+void SchemeParser::initMessage(Message &msg)
+{
+  if (in_)
+    msg.loc = in_->currentLocation();
+}
+
+bool SchemeParser::doDeclareDefaultLanguage()
+{
+  Location loc(in_->currentLocation());
+  Owner<Expression> expr;
+  Token tok;
+  Identifier::SyntacticKey key;
+  if (!parseExpression(0, expr, key, tok))
+    return 0;
+  if (!getToken(allowCloseParen, tok))
+    return 0;
+  Location defLoc;
+  unsigned defPart;
+  if(interp_->defaultLanguageSet(defPart, defLoc)
+     && defPart <= interp_->currentPartIndex()) {
+    if(defPart == interp_->currentPartIndex()) {
+      interp_->setNextLocation(loc);
+      message(InterpreterMessages::duplicateDefLangDecl, defLoc);
+    }
+  }
+  else
+    interp_->setDefaultLanguage(expr, interp_->currentPartIndex(), loc);
+  return 1;
+}
+
+bool SchemeParser::doDefineLanguage()
+{
+  Location loc(in_->currentLocation());
+  Token tok;
+  if (!getToken(allowIdentifier, tok))
+    return 0;
+  Identifier *ident = lookup(currentToken_);
+  Identifier::SyntacticKey key;
+  if (ident->syntacticKey(key) && (key <= int(Identifier::lastSyntacticKey)))
+    message(InterpreterMessages::syntacticKeywordAsVariable,
+            StringMessageArg(currentToken_));
+  Location defLoc;
+  unsigned defPart;
+  if (ident->defined(defPart, defLoc)
+      && defPart <= interp_->currentPartIndex()) {
+    if (defPart == interp_->currentPartIndex()) {
+      message(InterpreterMessages::duplicateDefinition,
+              StringMessageArg(ident->name()),
+              defLoc);
+      return 0;
+    }
+  }
+  lang_ = new (*interp_) LangObj;
+  for (;;) {
+    if (!getToken(allowOpenParen|allowCloseParen, tok))
+      return 0;
+    if (tok == tokenCloseParen)
+      break;
+    if (!getToken(allowIdentifier, tok))
+      return 0;
+    const Identifier *ident = lookup(currentToken_);
+    Identifier::SyntacticKey key;
+    if (!ident->syntacticKey(key))
+      return 0;
+    else {
+      switch (key) {
+      case Identifier::keyCollate:
+        if (!doCollate())
+          return 0;
+        break;
+      case Identifier::keyToupper:
+        if (!doToupper())
+          return 0;
+        break;
+      case Identifier::keyTolower:
+        if (!doTolower())
+          return 0;
+        break;
+      default:
+        return 0;
+      }
+    }
+  }
+  if (!lang_->compile())
+    return 0;
+  interp_->makePermanent(lang_);
+  Owner<Expression> expr;
+  expr = new ConstantExpression(lang_, in_->currentLocation());
+  lang_ = 0;
+  ident->setDefinition(expr, interp_->currentPartIndex(), loc);
+  return 1;
+}
+
+bool SchemeParser::doCollate()
+{
+  Token tok;
+  for (;;) {
+    if (!getToken(allowOpenParen|allowCloseParen, tok))
+      return 0;
+    if (tok == tokenCloseParen)
+      break;
+    if (!getToken(allowIdentifier, tok))
+      return 0;
+    const Identifier *ident = lookup(currentToken_);
+    Identifier::SyntacticKey key;
+    if (!ident->syntacticKey(key)) {
+      return 0;
+    } else {
+      switch (key) {
+      case Identifier::keyElement:
+        if (!doMultiCollatingElement())
+          return 0;
+        break;
+      case Identifier::keySymbol:
+        if (!doCollatingSymbol())
+          return 0;
+        break;
+      case Identifier::keyOrder:
+        if (!doCollatingOrder())
+          return 0;
+        break;
+      default:
+        return 0;
+      }
+    }
+  }
+  return 1;
+}
+
+bool SchemeParser::doMultiCollatingElement()
+{
+  Token tok;
+  if (!getToken(allowIdentifier, tok))
+    return 0;
+  StringC sym(currentToken_);
+  if (!getToken(allowString, tok))
+    return 0;
+  StringC str(currentToken_);
+  if (!getToken(allowCloseParen, tok))
+    return 0;
+  lang_->addMultiCollatingElement(sym, str);
+  return 1;
+}
+
+bool SchemeParser::doCollatingSymbol()
+{
+  Token tok;
+  if (!getToken(allowIdentifier, tok))
+    return 0;
+  StringC sym(currentToken_);
+  if (!getToken(allowCloseParen, tok))
+    return 0;
+  lang_->addCollatingSymbol(sym);
+  return 1;
+}
+
+bool SchemeParser::doCollatingOrder()
+{
+  Token tok;
+  if (!getToken(allowOpenParen, tok))
+    return 0;
+  int nested = 0;
+  LangObj::LevelSort sort = { 0, 0, 0};
+  for (;;) {
+    if (!getToken(((nested == 0) ? allowOpenParen : 0)|
+                  allowCloseParen|allowIdentifier, tok))
+      return 0;
+    if (tok == tokenOpenParen)
+      nested++;
+    else if (tok == tokenCloseParen)
+      nested--;
+    else {
+      const Identifier *ident = lookup(currentToken_);
+      Identifier::SyntacticKey key;
+      if (!ident->syntacticKey(key))
+        return 0;
+      switch (key) {
+        case Identifier::keyForward:
+          if (sort.backward)
+            return 0;
+          sort.forward = 1;
+          break;
+        case Identifier::keyBackward:
+          if (sort.forward)
+            return 0;
+          sort.backward = 1;
+          break;
+        case Identifier::keyPosition:
+          sort.position = 1;
+          break;
+        default:
+          return 0;
+        }
+      }
+    if (nested < 0)
+      break;
+    if (nested == 0) {
+      if (!sort.backward)
+        sort.forward = 1;
+      lang_->addLevel(sort);
+    }
+  }
+  for (;;) {
+    if (!getToken(allowOpenParen|
+                  allowCloseParen|
+                  allowIdentifier|
+                  allowOtherExpr, tok))
+      return 0;
+    if (tok == tokenCloseParen)
+      break;
+    StringC empty;
+    switch (tok) {
+    case tokenTrue:
+      lang_->addDefaultPos();
+      for(Char i = 0; i < lang_->levels(); i++)
+        lang_->addLevelWeight(i, empty);
+      break;
+    case tokenIdentifier:
+    case tokenChar:
+       if (!lang_->addCollatingPos(currentToken_))
+        return 0;
+      for (unsigned i = 0; i < lang_->levels(); i++)
+        lang_->addLevelWeight(i, currentToken_);
+      break;
+    case tokenOpenParen:
+      if (!doWeights())
+        return 0;
+      break;
+    default:
+      return 0;
+    }
+  }
+  return 1;
+}
+
+bool SchemeParser::doWeights()
+{
+  Token tok;
+  if (!getToken(allowIdentifier|allowOtherExpr, tok))
+    return 0;
+  StringC sym(currentToken_);
+  if (!lang_->addCollatingPos(sym))
+    return 0;
+  int nested = 0;
+  unsigned l = 0;
+  for (;;) {
+    if (!getToken((nested ? 0 : allowOpenParen)|
+                  allowCloseParen|
+                  allowIdentifier|
+                  allowOtherExpr|
+                  allowString, tok))
+      return 0;
+    if (tok == tokenOpenParen)
+      nested++;
+    else if (tok == tokenCloseParen)
+      nested--;
+    else {
+      switch (tok) {
+      case tokenString:
+         for (size_t i = 0; i < currentToken_.size(); i++) {
+          StringC ctok(&(currentToken_[i]), 1);
+          if (!lang_->addLevelWeight(l, ctok))
+            return 0;
+        }
+        break;
+      case tokenIdentifier:
+      case tokenChar:
+        if (!lang_->addLevelWeight(l, currentToken_))
+          return 0;
+        break;
+      default:
+        return 0;
+      }
+    }
+    if (nested < 0)
+      break;
+    if (nested == 0)
+      l++;
+  }
+  return 1;
+}
+
+bool SchemeParser::doToupper()
+{
+  Token tok;
+  for (;;) {
+    if (!getToken(allowOpenParen|allowCloseParen, tok))
+      return 0;
+    if (tok == tokenCloseParen) break;
+    if (!getToken(allowOtherExpr, tok) || (tok != tokenChar))
+      return 0;
+    Char lc = currentToken_[0];
+    if (!getToken(allowOtherExpr, tok) || (tok != tokenChar))
+      return 0;
+    Char uc = currentToken_[0];
+    if (!getToken(allowCloseParen, tok))
+      return 0;
+    lang_->addToupper(lc, uc);
+  }
+  return 1;
+}
+
+bool SchemeParser::doTolower()
+{
+  Token tok;
+  for (;;) {
+    if (!getToken(allowOpenParen|allowCloseParen, tok))
+      return 0;
+    if (tok == tokenCloseParen) break;
+    if (!getToken(allowOtherExpr, tok) || (tok != tokenChar))
+      return 0;
+    Char uc = currentToken_[0];
+    if (!getToken(allowOtherExpr, tok) || (tok != tokenChar))
+      return 0;
+    Char lc = currentToken_[0];
+    if (!getToken(allowCloseParen, tok))
+      return 0;
+    lang_->addTolower(uc, lc);
+  }
+  return 1;
+}
+
+bool SchemeParser::parseSpecialQuery(Owner<Expression> &rexp, const char *query)
+{
+  Location loc(in_->currentLocation());
+  Token tok;
+  if (!getToken(allowIdentifier, tok))
+    return 0;
+  Vector<const Identifier *> vars;
+  vars.push_back(lookup(currentToken_));
+  Identifier::SyntacticKey key;
+  if (vars.back()->syntacticKey(key) && key <= int(Identifier::lastSyntacticKey))
+    message(InterpreterMessages::syntacticKeywordAsVariable,
+            StringMessageArg(currentToken_));
+
+  Owner<Expression> op(new ConstantExpression(
+    interp_->lookup(interp_->makeStringC(query))->computeBuiltinValue(1, *interp_),
+    loc));
+  NCVector<Owner<Expression> > inits, args(2);
+  Owner<Expression> expr;
+  if (!parseExpression(0, args[1], key, tok)
+      || !parseExpression(0, expr, key, tok)
+      || !getToken(allowCloseParen, tok))
+    return 0;
+  args[0] = new LambdaExpression(vars, inits, 0, 0, 0, expr, loc);
+  rexp = new CallExpression(op, args, loc);
+  return 1;
+}
+
+bool SchemeParser::doDeclareCharProperty()
+{
+  Token tok;
+  if (!getToken(allowIdentifier, tok))
+    return 0;
+  Identifier *ident = lookup(currentToken_);
+  Owner<Expression> expr;
+  Identifier::SyntacticKey key;
+  if (!parseExpression(0, expr, key, tok))
+    return 0;
+  if (!getToken(allowCloseParen, tok))
+    return 0;
+  interp_->addCharProperty(ident, expr);
+  return 1;
+}
+
+bool SchemeParser::doAddCharProperties()
+{
+  NCVector<Owner<Expression> > exprs;
+  Vector<const Identifier *> keys;
+  Token tok;
+  for (;;) {
+    if (!getToken(allowKeyword|allowOtherExpr, tok))
+      return 0;
+    if (tok!=tokenKeyword)
+      break;
+    keys.push_back(lookup(currentToken_));
+    exprs.resize(exprs.size() + 1);
+    Identifier::SyntacticKey key;
+    if (!parseExpression(0, exprs.back(), key, tok))
+      return 0;
+  }
+  
+  for(;;) {
+    if (tok!=tokenChar) {
+      message(InterpreterMessages::badAddCharProperty);
+      return 0;
+    }
+    for (size_t j = 0; j < keys.size(); j++) 
+      interp_->setCharProperty(keys[j], currentToken_[0], exprs[j]);
+    if(!getToken(allowOtherExpr|allowCloseParen, tok))
+      return 0;
+    if (tok==tokenCloseParen)
+      break;
+  }
+  return 1;
+}
+
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
diff --git a/style/SchemeParser.h b/style/SchemeParser.h
new file mode 100644 (file)
index 0000000..efd6f92
--- /dev/null
@@ -0,0 +1,193 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef SchemeParser_INCLUDED
+#define SchemeParser_INCLUDED 1
+
+#include "Interpreter.h"
+#include "Expression.h"
+#include "Owner.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class LangObj;
+
+class SchemeParser : public Messenger {
+public:
+  SchemeParser(Interpreter &, Owner<InputSource> &);
+  void parse();
+  void parseStandardChars();
+  void parseMapSdataEntity(const StringC &name, const StringC &text);
+  void parseNameChars();
+  void parseSeparatorChars();
+  bool parseExpression(Owner<Expression> &);
+private:
+  SchemeParser(const SchemeParser &); // undefined
+  void operator=(const SchemeParser &); // undefined
+
+  enum {
+    allowEndOfEntity = 01,
+    allowFalse = 02,
+    allowKeyword = 04,
+    allowOpenParen = 010,
+    allowCloseParen = 020,
+    allowIdentifier = 040,
+    allowPeriod = 0100,
+    allowOtherExpr = 0200,  // number, character, glyph-id, quote, backquote
+    allowExpressionKey = 0400,
+    allowKeyDefine = 01000,
+    allowKeyElse = 02000,
+    allowKeyArrow = 04000, // =>
+    allowString = 010000,
+    allowHashOptional = 020000,
+    allowHashKey = 040000,
+    allowHashRest = 0100000,
+    allowUnquote = 0200000,
+    allowUnquoteSplicing = 0400000,
+    allowQuasiquoteKey = 01000000,
+    allowVector = 02000000,
+    allowHashContents = 04000000,
+    allowExpr = (allowFalse|allowKeyword|allowOpenParen|allowIdentifier
+                 |allowString|allowHashOptional|allowHashKey|allowHashRest
+                 |allowOtherExpr)
+  };
+  enum Token {
+    tokenEndOfEntity,
+    tokenTrue,
+    tokenFalse,
+    tokenString,
+    tokenIdentifier,
+    tokenKeyword,
+    tokenChar,
+    tokenNumber,
+    tokenGlyphId,
+    tokenOpenParen,
+    tokenCloseParen,
+    tokenPeriod,
+    tokenVector,
+    tokenQuote,
+    tokenQuasiquote,
+    tokenUnquote,
+    tokenUnquoteSplicing,
+    tokenHashRest,
+    tokenHashOptional,
+    tokenHashKey,
+    tokenHashContents,
+    tokenVoid
+  };
+  bool doDefine();
+  bool doDefineUnit();
+  bool doElement();
+  bool doOrElement();
+  bool doDefault();
+  bool doId();
+  bool doRoot();
+  bool doMode();
+  bool doDeclareInitialValue();
+  bool doDeclareCharacteristic();
+  bool doDeclareCharCharacteristicAndProperty();
+  bool doDeclareFlowObjectClass();
+  bool doDeclareClassAttribute();
+  bool doDeclareIdAttribute();
+  bool doDeclareFlowObjectMacro();
+  bool doDeclareDefaultLanguage();
+  bool doDefineLanguage();
+  bool doCollate();
+  bool doMultiCollatingElement();
+  bool doCollatingSymbol();
+  bool doCollatingOrder();
+  bool doWeights();
+  bool doToupper();
+  bool doTolower();
+  bool doDeclareCharProperty();
+  bool doAddCharProperties();
+  bool skipForm();
+  bool parseSpecialQuery(Owner<Expression> &expr, const char *query);
+  bool parseExpression(unsigned allowed, Owner<Expression> &,
+                      Identifier::SyntacticKey &, Token &);
+  bool parseBegin(Owner<Expression> &expr);
+  bool parseSet(Owner<Expression> &expr);
+  bool parseLambda(Owner<Expression> &);
+  bool parseLet(Owner<Expression> &);
+  bool parseLetStar(Owner<Expression> &);
+  bool parseLetrec(Owner<Expression> &);
+  bool parseBindingsAndBody(Vector<const Identifier *> &vars,
+                           NCVector<Owner<Expression> > &inits,
+                           Owner<Expression> &body);
+  bool parseBindingsAndBody1(Vector<const Identifier *> &vars,
+                            NCVector<Owner<Expression> > &inits,
+                            Owner<Expression> &body);
+  bool parseQuote(Owner<Expression> &);
+  bool parseIf(Owner<Expression> &);
+  bool parseCond(Owner<Expression> &, bool opt = 0);
+  bool parseCase(Owner<Expression> &);
+  bool parseOr(Owner<Expression> &);
+  bool parseAnd(Owner<Expression> &, bool opt = 0);
+  bool parseMake(Owner<Expression> &);
+  bool parseStyle(Owner<Expression> &);
+  bool parseWithMode(Owner<Expression> &);
+  bool parseFormals(Vector<const Identifier *> &,
+                   NCVector<Owner<Expression> > &,
+                   int &, bool &, int &);
+  bool parseDatum(unsigned otherAllowed, ELObj *&, Location &, Token &);
+  bool parseSelfEvaluating(unsigned otherAllowed, ELObj *&, Token &);
+  bool parseAbbreviation(const char *, ELObj *&);
+  bool parseQuasiquote(Owner<Expression> &);
+  bool parseQuasiquoteTemplate(unsigned level,
+                              unsigned allowed,
+                              Owner<Expression> &,
+                              Identifier::SyntacticKey &,
+                              Token &,
+                              bool &spliced);
+  void createQuasiquoteAbbreviation(const char *, Owner<Expression> &);
+  bool parseRuleBody(Owner<Expression> &, ProcessingMode::RuleType &);
+  bool getToken(unsigned, Token &);
+  bool handleNumber(unsigned, Token &);
+  bool handleIdentifier(unsigned, Token &);
+  void extendToken();
+  bool scanString();
+  void skipComment();
+  bool tokenRecover(unsigned, Token &);
+  bool scanString(unsigned, Token &);
+  ELObj *convertAfiiGlyphId(const StringC &);
+  Identifier *lookup(const StringC &str);
+  ProcessingMode *lookupProcessingMode(const StringC &);
+  void dispatchMessage(Message &);
+  void dispatchMessage(const Message &);
+  void initMessage(Message &msg);
+  bool dsssl2() const;
+  
+  Interpreter *interp_;
+  Owner<InputSource> in_;
+  StringC currentToken_;
+  ProcessingMode *defMode_;
+  const char *afiiPublicId_;
+  bool dsssl2_;
+  LangObj *lang_;
+};
+
+inline
+Identifier *SchemeParser::lookup(const StringC &str)
+{
+  return interp_->lookup(str);
+}
+
+inline
+ProcessingMode *SchemeParser::lookupProcessingMode(const StringC &name)
+{
+  return interp_->lookupProcessingMode(name);
+}
+
+inline
+bool SchemeParser::dsssl2() const
+{
+  return dsssl2_;
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not SchemeParser_INCLUDED */
diff --git a/style/SosofoObj.h b/style/SosofoObj.h
new file mode 100644 (file)
index 0000000..b446011
--- /dev/null
@@ -0,0 +1,269 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef SosofoObj_INCLUDED
+#define SosofoObj_INCLUDED 1
+
+#include "ELObj.h"
+#include "Location.h"
+#include "FOTBuilder.h"
+#include "Owner.h"
+#include "CopyOwner.h"
+#include "Insn.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class ProcessContext;
+class Interpreter;
+
+class SosofoObj : public ELObj {
+public:
+  virtual void process(ProcessContext &) = 0;
+  SosofoObj *asSosofo();
+  virtual bool tableBorderStyle(StyleObj *&);
+  virtual bool ruleStyle(ProcessContext &, StyleObj *&);
+  virtual bool isRule();
+  virtual bool characterStyle(ProcessContext &, StyleObj *&, FOTBuilder::CharacterNIC &);
+  virtual bool isCharacter();
+};
+
+class NextMatchSosofoObj : public SosofoObj {
+public:
+  NextMatchSosofoObj(StyleObj *);
+  void process(ProcessContext &);
+private:
+  StyleObj *style_;
+};
+
+class EmptySosofoObj : public SosofoObj {
+public:
+  void process(ProcessContext &);
+};
+
+class ProcessingMode;
+
+class ProcessNodeSosofoObj : public SosofoObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  ProcessNodeSosofoObj(const NodePtr &node, const ProcessingMode *mode);
+  void process(ProcessContext &);
+private:
+  NodePtr node_;
+  const ProcessingMode *mode_;
+};
+
+class ProcessNodeListSosofoObj : public SosofoObj {
+public:
+  ProcessNodeListSosofoObj(NodeListObj *, const ProcessingMode *);
+  void process(ProcessContext &);
+  void traceSubObjects(Collector &) const;
+private:
+  NodeListObj *nodeList_;
+  const ProcessingMode *mode_;
+};
+
+class AppendSosofoObj : public SosofoObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  AppendSosofoObj() { hasSubObjects_ = 1; }
+  AppendSosofoObj *asAppendSosofo();
+  void process(ProcessContext &);
+  void append(SosofoObj *);
+  void traceSubObjects(Collector &) const;
+private:
+  Vector<SosofoObj *> v_;
+};
+
+class LiteralSosofoObj : public SosofoObj {
+public:
+  LiteralSosofoObj(ELObj *str) : str_(str) { hasSubObjects_ = 1; }
+  void process(ProcessContext &);
+  void traceSubObjects(Collector &) const;
+private:
+  ELObj *str_;
+};
+
+class CurrentNodePageNumberSosofoObj : public SosofoObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  CurrentNodePageNumberSosofoObj(const NodePtr &node) : node_(node) { }
+  void process(ProcessContext &);
+private:
+  NodePtr node_;
+};
+
+class PageNumberSosofoObj : public SosofoObj {
+public:
+  PageNumberSosofoObj() { }
+  void process(ProcessContext &);
+};
+
+class CompoundFlowObj;
+
+class FlowObj : public SosofoObj {
+public:
+  FlowObj();
+  virtual FlowObj *copy(Collector &) const = 0;
+  virtual CompoundFlowObj *asCompoundFlowObj();
+  virtual bool hasNonInheritedC(const Identifier *) const;
+  virtual bool hasPseudoNonInheritedC(const Identifier *) const;
+  virtual void setNonInheritedC(const Identifier *, ELObj *, const Location &, Interpreter &);
+  virtual bool setImplicitChar(ELObj *, const Location &, Interpreter &);
+  void traceSubObjects(Collector &) const;
+  void setStyle(StyleObj *);
+  void process(ProcessContext &);
+  virtual void pushStyle(ProcessContext &, unsigned &);
+  virtual void popStyle(ProcessContext &, unsigned);
+  virtual void processInner(ProcessContext &) = 0;
+protected:
+  static
+    bool setDisplayNIC(FOTBuilder::DisplayNIC &,
+                       const Identifier *, ELObj *,
+                      const Location &, Interpreter &);
+  static bool isDisplayNIC(const Identifier *);
+  StyleObj *style_;
+};
+
+class CompoundFlowObj : public FlowObj {
+public:
+  CompoundFlowObj() : content_(0) { }
+  void processInner(ProcessContext &);
+  void traceSubObjects(Collector &) const;
+  void setContent(SosofoObj *content) { content_ = content; }
+  CompoundFlowObj *asCompoundFlowObj();
+protected:
+  SosofoObj *content() const;
+private:
+  SosofoObj *content_;
+};
+
+class SequenceFlowObj : public CompoundFlowObj {
+public:
+  SequenceFlowObj() { }
+  void processInner(ProcessContext &);
+  FlowObj *copy(Collector &) const;
+};
+
+class ProcessingMode;
+
+class ProcessChildrenSosofoObj : public SosofoObj {
+public:
+  ProcessChildrenSosofoObj(const ProcessingMode *mode) : mode_(mode) { }
+  void process(ProcessContext &);
+private:
+  const ProcessingMode *mode_;
+};
+
+class ProcessChildrenTrimSosofoObj : public SosofoObj {
+public:
+  ProcessChildrenTrimSosofoObj(const ProcessingMode *mode) : mode_(mode) { }
+  void process(ProcessContext &);
+private:
+  const ProcessingMode *mode_;
+};
+
+class SetNonInheritedCsSosofoObj : public SosofoObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  SetNonInheritedCsSosofoObj(FlowObj *, const InsnPtr &, ELObj **, const NodePtr &);
+  ~SetNonInheritedCsSosofoObj();
+  void process(ProcessContext &);
+  void traceSubObjects(Collector &) const;
+  bool characterStyle(ProcessContext &, StyleObj *&, FOTBuilder::CharacterNIC &);
+  bool isCharacter();
+  bool ruleStyle(ProcessContext &, StyleObj *&);
+  bool isRule();
+private:
+  ELObj *resolve(ProcessContext &);
+
+  FlowObj *flowObj_;
+  ELObj **display_;
+  InsnPtr code_;
+  NodePtr node_;
+};
+
+class Expression;
+
+// This wraps a flow object that has a label:.
+class LabelSosofoObj : public SosofoObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  LabelSosofoObj(SymbolObj *, const Location &, SosofoObj *content);
+  void process(ProcessContext &);
+  void traceSubObjects(Collector &) const;
+private:
+  SymbolObj *label_;
+  Owner<Location> locp_;
+  SosofoObj *content_;
+};
+
+// This wraps the content of a sosofo with a content-map:.
+
+class ContentMapSosofoObj : public SosofoObj {
+public:
+  ContentMapSosofoObj(ELObj *, const Location *, SosofoObj *content);
+  void process(ProcessContext &);
+  void traceSubObjects(Collector &) const;
+private:
+  ELObj *contentMap_;
+  const Location *locp_;
+  SosofoObj *content_; 
+};
+
+class DiscardLabeledSosofoObj : public SosofoObj {
+public:
+  DiscardLabeledSosofoObj(SymbolObj *, SosofoObj *);
+  void process(ProcessContext &);
+  void traceSubObjects(Collector &) const;
+private:
+  SymbolObj *label_;
+  SosofoObj *content_; 
+};
+
+class PageTypeSosofoObj : public SosofoObj {
+public:
+  PageTypeSosofoObj(unsigned, SosofoObj *, SosofoObj *);
+  void process(ProcessContext &);
+  void traceSubObjects(Collector &) const;
+private:
+  unsigned pageTypeFlag_;
+  SosofoObj *match_;
+  SosofoObj *noMatch_;
+};
+
+inline
+void FlowObj::setStyle(StyleObj *style)
+{
+  style_ = style;
+}
+
+inline
+void AppendSosofoObj::append(SosofoObj *obj)
+{
+  v_.push_back(obj);
+}
+
+inline
+SosofoObj *CompoundFlowObj::content() const
+{
+  return content_;
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not SosofoObj_INCLUDED */
+
diff --git a/style/Style.cxx b/style/Style.cxx
new file mode 100644 (file)
index 0000000..42eed71
--- /dev/null
@@ -0,0 +1,940 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#include "stylelib.h"
+#include "Style.h"
+#include "VM.h"
+#include "Interpreter.h"
+#include "InterpreterMessages.h"
+#include "SosofoObj.h"
+#include "macros.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+StyleStack::StyleStack()
+: level_(0)
+{
+}
+
+void StyleStack::pushContinue(StyleObj *style,
+                             const ProcessingMode::Rule *rule,
+                             const NodePtr &nodePtr,
+                             Messenger *mgr)
+{
+  StyleObjIter iter;
+  style->appendIter(iter);
+  for (;;) {
+    const VarStyleObj *varStyle;
+    ConstPtr<InheritedC> spec(iter.next(varStyle));
+    if (spec.isNull())
+      break;
+    size_t ind = spec->index();
+    if (ind >= inheritedCInfo_.size())
+      inheritedCInfo_.resize(ind + 1);
+    Ptr<InheritedCInfo> &info = inheritedCInfo_[ind];
+    if (!info.isNull() && info->valLevel == level_) {
+      if (rule) {
+       ASSERT(info->rule != 0);
+       if (rule->compareSpecificity(*info->rule) == 0) {
+         mgr->setNextLocation(info->rule->location());
+         mgr->message(InterpreterMessages::ambiguousStyle,
+                      StringMessageArg(info->spec->identifier()->name()),
+                      rule->location());
+       }
+      }
+
+    }
+    else {
+      popList_->list.push_back(ind);
+      info = new InheritedCInfo(spec, varStyle, level_, level_, rule, info);
+    }
+  }
+}
+
+void StyleStack::pushEnd(VM &vm, FOTBuilder &fotb)
+{
+  const PopList *oldPopList = popList_->prev.pointer();
+  if (oldPopList) {
+    for (size_t i = 0; i < oldPopList->dependingList.size(); i++) {
+      size_t d = oldPopList->dependingList[i];
+      // d is the index of a characteristic that depends on the actual
+      // value of another characteritistic
+      if (inheritedCInfo_[d]->valLevel != level_) {
+       const Vector<size_t> &dependencies = inheritedCInfo_[d]->dependencies;
+       bool changed = 0;
+       for (size_t j = 0; j < dependencies.size(); j++) {
+         const InheritedCInfo *p = inheritedCInfo_[dependencies[j]].pointer();
+         if (p && p->valLevel == level_) {
+           inheritedCInfo_[d] = new InheritedCInfo(inheritedCInfo_[d]->spec,
+                                                   inheritedCInfo_[d]->style,
+                                                   level_,
+                                                   inheritedCInfo_[d]->specLevel,
+                                                   inheritedCInfo_[d]->rule,
+                                                   inheritedCInfo_[d]);
+           popList_->list.push_back(d);
+           changed = 1;
+           break;
+         }
+       }
+       // If it changed, then doing set() on the new value will add
+       // it to the dependingList for this level.
+       if (!changed)
+         popList_->dependingList.push_back(d);
+      }
+    }
+  }
+  vm.styleStack = this;
+  for (size_t i = 0; i < popList_->list.size(); i++) {
+    InheritedCInfo &info = *inheritedCInfo_[popList_->list[i]];
+    vm.specLevel = info.specLevel;
+    info.spec->set(vm, info.style, fotb, info.cachedValue, info.dependencies);
+    if (info.dependencies.size())
+      popList_->dependingList.push_back(popList_->list[i]);
+  }
+  vm.styleStack = 0;
+}
+
+void StyleStack::pop()
+{
+  for (size_t i = 0; i < popList_->list.size(); i++) {
+    size_t ind = popList_->list[i];
+    ASSERT(inheritedCInfo_[ind]->valLevel == level_);
+    Ptr<InheritedCInfo> tem(inheritedCInfo_[ind]->prev);
+    inheritedCInfo_[ind] = tem;
+  }
+  level_--;
+  Ptr<PopList> tem(popList_->prev);
+  popList_ = tem;
+}
+
+ELObj *StyleStack::inherited(const ConstPtr<InheritedC> &ic, unsigned specLevel,
+                            Interpreter &interp, Vector<size_t> &dependencies)
+{
+  ASSERT(specLevel != unsigned(-1));
+  size_t ind = ic->index();
+  ConstPtr<InheritedC> spec;
+  const VarStyleObj *style = 0;
+  unsigned newSpecLevel = unsigned(-1);
+  if (ind >= inheritedCInfo_.size())
+    spec = ic;
+  else {
+    const InheritedCInfo *p = inheritedCInfo_[ind].pointer();
+    while (p != 0) {
+      if (p->specLevel < specLevel)
+       break;
+      p = p->prev.pointer();
+    }
+    if (!p)
+      spec = ic;
+    else {
+      if (p->cachedValue) {
+       // We can only use the cached value if none of the values
+       // we depended on changed since we computed it.
+       bool cacheOk = 1;
+       for (size_t i = 0; i < p->dependencies.size(); i++) {
+         size_t d = p->dependencies[i];
+         if (d < inheritedCInfo_.size()
+             && inheritedCInfo_[d]->valLevel > p->valLevel) {
+           cacheOk = 0;
+           break;
+         }
+       }
+       if (cacheOk)
+         return p->cachedValue;
+      }
+      style = p->style;
+      spec = p->spec;
+      newSpecLevel = p->specLevel;
+    }
+  }
+  VM vm(interp);
+  vm.styleStack = this;
+  vm.specLevel = newSpecLevel;
+  return spec->value(vm, style, dependencies);
+}
+
+ELObj *StyleStack::actual(const ConstPtr<InheritedC> &ic, const Location &loc,
+                         Interpreter &interp, Vector<size_t> &dependencies)
+{
+  size_t ind = ic->index();
+  for (size_t i = 0; i < dependencies.size(); i++) {
+    if (dependencies[i] == ind) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::actualLoop,
+                    StringMessageArg(ic->identifier()->name()));
+      return interp.makeError();
+    }
+  }
+  dependencies.push_back(ind);
+  ConstPtr<InheritedC> spec;
+  const VarStyleObj *style = 0;
+  if (ind >= inheritedCInfo_.size())
+    spec = ic;
+  else {
+    const InheritedCInfo *p = inheritedCInfo_[ind].pointer();
+    if (!p)
+      spec = ic;
+    else if (p->cachedValue) {
+      const Vector<size_t> &dep = p->dependencies;
+      for (size_t i = 0; i < dep.size(); i++)
+       dependencies.push_back(dep[i]);
+      return p->cachedValue;
+    }
+    else {
+      style = p->style;
+      spec = p->spec;
+    }
+  }
+  VM vm(interp);
+  vm.styleStack = this;
+  vm.specLevel = level_;
+  return spec->value(vm, style, dependencies);
+}
+
+void StyleStack::trace(Collector &c) const
+{
+  for (size_t i = 0; i < inheritedCInfo_.size(); i++) {
+    for (const InheritedCInfo *p = inheritedCInfo_[i].pointer();
+         p;
+        p = p->prev.pointer()) {
+      c.trace(p->style);
+      c.trace(p->cachedValue);
+    }
+  }
+}
+
+InheritedCInfo::InheritedCInfo(const ConstPtr<InheritedC> &sp,
+                              const VarStyleObj *so,
+                              unsigned vl,
+                              unsigned sl,
+                              const ProcessingMode::Rule *r,
+                              const Ptr<InheritedCInfo> &p)
+: spec(sp), style(so), valLevel(vl), specLevel(sl), rule(r), prev(p), cachedValue(0)
+{
+}
+
+StyleObj *StyleObj::asStyle()
+{
+  return this;
+}
+
+VarStyleObj::VarStyleObj(const ConstPtr<StyleSpec> &styleSpec, StyleObj *use, ELObj **display,
+                        const NodePtr &node)
+: styleSpec_(styleSpec), use_(use), display_(display), node_(node)
+{
+  hasSubObjects_ = 1;
+}
+
+VarStyleObj::~VarStyleObj()
+{
+  delete [] display_;
+}
+
+void VarStyleObj::traceSubObjects(Collector &c) const
+{
+  c.trace(use_);
+  if (display_)
+    for (ELObj **pp = display_; *pp; pp++)
+      c.trace(*pp);
+}
+
+void VarStyleObj::appendIterForce(StyleObjIter &iter) const
+{
+  if (styleSpec_->forceSpecs.size())
+    iter.append(&styleSpec_->forceSpecs, this);
+}
+
+void VarStyleObj::appendIterNormal(StyleObjIter &iter) const
+{
+  if (styleSpec_->specs.size())
+    iter.append(&styleSpec_->specs, this);
+  if (use_)
+    use_->appendIter(iter);
+}
+
+void VarStyleObj::appendIter(StyleObjIter &iter) const
+{
+  VarStyleObj::appendIterForce(iter);
+  VarStyleObj::appendIterNormal(iter);
+}
+
+OverriddenStyleObj::OverriddenStyleObj(BasicStyleObj *basic, StyleObj *override)
+: basic_(basic), override_(override)
+{
+  hasSubObjects_ = 1;
+}
+
+void OverriddenStyleObj::traceSubObjects(Collector &c) const
+{
+  c.trace(basic_);
+  c.trace(override_);
+}
+
+void OverriddenStyleObj::appendIter(StyleObjIter &iter) const
+{
+  basic_->appendIterForce(iter);
+  override_->appendIter(iter);
+  basic_->appendIterNormal(iter);
+}
+
+MergeStyleObj::MergeStyleObj()
+{
+  hasSubObjects_ = 1;
+}
+
+void MergeStyleObj::append(StyleObj *obj)
+{
+  styles_.push_back(obj);
+}
+
+void MergeStyleObj::appendIter(StyleObjIter &iter) const
+{
+  for (size_t i = 0; i < styles_.size(); i++)
+    styles_[i]->appendIter(iter);
+}
+
+void MergeStyleObj::traceSubObjects(Collector &c) const
+{
+  for (size_t i = 0; i < styles_.size(); i++)
+    c.trace(styles_[i]);
+}
+
+ColorObj *ColorObj::asColor()
+{
+  return this;
+}
+
+DeviceRGBColorObj::DeviceRGBColorObj(unsigned char red, unsigned char green,
+                                    unsigned char blue)
+{
+  color_.red = red;
+  color_.green = green;
+  color_.blue = blue;
+}
+
+void DeviceRGBColorObj::set(FOTBuilder &fotb) const
+{
+  fotb.setColor(color_);
+}
+
+void DeviceRGBColorObj::setBackground(FOTBuilder &fotb) const
+{
+  fotb.setBackgroundColor(color_);
+}
+
+ColorSpaceObj *ColorSpaceObj::asColorSpace()
+{
+  return this;
+}
+
+// invert a 3x3 matrix A. result is returned in B
+// both must be arrays of length 9.
+static void
+invert(double *A, double *B)
+{
+  B[0] =   (A[4]*A[8] - A[5]*A[7]); 
+  B[3] = - (A[3]*A[8] - A[5]*A[6]);
+  B[6] =   (A[3]*A[7] - A[4]*A[6]);
+  B[1] = - (A[1]*A[8] - A[2]*A[7]);
+  B[4] =   (A[0]*A[8] - A[2]*A[6]);
+  B[7] = - (A[0]*A[7] - A[1]*A[6]);
+  B[2] =   (A[1]*A[5] - A[2]*A[4]);
+  B[5] = - (A[0]*A[5] - A[2]*A[3]);
+  B[8] =   (A[0]*A[4] - A[1]*A[3]);
+  double det = A[0]*B[0] + A[1]*B[3] + A[2]*B[6]; 
+  if (det < 0.0001) {
+    //FIXME message
+  }
+  B[0] /= det; B[1] /= det; B[2] /= det;           
+  B[3] /= det; B[4] /= det; B[5] /= det;          
+  B[6] /= det; B[7] /= det; B[8] /= det;         
+}
+
+/*
+ FIXME make color handling more flexible:
+  * pass different color types to backends
+  * move the conversion code to a separate
+    class ColorConverter, which could then
+    be used by backends to do the needed
+    conversions. 
+  * make phosphors settable 
+  * make highlight color for KX settable 
+  * whitepoint correction, making the device 
+    whitepoint/blackpoint settable
+
+ for the formulas used here, see:
+  * Computer Graphics, Principles and Practice, Second Edition,
+    Foley, van Damme, Hughes,
+    Addison-Wesley, 1987
+  * Principles of Color Technology, Second Edition, 
+    Fred W. Billmeyer, Jr. and Max Saltzman, 
+    John Wiley & Sons, Inc., 1981
+  * The color faq
+*/
+CIEXYZColorSpaceObj::CIEXYZColorSpaceObj(const double *wp, const double *bp)
+{
+  xyzData_ = new XYZData;
+  for (int i = 0; i < 3; i++) 
+    xyzData_->white_[i] = wp[i];
+  double tmp = wp[0] + 15*wp[1] + 3*wp[2]; 
+  xyzData_->white_u = 4*wp[0]/tmp;
+  xyzData_->white_v = 9*wp[1]/tmp;
+
+  // from the color faq
+  double xr = .64; double yr = .33; 
+  double xg = .30; double yg = .60;
+  double xb = .15; double yb = .06;
+  double U[9];
+  U[0] = xr; U[1] = xg; U[2] = xb; 
+  U[3] = yr; U[4] = yg; U[5] = yb; 
+  U[6] = 1.0 - xr - yr; U[7] = 1.0 - xg - yg; U[8] = 1.0 - xb - yb; 
+  double Uinv[9];
+  invert(U, Uinv);  
+  double C[3];
+  for (int i = 0; i < 3; i++) 
+    C[i] = Uinv[3*i]*wp[0] + Uinv[3*i+1]*wp[1] + Uinv[3*i+2]*wp[2];
+  double Minv[9];
+  Minv[0] = U[0]*C[0]; Minv[1] = U[1]*C[1]; Minv[2] = U[2]*C[2];
+  Minv[3] = U[3]*C[0]; Minv[4] = U[4]*C[1]; Minv[5] = U[5]*C[2];
+  Minv[6] = U[6]*C[0]; Minv[7] = U[7]*C[1]; Minv[8] = U[8]*C[2];
+  invert(Minv, xyzData_->M_);
+}
+
+CIEXYZColorSpaceObj::~CIEXYZColorSpaceObj()
+{
+  delete xyzData_;
+}
+
+ELObj *CIEXYZColorSpaceObj::makeColor (const double *h, Interpreter &interp)
+{
+ unsigned char c[3];
+ for (int i = 0; i < 3; i++) 
+   c[i] = (unsigned char) ((xyzData_->M_[3*i]*h[0] 
+                          + xyzData_->M_[3*i+1]*h[1] 
+                          + xyzData_->M_[3*i+2]*h[2])*255.0 + .5);
+
+  return new (interp) DeviceRGBColorObj(c[0], c[1], c[2]);
+}
+
+CIELUVColorSpaceObj::CIELUVColorSpaceObj(const double *wp, const double *bp, const double *r) 
+: CIEXYZColorSpaceObj(wp, bp)
+{
+  luvData_ = new LUVData;
+  for (int i = 0; i < 6; i++) 
+    luvData_->range_[i] = r ? r[i] : ((i % 2) ? 1.0 : .0);
+}
+                                         
+CIELUVColorSpaceObj::~CIELUVColorSpaceObj()
+{
+  delete luvData_;
+}
+
+ELObj *CIELUVColorSpaceObj::makeColor(int argc, ELObj **argv,
+                                Interpreter &interp, const Location &loc)
+{
+  if (argc == 0)
+    return new (interp) DeviceRGBColorObj(0, 0, 0);
+  if (argc != 3) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::colorArgCount,
+                   StringMessageArg(interp.makeStringC("CIE LUV")));
+    return interp.makeError();
+  }
+  double d[3];
+  for (int i = 0; i < 3; i++) {
+    if (!argv[i]->realValue(d[i])) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::colorArgType,
+                     StringMessageArg(interp.makeStringC("CIE LUV")));
+      return interp.makeError();
+    }
+    if (d[i] < luvData_->range_[2*i] || d[i] > luvData_->range_[2*i+1]) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::colorArgRange,
+                     StringMessageArg(interp.makeStringC("CIE LUV")));
+      return interp.makeError();
+    }
+  }
+
+  double h[3];
+  if (d[0] == 0.0) {
+    h[0] = h[1] = h[2] = 0.0;
+  } else {                                   
+    if (d[0] <= 7.996968)
+      h[1] = d[0] / 903.0;
+    else { 
+      h[1] = (d[0] + 16.0) / 116.0;
+      h[1] = h[1] * h[1] * h[1];
+    }                                        
+    double uu = d[1] / (13.0 * d[0]) + xyzData_->white_u;
+    double vv = d[2] / (13.0 * d[0]) + xyzData_->white_v;    
+    double tmp = 9.0 * h[1] / vv;                 
+    h[0] = uu * tmp / 4.0;                  
+    h[2] = (tmp - 15.0 * h[1] - h[0]) / 3.0;     
+  }              
+
+  return CIEXYZColorSpaceObj::makeColor(h, interp);
+}
+
+CIELABColorSpaceObj::CIELABColorSpaceObj(const double *wp, const double *bp, const double *r) 
+: CIEXYZColorSpaceObj(wp, bp)
+{
+  labData_ = new LABData;
+  if (r)
+    for (int i = 0; i < 6; i++) 
+      labData_->range_[i] = r[i];
+  else { 
+    labData_->range_[0] = .0;
+    labData_->range_[1] = 100.0;
+    labData_->range_[2] = .0;
+    labData_->range_[3] = 1.0;
+    labData_->range_[4] = .0;
+    labData_->range_[5] = 1.0;
+  }  
+}
+                                         
+CIELABColorSpaceObj::~CIELABColorSpaceObj()
+{
+  delete labData_;
+}
+
+ELObj *CIELABColorSpaceObj::makeColor(int argc, ELObj **argv,
+                                Interpreter &interp, const Location &loc)
+{
+  if (argc == 0)
+    return new (interp) DeviceRGBColorObj(0, 0, 0);
+  if (argc != 3) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::colorArgCount,
+                   StringMessageArg(interp.makeStringC("CIE LAB")));
+    return interp.makeError();
+  }
+  double d[3];
+  for (int i = 0; i < 3; i++) {
+    if (!argv[i]->realValue(d[i])) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::colorArgType,
+                     StringMessageArg(interp.makeStringC("CIE LAB")));
+      return interp.makeError();
+    }
+    if (d[i] < labData_->range_[2*i] || d[i] > labData_->range_[2*i+1]) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::colorArgRange,
+                     StringMessageArg(interp.makeStringC("CIE LAB")));
+      return interp.makeError();
+    }
+  }
+  d[0] /= 100.0;
+  
+  double h[3];
+  double tmp = (d[0] + 16.0) / 116.0;
+  h[1] = tmp * tmp * tmp;
+  if (h[1] < 0.008856) {
+    tmp = d[0] / 9.03292;
+    h[0] = xyzData_->white_[0] * ((d[1] / 3893.5) + tmp);
+    h[1] = tmp;
+    h[2] = xyzData_->white_[2] * (tmp - (d[2] / 1557.4));
+  } else {
+    double tmp2 = tmp + (d[1] / 5.0);
+    h[0] = xyzData_->white_[0] * tmp2 * tmp2 * tmp2;
+    tmp2 = tmp - (d[2] / 2.0);
+    h[2] = xyzData_->white_[2] * tmp2 * tmp2 * tmp2;
+  }
+
+  return CIEXYZColorSpaceObj::makeColor(h, interp);
+}
+
+CIEABCColorSpaceObj::CIEABCColorSpaceObj(const double *wp, const double *bp, 
+      const double *rabc, FunctionObj **dabc, const double *mabc, 
+      const double *rlmn, FunctionObj **dlmn, const double *mlmn) 
+: CIEXYZColorSpaceObj(wp, bp)
+{
+  abcData_ = new ABCData;
+  int i;
+  for (i = 0; i < 6; i++) 
+    abcData_->rangeAbc_[i] = rabc ? rabc[i] : ((i % 2) ? 1.0 : 0.0); 
+  for (i = 0; i < 3; i++)
+    abcData_->decodeAbc_[i] = dabc ? dabc[i] : 0;
+  for (i = 0; i < 9; i++)
+    abcData_->matrixAbc_[i] = mabc ? mabc[i] : ((i % 4) ? 0.0 : 1.0);
+  for (i = 0; i < 6; i++) 
+    abcData_->rangeLmn_[i] = rlmn ? rlmn[i] : ((i % 2) ? 1.0 : 0.0); 
+  for (i = 0; i < 3; i++)
+    abcData_->decodeLmn_[i] = dlmn ? dlmn[i] : 0;
+  for (i = 0; i < 9; i++)
+    abcData_->matrixLmn_[i] = mlmn ? mlmn[i] : ((i % 4) ? 0.0 : 1.0);
+}
+
+CIEABCColorSpaceObj::~CIEABCColorSpaceObj()
+{
+  delete abcData_;
+}
+
+void CIEABCColorSpaceObj::traceSubObjects(Collector &c) const
+{ 
+  for (int i = 0; i < 3; i++)  
+    if (abcData_->decodeAbc_[i])
+      c.trace(abcData_->decodeAbc_[i]);
+  for (int i = 0; i < 3; i++)  
+    if (abcData_->decodeLmn_[i])
+      c.trace(abcData_->decodeLmn_[i]);
+  
+}
+
+static 
+bool applyFunc(Interpreter &interp, FunctionObj *f, double &d)
+{
+  InsnPtr insns[2];
+  insns[1] = f->makeCallInsn(1, interp, Location(), InsnPtr());
+  insns[0] = InsnPtr(new ConstantInsn(new (interp) RealObj(d),insns[1]));
+  VM vm(interp);
+  ELObj *res = vm.eval(insns[0].pointer());
+  if (!res || !res->realValue(d)) 
+    return 0;
+  return 1;
+}
+
+ELObj *CIEABCColorSpaceObj::makeColor(int argc, ELObj **argv,
+                                Interpreter &interp, const Location &loc)
+{
+  if (argc == 0)
+    return new (interp) DeviceRGBColorObj(0, 0, 0);
+  if (argc != 3) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::colorArgCount,
+                   StringMessageArg(interp.makeStringC("CIE Based ABC")));
+    return interp.makeError();
+  }
+  double d[3];
+  for (int i = 0; i < 3; i++) {
+    if (!argv[i]->realValue(d[i])) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::colorArgType,
+                     StringMessageArg(interp.makeStringC("CIE Based ABC")));
+      return interp.makeError();
+    }
+    if (d[i] < abcData_->rangeAbc_[2*i] || d[i] > abcData_->rangeAbc_[2*i+1]) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::colorArgRange,
+                     StringMessageArg(interp.makeStringC("CIE Based ABC")));
+      return interp.makeError();
+    }
+    if (abcData_->decodeAbc_[i] && !applyFunc(interp, abcData_->decodeAbc_[i], d[i])) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::colorProcResType,
+                     StringMessageArg(interp.makeStringC("CIE Based ABC")));
+      return interp.makeError();
+    }
+  }
+  double l[3];
+  for (int i = 0; i < 3; i++) { 
+    l[i] = abcData_->matrixAbc_[i]*d[0] 
+         + abcData_->matrixAbc_[3+i]*d[1] 
+         + abcData_->matrixAbc_[6+i]*d[2];
+    if (l[i] < abcData_->rangeLmn_[2*i] || l[i] > abcData_->rangeLmn_[2*i+1]) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::colorArgRange,
+                     StringMessageArg(interp.makeStringC("CIE Based ABC")));
+      return interp.makeError();
+    }
+    if (abcData_->decodeLmn_[i] && !applyFunc(interp, abcData_->decodeLmn_[i], l[i])) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::colorProcResType,
+                     StringMessageArg(interp.makeStringC("CIE Based ABC")));
+      return interp.makeError();
+    }
+  }
+  double h[3];
+  for (int i = 0; i < 3; i++)  
+    h[i] = abcData_->matrixLmn_[i]*l[0] 
+         + abcData_->matrixLmn_[3+i]*l[1] 
+         + abcData_->matrixLmn_[6+i]*l[2];
+
+  return CIEXYZColorSpaceObj::makeColor(h, interp);
+}
+
+CIEAColorSpaceObj::CIEAColorSpaceObj(const double *wp, const double *bp, 
+      const double *ra, FunctionObj *da, const double *ma, 
+      const double *rlmn, FunctionObj **dlmn, const double *mlmn) 
+: CIEXYZColorSpaceObj(wp, bp)
+{
+  aData_ = new AData;
+  int i;
+  for (i = 0; i < 2; i++) 
+    aData_->rangeA_[i] = ra ? ra[i] : ((i % 2) ? 1.0 : 0.0); 
+  aData_->decodeA_ = da ? da : 0;
+  for (i = 0; i < 3; i++)
+    aData_->matrixA_[i] = ma ? ma[i] : 1.0;
+  for (i = 0; i < 6; i++) 
+    aData_->rangeLmn_[i] = rlmn ? rlmn[i] : ((i % 2) ? 1.0 : 0.0); 
+  for (i = 0; i < 3; i++)
+    aData_->decodeLmn_[i] = dlmn ? dlmn[i] : 0;
+  for (i = 0; i < 9; i++)
+    aData_->matrixLmn_[i] = mlmn ? mlmn[i] : ((i % 4) ? 0.0 : 1.0);
+}
+
+CIEAColorSpaceObj::~CIEAColorSpaceObj()
+{
+  delete aData_;
+}
+
+void CIEAColorSpaceObj::traceSubObjects(Collector &c) const
+{ 
+  if (aData_->decodeA_)
+    c.trace(aData_->decodeA_);
+  for (int i = 0; i < 3; i++)  
+    if (aData_->decodeLmn_[i])
+      c.trace(aData_->decodeLmn_[i]);
+}
+
+ELObj *CIEAColorSpaceObj::makeColor(int argc, ELObj **argv,
+                                Interpreter &interp, const Location &loc)
+{
+  if (argc == 0)
+    return new (interp) DeviceRGBColorObj(0, 0, 0);
+  if (argc != 1) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::colorArgCount,
+                   StringMessageArg(interp.makeStringC("CIE Based A")));
+    return interp.makeError();
+  }
+  double d;
+  if (!argv[0]->realValue(d)) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::colorArgType,
+                   StringMessageArg(interp.makeStringC("CIE Based A")));
+    return interp.makeError();
+  }
+  if (d < aData_->rangeA_[0] || d > aData_->rangeA_[1]) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::colorArgRange,
+                   StringMessageArg(interp.makeStringC("CIE Based A")));
+    return interp.makeError();
+  }
+  if (aData_->decodeA_ && !applyFunc(interp, aData_->decodeA_, d)) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::colorProcResType,
+                   StringMessageArg(interp.makeStringC("CIE Based A")));
+    return interp.makeError();
+  }
+  double l[3];
+  for (int i = 0; i < 3; i++) { 
+    l[i] = aData_->matrixA_[i]*d;  
+    if (l[i] < aData_->rangeLmn_[2*i] || l[i] > aData_->rangeLmn_[2*i+1]) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::colorArgRange,
+                     StringMessageArg(interp.makeStringC("CIE Based A")));
+      return interp.makeError();
+    }
+    if (aData_->decodeLmn_[i] && !applyFunc(interp, aData_->decodeLmn_[i], l[i])) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::colorProcResType,
+                     StringMessageArg(interp.makeStringC("CIE Based A")));
+      return interp.makeError();
+    }
+  }
+  double h[3];
+  for (int i = 0; i < 3; i++) { 
+    h[i] = aData_->matrixLmn_[i]*l[0] 
+         + aData_->matrixLmn_[3+i]*l[1] 
+         + aData_->matrixLmn_[6+i]*l[2];
+  }
+  return CIEXYZColorSpaceObj::makeColor(h, interp);
+}
+
+ELObj *DeviceRGBColorSpaceObj::makeColor(int argc, ELObj **argv,
+                                        Interpreter &interp, const Location &loc)
+{
+  if (argc == 0)
+    return new (interp) DeviceRGBColorObj(0, 0, 0);
+  if (argc != 3) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::colorArgCount,
+                   StringMessageArg(interp.makeStringC("Device RGB")));
+    return interp.makeError();
+  }
+  unsigned char c[3];
+  for (int i = 0; i < 3; i++) {
+    double d;
+    if (!argv[i]->realValue(d)) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::colorArgType,
+                     StringMessageArg(interp.makeStringC("Device RGB")));
+      return interp.makeError();
+    }
+    if (d < 0.0 || d > 1.0) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::colorArgRange,
+                     StringMessageArg(interp.makeStringC("Device RGB")));
+      return interp.makeError();
+    }
+    c[i] = (unsigned char)(d*255.0 + .5);
+  }
+  return new (interp) DeviceRGBColorObj(c[0], c[1], c[2]);
+}
+
+ELObj *DeviceGrayColorSpaceObj::makeColor(int argc, ELObj **argv,
+                                        Interpreter &interp, const Location &loc)
+{
+  if (argc == 0)
+    return new (interp) DeviceRGBColorObj(0, 0, 0);
+  if (argc != 1) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::colorArgCount,
+                   StringMessageArg(interp.makeStringC("Device Gray")));
+    return interp.makeError();
+  }
+  unsigned char c;
+  double d;
+  if (!argv[0]->realValue(d)) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::colorArgType,
+                   StringMessageArg(interp.makeStringC("Device Gray")));
+    return interp.makeError();
+  }
+  if (d < 0.0 || d > 1.0) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::colorArgRange,
+                   StringMessageArg(interp.makeStringC("Device Gray")));
+    return interp.makeError();
+  }
+  c = (unsigned char)(d*255.0 + .5);
+  return new (interp) DeviceRGBColorObj(c, c, c);
+}
+
+#define MIN(x,y) (((x) < (y)) ? (x) : (y)) 
+
+ELObj *DeviceCMYKColorSpaceObj::makeColor(int argc, ELObj **argv,
+                                        Interpreter &interp, const Location &loc)
+{
+  if (argc == 0)
+    return new (interp) DeviceRGBColorObj(0, 0, 0);
+  if (argc != 4) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::colorArgCount,
+                   StringMessageArg(interp.makeStringC("Device CMYK")));
+    return interp.makeError();
+  }
+  double d[4];
+  for (int i = 0; i < 4; i++) {
+    if (!argv[i]->realValue(d[i])) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::colorArgType,
+                     StringMessageArg(interp.makeStringC("Device CMYK")));
+      return interp.makeError();
+    }
+    if (d[i] < 0.0 || d[i] > 1.0) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::colorArgRange,
+                     StringMessageArg(interp.makeStringC("Device CMYK")));
+      return interp.makeError();
+    }
+  }
+  unsigned char c[3];
+  for (int i = 0; i < 3; i++) 
+    c[i] = (unsigned char)((1 - MIN(1, d[i] + d[3]))*255.0 + .5);
+  return new (interp) DeviceRGBColorObj(c[0], c[1], c[2]);
+}
+
+ELObj *DeviceKXColorSpaceObj::makeColor(int argc, ELObj **argv,
+                                        Interpreter &interp, const Location &loc)
+{
+  if (argc == 0)
+    return new (interp) DeviceRGBColorObj(0, 0, 0);
+  if (argc != 2) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::colorArgCount,
+                   StringMessageArg(interp.makeStringC("Device KX")));
+    return interp.makeError();
+  }
+  double d[2];
+  for (int i = 0; i < 2; i++) {
+    if (!argv[i]->realValue(d[i])) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::colorArgType,
+                     StringMessageArg(interp.makeStringC("Device KX")));
+      return interp.makeError();
+    }
+    if (d[i] < 0.0 || d[i] > 1.0) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::colorArgRange,
+                     StringMessageArg(interp.makeStringC("Device KX")));
+      return interp.makeError();
+    }
+  }
+  unsigned char c;
+  c = (unsigned char)((1 - MIN(1, d[0] + d[1]))*255.0 + .5);
+  return new (interp) DeviceRGBColorObj(c, c, c);
+}
+
+VarInheritedC::VarInheritedC(const ConstPtr<InheritedC> &ic,
+                            const InsnPtr &code, const Location &loc)
+: InheritedC(ic->identifier(), ic->index()), inheritedC_(ic), code_(code), loc_(loc)
+{
+}
+
+void VarInheritedC::set(VM &vm, const VarStyleObj *style, FOTBuilder &fotb,
+                       ELObj *&cacheObj, Vector<size_t> &dependencies) const
+{
+  if (!cacheObj) {
+    EvalContext::CurrentNodeSetter cns(style->node(), 0, vm);
+    vm.actualDependencies = &dependencies;
+    cacheObj = vm.eval(code_.pointer(), style->display());
+    ASSERT(cacheObj != 0);
+    vm.actualDependencies = 0;
+  }
+  if (!vm.interp->isError(cacheObj)) {
+    ConstPtr<InheritedC> c(inheritedC_->make(cacheObj, loc_, *vm.interp));
+    if (!c.isNull())
+      c->set(vm, 0, fotb, cacheObj, dependencies);
+  }
+}
+
+ConstPtr<InheritedC> VarInheritedC::make(ELObj *obj, const Location &loc, Interpreter &interp)
+     const
+{
+  return inheritedC_->make(obj, loc, interp);
+}
+
+ELObj *VarInheritedC::value(VM &vm, const VarStyleObj *style,
+                           Vector<size_t> &dependencies) const
+{
+  EvalContext::CurrentNodeSetter cns(style->node(), 0, vm);
+  vm.actualDependencies = &dependencies;
+  return vm.eval(code_.pointer(), style->display());
+}
+
+StyleObjIter::StyleObjIter()
+: i_(0), vi_(0)
+{
+}
+
+void StyleObjIter::append(const Vector<ConstPtr<InheritedC> > *v, const VarStyleObj *obj)
+{
+  styleVec_.push_back(obj);
+  vecs_.push_back(v);
+}
+
+ConstPtr<InheritedC> StyleObjIter::next(const VarStyleObj *&style)
+{
+  for (; vi_ < vecs_.size(); vi_++, i_ = 0) {
+    if (i_ < vecs_[vi_]->size()) {
+      style = styleVec_[vi_];
+      return (*vecs_[vi_])[i_++];
+    }
+  }
+  return ConstPtr<InheritedC>();
+}
+
+StyleSpec::StyleSpec(Vector<ConstPtr<InheritedC> > &fs, Vector<ConstPtr<InheritedC> > &s)
+{
+  fs.swap(forceSpecs);
+  s.swap(specs);
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
diff --git a/style/Style.h b/style/Style.h
new file mode 100644 (file)
index 0000000..82fafee
--- /dev/null
@@ -0,0 +1,395 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef Style_INCLUDED
+#define Style_INCLUDED 1
+
+#include "types.h"
+#include "StringC.h"
+#include "Named.h"
+#include <stddef.h>
+#include "ELObj.h"
+#include "Vector.h"
+#include "Ptr.h"
+#include "Resource.h"
+#include "Owner.h"
+#include "Insn.h"
+#include "FOTBuilder.h"
+#include "Boolean.h"
+#include "Node.h"
+#include "Location.h"
+#include "ProcessingMode.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class StyleStack;
+class Interpreter;
+class VarStyleObj;
+
+// InheritedC represents the specification of a value
+// of an inherited characteristic.
+// It is also used as a prototype for other specifications of
+// values for that characteristic:
+// the identifier for an inherited characteristic contains the
+// InheritedC that specifies its initial value.
+
+class InheritedC : public Resource {
+public:
+  InheritedC(const Identifier *ident, unsigned index);
+  virtual ~InheritedC();
+  virtual void set(VM &vm, const VarStyleObj *, FOTBuilder &,
+                   ELObj *&, Vector<size_t> &dependencies) const = 0;
+  virtual ELObj *value(VM &, const VarStyleObj *, Vector<size_t> &) const = 0;
+  virtual ConstPtr<InheritedC> make(ELObj *, const Location &, Interpreter &) const = 0;
+  unsigned index() const;
+  const Identifier *identifier() const;
+  void setIdentifier(const Identifier *);
+protected:
+  void invalidValue(const Location &, Interpreter &) const;
+private:
+  const Identifier *ident_;
+  // The index of the inherited characteristic (not the specification).
+  unsigned index_;
+};
+
+class VarInheritedC : public InheritedC {
+public:
+  VarInheritedC(const ConstPtr<InheritedC> &, const InsnPtr &code, const Location &);
+  void set(VM &, const VarStyleObj *, FOTBuilder &, ELObj *&value,
+           Vector<size_t> &dependencies) const;
+  ELObj *value(VM &, const VarStyleObj *, Vector<size_t> &) const;
+  virtual ConstPtr<InheritedC> make(ELObj *, const Location &, Interpreter &) const;
+private:
+  ConstPtr<InheritedC> inheritedC_;
+  InsnPtr code_;
+  Location loc_;
+};
+
+class StyleObjIter {
+public:
+  StyleObjIter();
+  void append(const Vector<ConstPtr<InheritedC> > *, const VarStyleObj *);
+  ConstPtr<InheritedC> next(const VarStyleObj *&);
+private:
+  size_t i_;
+  size_t vi_;
+  Vector<const VarStyleObj *> styleVec_;
+  Vector<const Vector<ConstPtr<InheritedC> > *> vecs_;
+};
+
+class StyleObj : public ELObj {
+public:
+  StyleObj *asStyle();
+  virtual void appendIter(StyleObjIter &) const = 0;
+};
+
+struct StyleSpec : public Resource {
+  StyleSpec(Vector<ConstPtr<InheritedC> > &, Vector<ConstPtr<InheritedC> > &);
+  Vector<ConstPtr<InheritedC> > forceSpecs;
+  Vector<ConstPtr<InheritedC> > specs;
+};
+
+class BasicStyleObj : public StyleObj {
+public:
+  virtual void appendIterForce(StyleObjIter &) const = 0;
+  virtual void appendIterNormal(StyleObjIter &) const = 0;
+};
+
+class VarStyleObj : public BasicStyleObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  VarStyleObj(const ConstPtr<StyleSpec> &, StyleObj *use, ELObj **display,
+              const NodePtr &node);
+  ~VarStyleObj();
+  void appendIter(StyleObjIter &) const;
+  void appendIterForce(StyleObjIter &) const;
+  void appendIterNormal(StyleObjIter &) const;
+  const NodePtr &node() const;
+  ELObj **display() const;
+  void traceSubObjects(Collector &) const;
+private:
+  ConstPtr<StyleSpec> styleSpec_;
+  StyleObj *use_;
+  ELObj **display_;
+  NodePtr node_;
+};
+
+class OverriddenStyleObj : public StyleObj {
+public:
+  OverriddenStyleObj(BasicStyleObj *basic, StyleObj *override);
+  void appendIter(StyleObjIter &) const;
+  void traceSubObjects(Collector &) const;
+private:
+  BasicStyleObj *basic_;
+  StyleObj *override_;
+};
+
+class MergeStyleObj : public StyleObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  MergeStyleObj();
+  void append(StyleObj *);
+  void appendIter(StyleObjIter &) const;
+  void traceSubObjects(Collector &) const;
+private:
+  Vector<StyleObj *> styles_;
+};
+
+class ColorObj : public ELObj {
+public:
+  ColorObj *asColor();
+  virtual void set(FOTBuilder &) const = 0;
+  virtual void setBackground(FOTBuilder &) const = 0;
+};
+
+class DeviceRGBColorObj : public ColorObj {
+public:
+  DeviceRGBColorObj(unsigned char, unsigned char, unsigned char);
+  void set(FOTBuilder &) const;
+  void setBackground(FOTBuilder &) const;
+private:
+  FOTBuilder::DeviceRGBColor color_;
+};
+
+class ColorSpaceObj : public ELObj {
+public:
+  ColorSpaceObj *asColorSpace();
+  virtual ELObj *makeColor(int argc, ELObj **argv, Interpreter &, const Location &) = 0;
+};
+
+class DeviceRGBColorSpaceObj : public ColorSpaceObj {
+public:
+  ELObj *makeColor(int argc, ELObj **argv, Interpreter &interp, const Location &);
+};
+
+class DeviceGrayColorSpaceObj : public ColorSpaceObj {
+public:
+  ELObj *makeColor(int argc, ELObj **argv, Interpreter &interp, const Location &);
+};
+
+class DeviceCMYKColorSpaceObj : public ColorSpaceObj {
+public:
+  ELObj *makeColor(int argc, ELObj **argv, Interpreter &interp, const Location &);
+};
+
+class DeviceKXColorSpaceObj : public ColorSpaceObj {
+public:
+  ELObj *makeColor(int argc, ELObj **argv, Interpreter &interp, const Location &);
+};
+
+class CIEXYZColorSpaceObj : public ColorSpaceObj {
+public:
+  CIEXYZColorSpaceObj(const double *, const double *);
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  ~CIEXYZColorSpaceObj();
+  ELObj *makeColor(const double *, Interpreter &);
+protected:
+struct XYZData {
+  double white_[3];
+  double white_u;
+  double white_v;
+  double M_[9];
+};
+ XYZData *xyzData_; 
+};
+
+class CIELUVColorSpaceObj : public CIEXYZColorSpaceObj {
+public:
+  CIELUVColorSpaceObj(const double *, const double *, const double *);
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  ~CIELUVColorSpaceObj();
+  ELObj *makeColor(int argc, ELObj **argv, Interpreter &interp, const Location &);
+private:
+struct LUVData {
+  double range_[6]; 
+};
+  LUVData *luvData_;
+};
+
+class CIELABColorSpaceObj : public CIEXYZColorSpaceObj {
+public:
+  CIELABColorSpaceObj(const double *, const double *, const double *);
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  ~CIELABColorSpaceObj();
+  ELObj *makeColor(int argc, ELObj **argv, Interpreter &interp, const Location &);
+private:
+struct LABData {
+  double range_[6]; 
+};
+  LABData *labData_; 
+};
+
+class CIEABCColorSpaceObj : public CIEXYZColorSpaceObj {
+public:
+  CIEABCColorSpaceObj(const double *, const double *, const double *,
+                      FunctionObj **, const double *, const double *,
+                      FunctionObj **, const double *);
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  ~CIEABCColorSpaceObj();
+  void traceSubObjects(Collector &) const;
+  ELObj *makeColor(int argc, ELObj **argv, Interpreter &interp, const Location &);
+private:
+struct ABCData {
+  double rangeAbc_[6]; 
+  FunctionObj *decodeAbc_[3]; 
+  double matrixAbc_[9]; 
+  double rangeLmn_[6]; 
+  FunctionObj *decodeLmn_[3]; 
+  double matrixLmn_[9];
+};
+ ABCData *abcData_; 
+};
+
+class CIEAColorSpaceObj : public CIEXYZColorSpaceObj {
+public:
+  CIEAColorSpaceObj(const double *, const double *, const double *,
+                    FunctionObj *, const double *, const double *,
+                    FunctionObj **, const double *);
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  ~CIEAColorSpaceObj();
+  void traceSubObjects(Collector &) const;
+  ELObj *makeColor(int argc, ELObj **argv, Interpreter &interp, const Location &);
+private:
+struct AData {
+  double rangeA_[2]; 
+  FunctionObj *decodeA_; 
+  double matrixA_[3]; 
+  double rangeLmn_[6]; 
+  FunctionObj *decodeLmn_[3]; 
+  double matrixLmn_[9]; 
+};
+  AData *aData_;
+};
+
+struct InheritedCInfo : public Resource {
+  InheritedCInfo(const ConstPtr<InheritedC> &, const VarStyleObj *,
+                unsigned valLevel, unsigned specLevel, const ProcessingMode::Rule *,
+                const Ptr<InheritedCInfo> &);
+  ConstPtr<InheritedC> spec;
+  Ptr<InheritedCInfo> prev;
+  unsigned valLevel;
+  unsigned specLevel;
+  const ProcessingMode::Rule *rule;
+  // If there are dependencies, then the cached value can only
+  // be used only when the "value" flow object is at this level.
+  ELObj *cachedValue;
+  const VarStyleObj *style;
+  // Includes both direct and indirect dependencies.
+  Vector<size_t> dependencies;
+};
+
+struct PopList : public Resource {
+  PopList(const Ptr<PopList> &);
+  Vector<size_t> list;
+  // List of the indices of those ICs that have dependencies
+  // (ie that use actual-*) directly or indirectly.
+  Vector<size_t> dependingList;
+  Ptr<PopList> prev;
+};
+
+class StyleStack {
+public:
+  StyleStack();
+  // These append on to dependencies.
+  ELObj *actual(const ConstPtr<InheritedC> &, const Location &, Interpreter &,
+               Vector<size_t> &dependencies);
+  ELObj *actual(const ConstPtr<InheritedC> &, Interpreter &,
+               Vector<size_t> &dependencies);
+  ELObj *inherited(const ConstPtr<InheritedC> &, unsigned specLevel, Interpreter &,
+                  Vector<size_t> &dependencies);
+  void push(StyleObj *, VM &, FOTBuilder &);
+  void pushStart();
+  void pushContinue(StyleObj *, const ProcessingMode::Rule *, const NodePtr &,
+                   Messenger *);
+  void pushEnd(VM &, FOTBuilder &);
+  void pop();
+  void pushEmpty() { level_++; }
+  void popEmpty() { level_--; }
+  unsigned level() const { return level_; }
+  void trace(Collector &) const;
+private:
+  Vector<Ptr<InheritedCInfo> > inheritedCInfo_;
+  unsigned level_;
+  Ptr<PopList> popList_;
+};
+
+inline
+PopList::PopList(const Ptr<PopList> &p)
+: prev(p)
+{
+}
+
+inline
+const Identifier *InheritedC::identifier() const
+{
+  return ident_;
+}
+
+inline
+void InheritedC::setIdentifier(const Identifier *ident)
+{
+  ident_ = ident;
+}
+
+inline
+unsigned InheritedC::index() const
+{
+  return index_;
+}
+
+inline
+ELObj **VarStyleObj::display() const
+{
+  return display_;
+}
+
+inline
+const NodePtr &VarStyleObj::node() const
+{
+  return node_;
+}
+
+inline
+void StyleStack::pushStart()
+{
+  level_++;
+  popList_ = new PopList(popList_);
+}
+
+inline
+void StyleStack::push(StyleObj *style, VM &vm, FOTBuilder &fotb)
+{
+  pushStart();
+  pushContinue(style, 0, NodePtr(), 0);
+  pushEnd(vm, fotb);
+}
+
+inline
+ELObj *StyleStack::actual(const ConstPtr<InheritedC> &ic,
+                         Interpreter &interp,
+                         Vector<size_t> &dep)
+{
+  return actual(ic, Location(), interp, dep);
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not Style_INCLUDED */
diff --git a/style/StyleEngine.cxx b/style/StyleEngine.cxx
new file mode 100644 (file)
index 0000000..be870f6
--- /dev/null
@@ -0,0 +1,151 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#include "stylelib.h"
+#include "StyleEngine.h"
+#include "Interpreter.h"
+#include "InterpreterMessages.h"
+#include "SchemeParser.h"
+#include "FOTBuilder.h"
+#include "DssslSpecEventHandler.h"
+#include "ArcEngine.h"
+#include "ProcessContext.h"
+#include "macros.h"
+#include "InternalInputSource.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+StyleEngine::StyleEngine(Messenger &mgr,
+                        GroveManager &groveManager,
+                        int unitsPerInch,
+                        bool debugMode,
+                        bool dsssl2,
+                         bool strictMode,
+                        const FOTBuilder::Extension *extensionTable)
+: interpreter_(new Interpreter(&groveManager, &mgr, unitsPerInch, 
+                               debugMode, dsssl2, strictMode, extensionTable))
+{
+}
+
+void StyleEngine::parseSpec(SgmlParser &specParser,
+                           const CharsetInfo &charset,
+                           const StringC &id,
+                           Messenger &mgr)
+{
+  DssslSpecEventHandler specHandler(mgr);
+  Vector<DssslSpecEventHandler::Part *> parts;
+  specHandler.load(specParser, charset, id, parts);
+  for (int phase = 0; phase < 2; phase++) {
+    for (size_t i = 0; i < parts.size(); i++) {
+      DssslSpecEventHandler::Part::DIter diter(parts[i]->doc()->diter());
+      bool local = 0;
+      do {
+       if (local) 
+         diter = parts[i]->diter();
+       local = !local;
+       for (; !diter.done(); diter.next()) {
+         if ((diter.cur()->type() == DssslSpecEventHandler::DeclarationElement::charRepertoire ||
+               diter.cur()->type() == DssslSpecEventHandler::DeclarationElement::standardChars)
+             ? phase == 0
+             : phase == 1) {
+           Owner<InputSource> in;
+           diter.cur()->makeInputSource(specHandler, in);
+           SchemeParser scm(*interpreter_, in);
+           switch (diter.cur()->type()) {
+            case DssslSpecEventHandler::DeclarationElement::charRepertoire:
+              interpreter_->setCharRepertoire(diter.cur()->name());
+              break;
+            case DssslSpecEventHandler::DeclarationElement::standardChars:
+              scm.parseStandardChars(); 
+              break;
+            case DssslSpecEventHandler::DeclarationElement::mapSdataEntity:
+              scm.parseMapSdataEntity(diter.cur()->name(), diter.cur()->text());
+              break;
+            case DssslSpecEventHandler::DeclarationElement::addNameChars:
+              scm.parseNameChars();
+              break;
+            case DssslSpecEventHandler::DeclarationElement::addSeparatorChars:
+              scm.parseSeparatorChars();
+              break;
+            default:
+              interpreter_->message(
+                     InterpreterMessages::unsupportedDeclaration);
+             break;
+            }
+          }
+       }
+      } while (local);
+      interpreter_->dEndPart();
+    }
+  }
+
+  if (cmdline.size() > 0) {  
+    Owner<InputSource> in(new InternalInputSource(cmdline,
+                          InputSourceOrigin::make()));
+    SchemeParser scm(*interpreter_, in);
+    scm.parse();
+    interpreter_->endPart();
+  }
+  for (size_t i = 0; i < parts.size(); i++) {
+    for (DssslSpecEventHandler::Part::Iter iter(parts[i]->iter());
+         !iter.done();
+        iter.next()) {
+      Owner<InputSource> in;
+      iter.cur()->makeInputSource(specHandler, in);
+      if (in) {
+       SchemeParser scm(*interpreter_, in);
+       scm.parse();
+      }
+    }
+    interpreter_->endPart();
+  }
+  interpreter_->compile();
+}
+
+void StyleEngine::defineVariable(const StringC &str)
+{
+  // Dk: Interpret "name=value" as a string variable Setting.
+  if (str[0] == '(') {
+    cmdline += str;
+  } 
+  else {
+    int i;
+    for (i = 0; (i < str.size()) && (str[i] != '='); i++)
+      ;
+
+    // Dk: Not name=value?
+    if (!i || (i >= (str.size()))) {  
+      cmdline += interpreter_->makeStringC("(define ");
+      cmdline += str;
+      cmdline += interpreter_->makeStringC(" #t)");
+    }
+    else {  
+      // Dk: name=value.
+      cmdline += interpreter_->makeStringC("(define ");
+      cmdline += StringC(str.begin(), i);
+      cmdline += interpreter_->makeStringC(" \"");
+      if (str.size() - (i + 1) > 0);
+        cmdline += StringC(str.begin() + i + 1, str.size() - (i + 1));
+      cmdline += interpreter_->makeStringC("\")");
+    }
+  }
+}
+
+StyleEngine::~StyleEngine()
+{
+  delete interpreter_;
+}
+
+void StyleEngine::process(const NodePtr &node, FOTBuilder &fotb)
+{
+  ProcessContext context(*interpreter_, fotb);
+  context.process(node);
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
diff --git a/style/StyleEngine.h b/style/StyleEngine.h
new file mode 100644 (file)
index 0000000..df4703d
--- /dev/null
@@ -0,0 +1,45 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef StyleEngine_INCLUDED
+#define StyleEngine_INCLUDED 1
+
+#include "Boolean.h"
+#include "Node.h"
+#include "Message.h"
+#include "SgmlParser.h"
+#include "FOTBuilder.h"
+#include "GroveManager.h"
+#include "dsssl_ns.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class Interpreter;
+
+class STYLE_API StyleEngine {
+public:
+  StyleEngine(Messenger &, GroveManager &,
+             int unitsPerInch, bool debugMode, bool dsssl2,
+             bool strictMode, const FOTBuilder::Extension * = 0);
+  void defineVariable(const StringC &);
+  void parseSpec(SgmlParser &specParser,
+                const CharsetInfo &charset,
+                const StringC &id,
+                Messenger &mgr);
+  void process(const NodePtr &, FOTBuilder &);
+  ~StyleEngine();
+private:
+  StyleEngine(const StyleEngine &);  // undefined
+  void operator=(const StyleEngine &); // undefined
+
+  Interpreter *interpreter_;
+  StringC cmdline;
+};
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not StyleEngine_INCLUDED */
diff --git a/style/VM.h b/style/VM.h
new file mode 100644 (file)
index 0000000..3b3ffe7
--- /dev/null
@@ -0,0 +1,74 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef VM_INCLUDED
+#define VM_INCLUDED 1
+
+#include "Collector.h"
+#include "EvalContext.h"
+#include "Location.h"
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class ELObj;
+class ContinuationObj;
+class Interpreter;
+class Insn;
+
+class VM : public EvalContext, private Collector::DynamicRoot  {
+public:
+  VM(Interpreter &);
+  VM(EvalContext &, Interpreter &);
+  virtual ~VM();
+  ELObj **sp;
+  Interpreter *interp;
+  ELObj **closure;
+  ELObj *protectClosure;
+  ELObj **frame;
+  int nActualArgs;
+  Location closureLoc;
+  ELObj *eval(const Insn *, ELObj **display = 0, ELObj *arg = 0);
+  void initStack();
+  void needStack(int);
+  void pushFrame(const Insn *next, int argsPushed);
+  const Insn *popFrame();
+  void setClosureArgToCC();
+  void trace(Collector &) const;
+  Vector<const ProcessingMode *> modeStack;
+private:
+  void growStack(int);
+  void init();
+  void stackTrace();
+
+  ELObj **slim;
+  ELObj **sbase;
+
+  struct ControlStackEntry {
+    int frameSize;             // before pushing args
+    ELObj **closure;
+    ELObj *protectClosure;
+    Location closureLoc;
+    ContinuationObj *continuation;
+    const Insn *next;
+  };
+
+  ControlStackEntry *csp;
+  ControlStackEntry *csbase;
+  ControlStackEntry *cslim;
+  friend class ContinuationObj;
+};
+
+inline
+void VM::needStack(int n)
+{
+  if (slim - sp < n)
+    growStack(n);
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#endif /* not VM_INCLUDED */
diff --git a/style/charNames.h b/style/charNames.h
new file mode 100644 (file)
index 0000000..bbce515
--- /dev/null
@@ -0,0 +1,895 @@
+// Unicode code, character name
+{ 0x000a, "line-feed" },
+{ 0x000d, "carriage-return" },
+{ 0x0020, "space" },
+{ 0x0021, "exclamation-mark" },
+{ 0x0022, "quotation-mark" },
+{ 0x0023, "number-sign" },
+{ 0x0024, "dollar-sign" },
+{ 0x0025, "percent-sign" },
+{ 0x0026, "ampersand" },
+{ 0x0027, "apostrophe" },
+{ 0x0028, "left-parenthesis" },
+{ 0x0029, "right-parenthesis" },
+{ 0x002a, "asterisk" },
+{ 0x002b, "plus-sign" },
+{ 0x002c, "comma" },
+{ 0x002d, "hyphen-minus" },
+{ 0x002e, "full-stop" },
+{ 0x002f, "solidus" },
+{ 0x0030, "digit-zero" },
+{ 0x0031, "digit-one" },
+{ 0x0032, "digit-two" },
+{ 0x0033, "digit-three" },
+{ 0x0034, "digit-four" },
+{ 0x0035, "digit-five" },
+{ 0x0036, "digit-six" },
+{ 0x0037, "digit-seven" },
+{ 0x0038, "digit-eight" },
+{ 0x0039, "digit-nine" },
+{ 0x003a, "colon" },
+{ 0x003b, "semicolon" },
+{ 0x003c, "less-than-sign" },
+{ 0x003d, "equals-sign" },
+{ 0x003e, "greater-than-sign" },
+{ 0x003f, "question-mark" },
+{ 0x0040, "commercial-at" },
+{ 0x0041, "latin-capital-letter-a" },
+{ 0x0042, "latin-capital-letter-b" },
+{ 0x0043, "latin-capital-letter-c" },
+{ 0x0044, "latin-capital-letter-d" },
+{ 0x0045, "latin-capital-letter-e" },
+{ 0x0046, "latin-capital-letter-f" },
+{ 0x0047, "latin-capital-letter-g" },
+{ 0x0048, "latin-capital-letter-h" },
+{ 0x0049, "latin-capital-letter-i" },
+{ 0x004a, "latin-capital-letter-j" },
+{ 0x004b, "latin-capital-letter-k" },
+{ 0x004c, "latin-capital-letter-l" },
+{ 0x004d, "latin-capital-letter-m" },
+{ 0x004e, "latin-capital-letter-n" },
+{ 0x004f, "latin-capital-letter-o" },
+{ 0x0050, "latin-capital-letter-p" },
+{ 0x0051, "latin-capital-letter-q" },
+{ 0x0052, "latin-capital-letter-r" },
+{ 0x0053, "latin-capital-letter-s" },
+{ 0x0054, "latin-capital-letter-t" },
+{ 0x0055, "latin-capital-letter-u" },
+{ 0x0056, "latin-capital-letter-v" },
+{ 0x0057, "latin-capital-letter-w" },
+{ 0x0058, "latin-capital-letter-x" },
+{ 0x0059, "latin-capital-letter-y" },
+{ 0x005a, "latin-capital-letter-z" },
+{ 0x005b, "left-square-bracket" },
+{ 0x005c, "reverse-solidus" },
+{ 0x005d, "right-square-bracket" },
+{ 0x005e, "circumflex-accent" },
+{ 0x005f, "low-line" },
+{ 0x0060, "grave-accent" },
+{ 0x0061, "latin-small-letter-a" },
+{ 0x0062, "latin-small-letter-b" },
+{ 0x0063, "latin-small-letter-c" },
+{ 0x0064, "latin-small-letter-d" },
+{ 0x0065, "latin-small-letter-e" },
+{ 0x0066, "latin-small-letter-f" },
+{ 0x0067, "latin-small-letter-g" },
+{ 0x0068, "latin-small-letter-h" },
+{ 0x0069, "latin-small-letter-i" },
+{ 0x006a, "latin-small-letter-j" },
+{ 0x006b, "latin-small-letter-k" },
+{ 0x006c, "latin-small-letter-l" },
+{ 0x006d, "latin-small-letter-m" },
+{ 0x006e, "latin-small-letter-n" },
+{ 0x006f, "latin-small-letter-o" },
+{ 0x0070, "latin-small-letter-p" },
+{ 0x0071, "latin-small-letter-q" },
+{ 0x0072, "latin-small-letter-r" },
+{ 0x0073, "latin-small-letter-s" },
+{ 0x0074, "latin-small-letter-t" },
+{ 0x0075, "latin-small-letter-u" },
+{ 0x0076, "latin-small-letter-v" },
+{ 0x0077, "latin-small-letter-w" },
+{ 0x0078, "latin-small-letter-x" },
+{ 0x0079, "latin-small-letter-y" },
+{ 0x007a, "latin-small-letter-z" },
+{ 0x007b, "left-curly-bracket" },
+{ 0x007c, "vertical-line" },
+{ 0x007d, "right-curly-bracket" },
+{ 0x007e, "tilde" },
+{ 0x00a0, "no-break-space" },
+{ 0x00a1, "inverted-exclamation-mark" },
+{ 0x00a2, "cent-sign" },
+{ 0x00a3, "pound-sign" },
+{ 0x00a4, "currency-sign" },
+{ 0x00a5, "yen-sign" },
+{ 0x00a6, "broken-bar" },
+{ 0x00a7, "section-sign" },
+{ 0x00a8, "diaeresis" },
+{ 0x00a9, "copyright-sign" },
+{ 0x00aa, "feminine-ordinal-indicator" },
+{ 0x00ab, "left-pointing-double-angle-quotation-mark" },
+{ 0x00ac, "not-sign" },
+{ 0x00ad, "soft-hyphen" },
+{ 0x00ae, "registered-sign" },
+{ 0x00af, "macron" },
+{ 0x00b0, "degree-sign" },
+{ 0x00b1, "plus-minus-sign" },
+{ 0x00b2, "superscript-two" },
+{ 0x00b3, "superscript-three" },
+{ 0x00b4, "acute-accent" },
+{ 0x00b5, "micro-sign" },
+{ 0x00b6, "pilcrow-sign" },
+{ 0x00b7, "middle-dot" },
+{ 0x00b8, "cedilla" },
+{ 0x00b9, "superscript-one" },
+{ 0x00ba, "masculine-ordinal-indicator" },
+{ 0x00bb, "right-pointing-double-angle-quotation-mark" },
+{ 0x00bc, "vulgar-fraction-one-quarter" },
+{ 0x00bd, "vulgar-fraction-one-half" },
+{ 0x00be, "vulgar-fraction-three-quarters" },
+{ 0x00bf, "inverted-question-mark" },
+{ 0x00c0, "latin-capital-letter-a-with-grave" },
+{ 0x00c1, "latin-capital-letter-a-with-acute" },
+{ 0x00c2, "latin-capital-letter-a-with-circumflex" },
+{ 0x00c3, "latin-capital-letter-a-with-tilde" },
+{ 0x00c4, "latin-capital-letter-a-with-diaeresis" },
+{ 0x00c5, "latin-capital-letter-a-with-ring-above" },
+{ 0x00c6, "latin-capital-letter-ae" },
+{ 0x00c7, "latin-capital-letter-c-with-cedilla" },
+{ 0x00c8, "latin-capital-letter-e-with-grave" },
+{ 0x00c9, "latin-capital-letter-e-with-acute" },
+{ 0x00ca, "latin-capital-letter-e-with-circumflex" },
+{ 0x00cb, "latin-capital-letter-e-with-diaeresis" },
+{ 0x00cc, "latin-capital-letter-i-with-grave" },
+{ 0x00cd, "latin-capital-letter-i-with-acute" },
+{ 0x00ce, "latin-capital-letter-i-with-circumflex" },
+{ 0x00cf, "latin-capital-letter-i-with-diaeresis" },
+{ 0x00d0, "latin-capital-letter-eth" },
+{ 0x00d1, "latin-capital-letter-n-with-tilde" },
+{ 0x00d2, "latin-capital-letter-o-with-grave" },
+{ 0x00d3, "latin-capital-letter-o-with-acute" },
+{ 0x00d4, "latin-capital-letter-o-with-circumflex" },
+{ 0x00d5, "latin-capital-letter-o-with-tilde" },
+{ 0x00d6, "latin-capital-letter-o-with-diaeresis" },
+{ 0x00d7, "multiplication-sign" },
+{ 0x00d8, "latin-capital-letter-o-with-stroke" },
+{ 0x00d9, "latin-capital-letter-u-with-grave" },
+{ 0x00da, "latin-capital-letter-u-with-acute" },
+{ 0x00db, "latin-capital-letter-u-with-circumflex" },
+{ 0x00dc, "latin-capital-letter-u-with-diaeresis" },
+{ 0x00dd, "latin-capital-letter-y-with-acute" },
+{ 0x00de, "latin-capital-letter-thorn" },
+{ 0x00df, "latin-small-letter-sharp-s" },
+{ 0x00e0, "latin-small-letter-a-with-grave" },
+{ 0x00e1, "latin-small-letter-a-with-acute" },
+{ 0x00e2, "latin-small-letter-a-with-circumflex" },
+{ 0x00e3, "latin-small-letter-a-with-tilde" },
+{ 0x00e4, "latin-small-letter-a-with-diaeresis" },
+{ 0x00e5, "latin-small-letter-a-with-ring-above" },
+{ 0x00e6, "latin-small-letter-ae" },
+{ 0x00e7, "latin-small-letter-c-with-cedilla" },
+{ 0x00e8, "latin-small-letter-e-with-grave" },
+{ 0x00e9, "latin-small-letter-e-with-acute" },
+{ 0x00ea, "latin-small-letter-e-with-circumflex" },
+{ 0x00eb, "latin-small-letter-e-with-diaeresis" },
+{ 0x00ec, "latin-small-letter-i-with-grave" },
+{ 0x00ed, "latin-small-letter-i-with-acute" },
+{ 0x00ee, "latin-small-letter-i-with-circumflex" },
+{ 0x00ef, "latin-small-letter-i-with-diaeresis" },
+{ 0x00f0, "latin-small-letter-eth" },
+{ 0x00f1, "latin-small-letter-n-with-tilde" },
+{ 0x00f2, "latin-small-letter-o-with-grave" },
+{ 0x00f3, "latin-small-letter-o-with-acute" },
+{ 0x00f4, "latin-small-letter-o-with-circumflex" },
+{ 0x00f5, "latin-small-letter-o-with-tilde" },
+{ 0x00f6, "latin-small-letter-o-with-diaeresis" },
+{ 0x00f7, "division-sign" },
+{ 0x00f8, "latin-small-letter-o-with-stroke" },
+{ 0x00f9, "latin-small-letter-u-with-grave" },
+{ 0x00fa, "latin-small-letter-u-with-acute" },
+{ 0x00fb, "latin-small-letter-u-with-circumflex" },
+{ 0x00fc, "latin-small-letter-u-with-diaeresis" },
+{ 0x00fd, "latin-small-letter-y-with-acute" },
+{ 0x00fe, "latin-small-letter-thorn" },
+{ 0x00ff, "latin-small-letter-y-with-diaeresis" },
+{ 0x0100, "latin-capital-letter-a-with-macron" },
+{ 0x0101, "latin-small-letter-a-with-macron" },
+{ 0x0102, "latin-capital-letter-a-with-breve" },
+{ 0x0103, "latin-small-letter-a-with-breve" },
+{ 0x0104, "latin-capital-letter-a-with-ogonek" },
+{ 0x0105, "latin-small-letter-a-with-ogonek" },
+{ 0x0106, "latin-capital-letter-c-with-acute" },
+{ 0x0107, "latin-small-letter-c-with-acute" },
+{ 0x0108, "latin-capital-letter-c-with-circumflex" },
+{ 0x0109, "latin-small-letter-c-with-circumflex" },
+{ 0x010a, "latin-capital-letter-c-with-dot-above" },
+{ 0x010b, "latin-small-letter-c-with-dot-above" },
+{ 0x010c, "latin-capital-letter-c-with-caron" },
+{ 0x010d, "latin-small-letter-c-with-caron" },
+{ 0x010e, "latin-capital-letter-d-with-caron" },
+{ 0x010f, "latin-small-letter-d-with-caron" },
+{ 0x0110, "latin-capital-letter-d-with-stroke" },
+{ 0x0111, "latin-small-letter-d-with-stroke" },
+{ 0x0112, "latin-capital-letter-e-with-macron" },
+{ 0x0113, "latin-small-letter-e-with-macron" },
+{ 0x0114, "latin-capital-letter-e-with-breve" },
+{ 0x0115, "latin-small-letter-e-with-breve" },
+{ 0x0116, "latin-capital-letter-e-with-dot-above" },
+{ 0x0117, "latin-small-letter-e-with-dot-above" },
+{ 0x0118, "latin-capital-letter-e-with-ogonek" },
+{ 0x0119, "latin-small-letter-e-with-ogonek" },
+{ 0x011a, "latin-capital-letter-e-with-caron" },
+{ 0x011b, "latin-small-letter-e-with-caron" },
+{ 0x011c, "latin-capital-letter-g-with-circumflex" },
+{ 0x011d, "latin-small-letter-g-with-circumflex" },
+{ 0x011e, "latin-capital-letter-g-with-breve" },
+{ 0x011f, "latin-small-letter-g-with-breve" },
+{ 0x0120, "latin-capital-letter-g-with-dot-above" },
+{ 0x0121, "latin-small-letter-g-with-dot-above" },
+{ 0x0122, "latin-capital-letter-g-with-cedilla" },
+{ 0x0123, "latin-small-letter-g-with-cedilla" },
+{ 0x0124, "latin-capital-letter-h-with-circumflex" },
+{ 0x0125, "latin-small-letter-h-with-circumflex" },
+{ 0x0126, "latin-capital-letter-h-with-stroke" },
+{ 0x0127, "latin-small-letter-h-with-stroke" },
+{ 0x0128, "latin-capital-letter-i-with-tilde" },
+{ 0x0129, "latin-small-letter-i-with-tilde" },
+{ 0x012a, "latin-capital-letter-i-with-macron" },
+{ 0x012b, "latin-small-letter-i-with-macron" },
+{ 0x012c, "latin-capital-letter-i-with-breve" },
+{ 0x012d, "latin-small-letter-i-with-breve" },
+{ 0x012e, "latin-capital-letter-i-with-ogonek" },
+{ 0x012f, "latin-small-letter-i-with-ogonek" },
+{ 0x0130, "latin-capital-letter-i-with-dot-above" },
+{ 0x0131, "latin-small-letter-dotless-i" },
+{ 0x0132, "latin-capital-ligature-ij" },
+{ 0x0133, "latin-small-ligature-ij" },
+{ 0x0134, "latin-capital-letter-j-with-circumflex" },
+{ 0x0135, "latin-small-letter-j-with-circumflex" },
+{ 0x0136, "latin-capital-letter-k-with-cedilla" },
+{ 0x0137, "latin-small-letter-k-with-cedilla" },
+{ 0x0138, "latin-small-letter-kra" },
+{ 0x0139, "latin-capital-letter-l-with-acute" },
+{ 0x013a, "latin-small-letter-l-with-acute" },
+{ 0x013b, "latin-capital-letter-l-with-cedilla" },
+{ 0x013c, "latin-small-letter-l-with-cedilla" },
+{ 0x013d, "latin-capital-letter-l-with-caron" },
+{ 0x013e, "latin-small-letter-l-with-caron" },
+{ 0x013f, "latin-capital-letter-l-with-middle-dot" },
+{ 0x0140, "latin-small-letter-l-with-middle-dot" },
+{ 0x0141, "latin-capital-letter-l-with-stroke" },
+{ 0x0142, "latin-small-letter-l-with-stroke" },
+{ 0x0143, "latin-capital-letter-n-with-acute" },
+{ 0x0144, "latin-small-letter-n-with-acute" },
+{ 0x0145, "latin-capital-letter-n-with-cedilla" },
+{ 0x0146, "latin-small-letter-n-with-cedilla" },
+{ 0x0147, "latin-capital-letter-n-with-caron" },
+{ 0x0148, "latin-small-letter-n-with-caron" },
+{ 0x0149, "latin-small-letter-n-preceded-by-apostrophe" },
+{ 0x014a, "latin-capital-letter-eng" },
+{ 0x014b, "latin-small-letter-eng" },
+{ 0x014c, "latin-capital-letter-o-with-macron" },
+{ 0x014d, "latin-small-letter-o-with-macron" },
+{ 0x014e, "latin-capital-letter-o-with-breve" },
+{ 0x014f, "latin-small-letter-o-with-breve" },
+{ 0x0150, "latin-capital-letter-o-with-double-acute" },
+{ 0x0151, "latin-small-letter-o-with-double-acute" },
+{ 0x0152, "latin-capital-ligature-oe" },
+{ 0x0153, "latin-small-ligature-oe" },
+{ 0x0154, "latin-capital-letter-r-with-acute" },
+{ 0x0155, "latin-small-letter-r-with-acute" },
+{ 0x0156, "latin-capital-letter-r-with-cedilla" },
+{ 0x0157, "latin-small-letter-r-with-cedilla" },
+{ 0x0158, "latin-capital-letter-r-with-caron" },
+{ 0x0159, "latin-small-letter-r-with-caron" },
+{ 0x015a, "latin-capital-letter-s-with-acute" },
+{ 0x015b, "latin-small-letter-s-with-acute" },
+{ 0x015c, "latin-capital-letter-s-with-circumflex" },
+{ 0x015d, "latin-small-letter-s-with-circumflex" },
+{ 0x015e, "latin-capital-letter-s-with-cedilla" },
+{ 0x015f, "latin-small-letter-s-with-cedilla" },
+{ 0x0160, "latin-capital-letter-s-with-caron" },
+{ 0x0161, "latin-small-letter-s-with-caron" },
+{ 0x0162, "latin-capital-letter-t-with-cedilla" },
+{ 0x0163, "latin-small-letter-t-with-cedilla" },
+{ 0x0164, "latin-capital-letter-t-with-caron" },
+{ 0x0165, "latin-small-letter-t-with-caron" },
+{ 0x0166, "latin-capital-letter-t-with-stroke" },
+{ 0x0167, "latin-small-letter-t-with-stroke" },
+{ 0x0168, "latin-capital-letter-u-with-tilde" },
+{ 0x0169, "latin-small-letter-u-with-tilde" },
+{ 0x016a, "latin-capital-letter-u-with-macron" },
+{ 0x016b, "latin-small-letter-u-with-macron" },
+{ 0x016c, "latin-capital-letter-u-with-breve" },
+{ 0x016d, "latin-small-letter-u-with-breve" },
+{ 0x016e, "latin-capital-letter-u-with-ring-above" },
+{ 0x016f, "latin-small-letter-u-with-ring-above" },
+{ 0x0170, "latin-capital-letter-u-with-double-acute" },
+{ 0x0171, "latin-small-letter-u-with-double-acute" },
+{ 0x0172, "latin-capital-letter-u-with-ogonek" },
+{ 0x0173, "latin-small-letter-u-with-ogonek" },
+{ 0x0174, "latin-capital-letter-w-with-circumflex" },
+{ 0x0175, "latin-small-letter-w-with-circumflex" },
+{ 0x0176, "latin-capital-letter-y-with-circumflex" },
+{ 0x0177, "latin-small-letter-y-with-circumflex" },
+{ 0x0178, "latin-capital-letter-y-with-diaeresis" },
+{ 0x0179, "latin-capital-letter-z-with-acute" },
+{ 0x017a, "latin-small-letter-z-with-acute" },
+{ 0x017b, "latin-capital-letter-z-with-dot-above" },
+{ 0x017c, "latin-small-letter-z-with-dot-above" },
+{ 0x017d, "latin-capital-letter-z-with-caron" },
+{ 0x017e, "latin-small-letter-z-with-caron" },
+{ 0x017f, "latin-small-letter-long-s" },
+{ 0x0192, "latin-small-letter-f-with-hook" },
+{ 0x01fa, "latin-capital-letter-a-with-ring-above-and-acute" },
+{ 0x01fb, "latin-small-letter-a-with-ring-above-and-acute" },
+{ 0x01fc, "latin-capital-letter-ae-with-acute" },
+{ 0x01fd, "latin-small-letter-ae-with-acute" },
+{ 0x01fe, "latin-capital-letter-o-with-stroke-and-acute" },
+{ 0x01ff, "latin-small-letter-o-with-stroke-and-acute" },
+{ 0x02c6, "modifier-letter-circumflex-accent" },
+{ 0x02c7, "caron" },
+{ 0x02c9, "modifier-letter-macron" },
+{ 0x02d8, "breve" },
+{ 0x02d9, "dot-above" },
+{ 0x02da, "ring-above" },
+{ 0x02db, "ogonek" },
+{ 0x02dc, "small-tilde" },
+{ 0x02dd, "double-acute-accent" },
+{ 0x0384, "greek-tonos" },
+{ 0x0385, "greek-dialytika-tonos" },
+{ 0x0386, "greek-capital-letter-alpha-with-tonos" },
+{ 0x0387, "greek-ano-teleia" },
+{ 0x0388, "greek-capital-letter-epsilon-with-tonos" },
+{ 0x0389, "greek-capital-letter-eta-with-tonos" },
+{ 0x038a, "greek-capital-letter-iota-with-tonos" },
+{ 0x038c, "greek-capital-letter-omicron-with-tonos" },
+{ 0x038e, "greek-capital-letter-upsilon-with-tonos" },
+{ 0x038f, "greek-capital-letter-omega-with-tonos" },
+{ 0x0390, "greek-small-letter-iota-with-dialytika-and-tonos" },
+{ 0x0391, "greek-capital-letter-alpha" },
+{ 0x0392, "greek-capital-letter-beta" },
+{ 0x0393, "greek-capital-letter-gamma" },
+{ 0x0394, "greek-capital-letter-delta" },
+{ 0x0395, "greek-capital-letter-epsilon" },
+{ 0x0396, "greek-capital-letter-zeta" },
+{ 0x0397, "greek-capital-letter-eta" },
+{ 0x0398, "greek-capital-letter-theta" },
+{ 0x0399, "greek-capital-letter-iota" },
+{ 0x039a, "greek-capital-letter-kappa" },
+{ 0x039b, "greek-capital-letter-lamda" },
+{ 0x039c, "greek-capital-letter-mu" },
+{ 0x039d, "greek-capital-letter-nu" },
+{ 0x039e, "greek-capital-letter-xi" },
+{ 0x039f, "greek-capital-letter-omicron" },
+{ 0x03a0, "greek-capital-letter-pi" },
+{ 0x03a1, "greek-capital-letter-rho" },
+{ 0x03a3, "greek-capital-letter-sigma" },
+{ 0x03a4, "greek-capital-letter-tau" },
+{ 0x03a5, "greek-capital-letter-upsilon" },
+{ 0x03a6, "greek-capital-letter-phi" },
+{ 0x03a7, "greek-capital-letter-chi" },
+{ 0x03a8, "greek-capital-letter-psi" },
+{ 0x03a9, "greek-capital-letter-omega" },
+{ 0x03aa, "greek-capital-letter-iota-with-dialytika" },
+{ 0x03ab, "greek-capital-letter-upsilon-with-dialytika" },
+{ 0x03ac, "greek-small-letter-alpha-with-tonos" },
+{ 0x03ad, "greek-small-letter-epsilon-with-tonos" },
+{ 0x03ae, "greek-small-letter-eta-with-tonos" },
+{ 0x03af, "greek-small-letter-iota-with-tonos" },
+{ 0x03b0, "greek-small-letter-upsilon-with-dialytika-and-tonos" },
+{ 0x03b1, "greek-small-letter-alpha" },
+{ 0x03b2, "greek-small-letter-beta" },
+{ 0x03b3, "greek-small-letter-gamma" },
+{ 0x03b4, "greek-small-letter-delta" },
+{ 0x03b5, "greek-small-letter-epsilon" },
+{ 0x03b6, "greek-small-letter-zeta" },
+{ 0x03b7, "greek-small-letter-eta" },
+{ 0x03b8, "greek-small-letter-theta" },
+{ 0x03b9, "greek-small-letter-iota" },
+{ 0x03ba, "greek-small-letter-kappa" },
+{ 0x03bb, "greek-small-letter-lamda" },
+{ 0x03bc, "greek-small-letter-mu" },
+{ 0x03bd, "greek-small-letter-nu" },
+{ 0x03be, "greek-small-letter-xi" },
+{ 0x03bf, "greek-small-letter-omicron" },
+{ 0x03c0, "greek-small-letter-pi" },
+{ 0x03c1, "greek-small-letter-rho" },
+{ 0x03c2, "greek-small-letter-final-sigma" },
+{ 0x03c3, "greek-small-letter-sigma" },
+{ 0x03c4, "greek-small-letter-tau" },
+{ 0x03c5, "greek-small-letter-upsilon" },
+{ 0x03c6, "greek-small-letter-phi" },
+{ 0x03c7, "greek-small-letter-chi" },
+{ 0x03c8, "greek-small-letter-psi" },
+{ 0x03c9, "greek-small-letter-omega" },
+{ 0x03ca, "greek-small-letter-iota-with-dialytika" },
+{ 0x03cb, "greek-small-letter-upsilon-with-dialytika" },
+{ 0x03cc, "greek-small-letter-omicron-with-tonos" },
+{ 0x03cd, "greek-small-letter-upsilon-with-tonos" },
+{ 0x03ce, "greek-small-letter-omega-with-tonos" },
+{ 0x03d1, "greek-theta-symbol" },
+{ 0x03d2, "greek-upsilon-with-hook-symbol" },
+{ 0x03d5, "greek-phi-symbol" },
+{ 0x03d6, "greek-pi-symbol" },
+{ 0x0401, "cyrillic-capital-letter-io" },
+{ 0x0402, "cyrillic-capital-letter-dje" },
+{ 0x0403, "cyrillic-capital-letter-gje" },
+{ 0x0404, "cyrillic-capital-letter-ukrainian-ie" },
+{ 0x0405, "cyrillic-capital-letter-dze" },
+{ 0x0406, "cyrillic-capital-letter-byelorussian-ukrainian-i" },
+{ 0x0407, "cyrillic-capital-letter-yi" },
+{ 0x0408, "cyrillic-capital-letter-je" },
+{ 0x0409, "cyrillic-capital-letter-lje" },
+{ 0x040a, "cyrillic-capital-letter-nje" },
+{ 0x040b, "cyrillic-capital-letter-tshe" },
+{ 0x040c, "cyrillic-capital-letter-kje" },
+{ 0x040e, "cyrillic-capital-letter-short-u" },
+{ 0x040f, "cyrillic-capital-letter-dzhe" },
+{ 0x0410, "cyrillic-capital-letter-a" },
+{ 0x0411, "cyrillic-capital-letter-be" },
+{ 0x0412, "cyrillic-capital-letter-ve" },
+{ 0x0413, "cyrillic-capital-letter-ghe" },
+{ 0x0414, "cyrillic-capital-letter-de" },
+{ 0x0415, "cyrillic-capital-letter-ie" },
+{ 0x0416, "cyrillic-capital-letter-zhe" },
+{ 0x0417, "cyrillic-capital-letter-ze" },
+{ 0x0418, "cyrillic-capital-letter-i" },
+{ 0x0419, "cyrillic-capital-letter-short-i" },
+{ 0x041a, "cyrillic-capital-letter-ka" },
+{ 0x041b, "cyrillic-capital-letter-el" },
+{ 0x041c, "cyrillic-capital-letter-em" },
+{ 0x041d, "cyrillic-capital-letter-en" },
+{ 0x041e, "cyrillic-capital-letter-o" },
+{ 0x041f, "cyrillic-capital-letter-pe" },
+{ 0x0420, "cyrillic-capital-letter-er" },
+{ 0x0421, "cyrillic-capital-letter-es" },
+{ 0x0422, "cyrillic-capital-letter-te" },
+{ 0x0423, "cyrillic-capital-letter-u" },
+{ 0x0424, "cyrillic-capital-letter-ef" },
+{ 0x0425, "cyrillic-capital-letter-ha" },
+{ 0x0426, "cyrillic-capital-letter-tse" },
+{ 0x0427, "cyrillic-capital-letter-che" },
+{ 0x0428, "cyrillic-capital-letter-sha" },
+{ 0x0429, "cyrillic-capital-letter-shcha" },
+{ 0x042a, "cyrillic-capital-letter-hard-sign" },
+{ 0x042b, "cyrillic-capital-letter-yeru" },
+{ 0x042c, "cyrillic-capital-letter-soft-sign" },
+{ 0x042d, "cyrillic-capital-letter-e" },
+{ 0x042e, "cyrillic-capital-letter-yu" },
+{ 0x042f, "cyrillic-capital-letter-ya" },
+{ 0x0430, "cyrillic-small-letter-a" },
+{ 0x0431, "cyrillic-small-letter-be" },
+{ 0x0432, "cyrillic-small-letter-ve" },
+{ 0x0433, "cyrillic-small-letter-ghe" },
+{ 0x0434, "cyrillic-small-letter-de" },
+{ 0x0435, "cyrillic-small-letter-ie" },
+{ 0x0436, "cyrillic-small-letter-zhe" },
+{ 0x0437, "cyrillic-small-letter-ze" },
+{ 0x0438, "cyrillic-small-letter-i" },
+{ 0x0439, "cyrillic-small-letter-short-i" },
+{ 0x043a, "cyrillic-small-letter-ka" },
+{ 0x043b, "cyrillic-small-letter-el" },
+{ 0x043c, "cyrillic-small-letter-em" },
+{ 0x043d, "cyrillic-small-letter-en" },
+{ 0x043e, "cyrillic-small-letter-o" },
+{ 0x043f, "cyrillic-small-letter-pe" },
+{ 0x0440, "cyrillic-small-letter-er" },
+{ 0x0441, "cyrillic-small-letter-es" },
+{ 0x0442, "cyrillic-small-letter-te" },
+{ 0x0443, "cyrillic-small-letter-u" },
+{ 0x0444, "cyrillic-small-letter-ef" },
+{ 0x0445, "cyrillic-small-letter-ha" },
+{ 0x0446, "cyrillic-small-letter-tse" },
+{ 0x0447, "cyrillic-small-letter-che" },
+{ 0x0448, "cyrillic-small-letter-sha" },
+{ 0x0449, "cyrillic-small-letter-shcha" },
+{ 0x044a, "cyrillic-small-letter-hard-sign" },
+{ 0x044b, "cyrillic-small-letter-yeru" },
+{ 0x044c, "cyrillic-small-letter-soft-sign" },
+{ 0x044d, "cyrillic-small-letter-e" },
+{ 0x044e, "cyrillic-small-letter-yu" },
+{ 0x044f, "cyrillic-small-letter-ya" },
+{ 0x0451, "cyrillic-small-letter-io" },
+{ 0x0452, "cyrillic-small-letter-dje" },
+{ 0x0453, "cyrillic-small-letter-gje" },
+{ 0x0454, "cyrillic-small-letter-ukrainian-ie" },
+{ 0x0455, "cyrillic-small-letter-dze" },
+{ 0x0456, "cyrillic-small-letter-byelorussian-ukrainian-i" },
+{ 0x0457, "cyrillic-small-letter-yi" },
+{ 0x0458, "cyrillic-small-letter-je" },
+{ 0x0459, "cyrillic-small-letter-lje" },
+{ 0x045a, "cyrillic-small-letter-nje" },
+{ 0x045b, "cyrillic-small-letter-tshe" },
+{ 0x045c, "cyrillic-small-letter-kje" },
+{ 0x045e, "cyrillic-small-letter-short-u" },
+{ 0x045f, "cyrillic-small-letter-dzhe" },
+{ 0x0490, "cyrillic-capital-letter-ghe-with-upturn" },
+{ 0x0491, "cyrillic-small-letter-ghe-with-upturn" },
+{ 0x0950, "devanagari-om" },
+{ 0x1e80, "latin-capital-letter-w-with-grave" },
+{ 0x1e81, "latin-small-letter-w-with-grave" },
+{ 0x1e82, "latin-capital-letter-w-with-acute" },
+{ 0x1e83, "latin-small-letter-w-with-acute" },
+{ 0x1e84, "latin-capital-letter-w-with-diaeresis" },
+{ 0x1e85, "latin-small-letter-w-with-diaeresis" },
+{ 0x1ef2, "latin-capital-letter-y-with-grave" },
+{ 0x1ef3, "latin-small-letter-y-with-grave" },
+{ 0x2013, "en-dash" },
+{ 0x2014, "em-dash" },
+{ 0x2015, "horizontal-bar" },
+{ 0x2017, "double-low-line" },
+{ 0x2018, "left-single-quotation-mark" },
+{ 0x2019, "right-single-quotation-mark" },
+{ 0x201a, "single-low-9-quotation-mark" },
+{ 0x201b, "single-high-reversed-9-quotation-mark" },
+{ 0x201c, "left-double-quotation-mark" },
+{ 0x201d, "right-double-quotation-mark" },
+{ 0x201e, "double-low-9-quotation-mark" },
+{ 0x2020, "dagger" },
+{ 0x2021, "double-dagger" },
+{ 0x2022, "bullet" },
+{ 0x2026, "horizontal-ellipsis" },
+{ 0x2030, "per-mille-sign" },
+{ 0x2032, "prime" },
+{ 0x2033, "double-prime" },
+{ 0x2039, "single-left-pointing-angle-quotation-mark" },
+{ 0x203a, "single-right-pointing-angle-quotation-mark" },
+{ 0x203c, "double-exclamation-mark" },
+{ 0x203e, "overline" },
+{ 0x2044, "fraction-slash" },
+{ 0x207f, "superscript-latin-small-letter-n" },
+{ 0x20a3, "french-franc-sign" },
+{ 0x20a4, "lira-sign" },
+{ 0x20a7, "peseta-sign" },
+{ 0x2105, "care-of" },
+{ 0x2111, "black-letter-capital-i" },
+{ 0x2113, "script-small-l" },
+{ 0x2116, "numero-sign" },
+{ 0x2118, "script-capital-p" },
+{ 0x211c, "black-letter-capital-r" },
+{ 0x2122, "trade-mark-sign" },
+{ 0x2126, "ohm-sign" },
+{ 0x212e, "estimated-symbol" },
+{ 0x2135, "alef-symbol" },
+{ 0x215b, "vulgar-fraction-one-eighth" },
+{ 0x215c, "vulgar-fraction-three-eighths" },
+{ 0x215d, "vulgar-fraction-five-eighths" },
+{ 0x215e, "vulgar-fraction-seven-eighths" },
+{ 0x2190, "leftwards-arrow" },
+{ 0x2191, "upwards-arrow" },
+{ 0x2192, "rightwards-arrow" },
+{ 0x2193, "downwards-arrow" },
+{ 0x2194, "left-right-arrow" },
+{ 0x2195, "up-down-arrow" },
+{ 0x21a8, "up-down-arrow-with-base" },
+{ 0x21b5, "downwards-arrow-with-corner-leftwards" },
+{ 0x21d0, "leftwards-double-arrow" },
+{ 0x21d1, "upwards-double-arrow" },
+{ 0x21d2, "rightwards-double-arrow" },
+{ 0x21d3, "downwards-double-arrow" },
+{ 0x21d4, "left-right-double-arrow" },
+{ 0x2200, "for-all" },
+{ 0x2202, "partial-differential" },
+{ 0x2203, "there-exists" },
+{ 0x2205, "empty-set" },
+{ 0x2206, "increment" },
+{ 0x2207, "nabla" },
+{ 0x2208, "element-of" },
+{ 0x2209, "not-an-element-of" },
+{ 0x220b, "contains-as-member" },
+{ 0x220f, "n-ary-product" },
+{ 0x2211, "n-ary-summation" },
+{ 0x2212, "minus-sign" },
+{ 0x2215, "division-slash" },
+{ 0x2217, "asterisk-operator" },
+{ 0x2219, "bullet-operator" },
+{ 0x221a, "square-root" },
+{ 0x221d, "proportional-to" },
+{ 0x221e, "infinity" },
+{ 0x221f, "right-angle" },
+{ 0x2220, "angle" },
+{ 0x2227, "logical-and" },
+{ 0x2228, "logical-or" },
+{ 0x2229, "intersection" },
+{ 0x222a, "union" },
+{ 0x222b, "integral" },
+{ 0x2234, "therefore" },
+{ 0x223c, "tilde-operator" },
+{ 0x2245, "approximately-equal-to" },
+{ 0x2248, "almost-equal-to" },
+{ 0x2260, "not-equal-to" },
+{ 0x2261, "identical-to" },
+{ 0x2264, "less-than-or-equal-to" },
+{ 0x2265, "greater-than-or-equal-to" },
+{ 0x2282, "subset-of" },
+{ 0x2283, "superset-of" },
+{ 0x2284, "not-a-subset-of" },
+{ 0x2286, "subset-of-or-equal-to" },
+{ 0x2287, "superset-of-or-equal-to" },
+{ 0x2295, "circled-plus" },
+{ 0x2297, "circled-times" },
+{ 0x22a5, "up-tack" },
+{ 0x22c5, "dot-operator" },
+{ 0x2302, "house" },
+{ 0x2310, "reversed-not-sign" },
+{ 0x2320, "top-half-integral" },
+{ 0x2321, "bottom-half-integral" },
+{ 0x2326, "erase-to-the-right" },
+{ 0x2328, "keyboard" },
+{ 0x2329, "left-pointing-angle-bracket" },
+{ 0x232a, "right-pointing-angle-bracket" },
+{ 0x232b, "erase-to-the-left" },
+{ 0x2460, "circled-digit-one" },
+{ 0x2461, "circled-digit-two" },
+{ 0x2462, "circled-digit-three" },
+{ 0x2463, "circled-digit-four" },
+{ 0x2464, "circled-digit-five" },
+{ 0x2465, "circled-digit-six" },
+{ 0x2466, "circled-digit-seven" },
+{ 0x2467, "circled-digit-eight" },
+{ 0x2468, "circled-digit-nine" },
+{ 0x2469, "circled-number-ten" },
+{ 0x2500, "box-drawings-light-horizontal" },
+{ 0x2502, "box-drawings-light-vertical" },
+{ 0x250c, "box-drawings-light-down-and-right" },
+{ 0x2510, "box-drawings-light-down-and-left" },
+{ 0x2514, "box-drawings-light-up-and-right" },
+{ 0x2518, "box-drawings-light-up-and-left" },
+{ 0x251c, "box-drawings-light-vertical-and-right" },
+{ 0x2524, "box-drawings-light-vertical-and-left" },
+{ 0x252c, "box-drawings-light-down-and-horizontal" },
+{ 0x2534, "box-drawings-light-up-and-horizontal" },
+{ 0x253c, "box-drawings-light-vertical-and-horizontal" },
+{ 0x2550, "box-drawings-double-horizontal" },
+{ 0x2551, "box-drawings-double-vertical" },
+{ 0x2552, "box-drawings-down-single-and-right-double" },
+{ 0x2553, "box-drawings-down-double-and-right-single" },
+{ 0x2554, "box-drawings-double-down-and-right" },
+{ 0x2555, "box-drawings-down-single-and-left-double" },
+{ 0x2556, "box-drawings-down-double-and-left-single" },
+{ 0x2557, "box-drawings-double-down-and-left" },
+{ 0x2558, "box-drawings-up-single-and-right-double" },
+{ 0x2559, "box-drawings-up-double-and-right-single" },
+{ 0x255a, "box-drawings-double-up-and-right" },
+{ 0x255b, "box-drawings-up-single-and-left-double" },
+{ 0x255c, "box-drawings-up-double-and-left-single" },
+{ 0x255d, "box-drawings-double-up-and-left" },
+{ 0x255e, "box-drawings-vertical-single-and-right-double" },
+{ 0x255f, "box-drawings-vertical-double-and-right-single" },
+{ 0x2560, "box-drawings-double-vertical-and-right" },
+{ 0x2561, "box-drawings-vertical-single-and-left-double" },
+{ 0x2562, "box-drawings-vertical-double-and-left-single" },
+{ 0x2563, "box-drawings-double-vertical-and-left" },
+{ 0x2564, "box-drawings-down-single-and-horizontal-double" },
+{ 0x2565, "box-drawings-down-double-and-horizontal-single" },
+{ 0x2566, "box-drawings-double-down-and-horizontal" },
+{ 0x2567, "box-drawings-up-single-and-horizontal-double" },
+{ 0x2568, "box-drawings-up-double-and-horizontal-single" },
+{ 0x2569, "box-drawings-double-up-and-horizontal" },
+{ 0x256a, "box-drawings-vertical-single-and-horizontal-double" },
+{ 0x256b, "box-drawings-vertical-double-and-horizontal-single" },
+{ 0x256c, "box-drawings-double-vertical-and-horizontal" },
+{ 0x2580, "upper-half-block" },
+{ 0x2584, "lower-half-block" },
+{ 0x2588, "full-block" },
+{ 0x258c, "left-half-block" },
+{ 0x2590, "right-half-block" },
+{ 0x2591, "light-shade" },
+{ 0x2592, "medium-shade" },
+{ 0x2593, "dark-shade" },
+{ 0x25a0, "black-square" },
+{ 0x25a1, "white-square" },
+{ 0x25aa, "black-small-square" },
+{ 0x25ab, "white-small-square" },
+{ 0x25ac, "black-rectangle" },
+{ 0x25b2, "black-up-pointing-triangle" },
+{ 0x25ba, "black-right-pointing-pointer" },
+{ 0x25bc, "black-down-pointing-triangle" },
+{ 0x25c4, "black-left-pointing-pointer" },
+{ 0x25c6, "black-diamond" },
+{ 0x25ca, "lozenge" },
+{ 0x25cb, "white-circle" },
+{ 0x25cf, "black-circle" },
+{ 0x25d8, "inverse-bullet" },
+{ 0x25d9, "inverse-white-circle" },
+{ 0x25e6, "white-bullet" },
+{ 0x2605, "black-star" },
+{ 0x260e, "black-telephone" },
+{ 0x2611, "ballot-box-with-check" },
+{ 0x2612, "ballot-box-with-x" },
+{ 0x261b, "black-right-pointing-index" },
+{ 0x261c, "white-left-pointing-index" },
+{ 0x261d, "white-up-pointing-index" },
+{ 0x261e, "white-right-pointing-index" },
+{ 0x261f, "white-down-pointing-index" },
+{ 0x2620, "skull-and-crossbones" },
+{ 0x262a, "star-and-crescent" },
+{ 0x262f, "yin-yang" },
+{ 0x2638, "wheel-of-dharma" },
+{ 0x2639, "white-frowning-face" },
+{ 0x263a, "white-smiling-face" },
+{ 0x263b, "black-smiling-face" },
+{ 0x263c, "white-sun-with-rays" },
+{ 0x2640, "female-sign" },
+{ 0x2642, "male-sign" },
+{ 0x2648, "aries" },
+{ 0x2649, "taurus" },
+{ 0x264a, "gemini" },
+{ 0x264b, "cancer" },
+{ 0x264c, "leo" },
+{ 0x264d, "virgo" },
+{ 0x264e, "libra" },
+{ 0x264f, "scorpius" },
+{ 0x2650, "sagittarius" },
+{ 0x2651, "capricorn" },
+{ 0x2652, "aquarius" },
+{ 0x2653, "pisces" },
+{ 0x2660, "black-spade-suit" },
+{ 0x2663, "black-club-suit" },
+{ 0x2665, "black-heart-suit" },
+{ 0x2666, "black-diamond-suit" },
+{ 0x266a, "eighth-note" },
+{ 0x266b, "beamed-eighth-notes" },
+{ 0x2701, "upper-blade-scissors" },
+{ 0x2702, "black-scissors" },
+{ 0x2703, "lower-blade-scissors" },
+{ 0x2704, "white-scissors" },
+{ 0x2706, "telephone-location-sign" },
+{ 0x2707, "tape-drive" },
+{ 0x2708, "airplane" },
+{ 0x2709, "envelope" },
+{ 0x270c, "victory-hand" },
+{ 0x270d, "writing-hand" },
+{ 0x270e, "lower-right-pencil" },
+{ 0x270f, "pencil" },
+{ 0x2710, "upper-right-pencil" },
+{ 0x2711, "white-nib" },
+{ 0x2712, "black-nib" },
+{ 0x2713, "check-mark" },
+{ 0x2714, "heavy-check-mark" },
+{ 0x2715, "multiplication-x" },
+{ 0x2716, "heavy-multiplication-x" },
+{ 0x2717, "ballot-x" },
+{ 0x2718, "heavy-ballot-x" },
+{ 0x2719, "outlined-greek-cross" },
+{ 0x271a, "heavy-greek-cross" },
+{ 0x271b, "open-centre-cross" },
+{ 0x271c, "heavy-open-centre-cross" },
+{ 0x271d, "latin-cross" },
+{ 0x271e, "shadowed-white-latin-cross" },
+{ 0x271f, "outlined-latin-cross" },
+{ 0x2720, "maltese-cross" },
+{ 0x2721, "star-of-david" },
+{ 0x2722, "four-teardrop-spoked-asterisk" },
+{ 0x2723, "four-balloon-spoked-asterisk" },
+{ 0x2724, "heavy-four-balloon-spoked-asterisk" },
+{ 0x2725, "four-club-spoked-asterisk" },
+{ 0x2726, "black-four-pointed-star" },
+{ 0x2727, "white-four-pointed-star" },
+{ 0x2729, "stress-outlined-white-star" },
+{ 0x272a, "circled-white-star" },
+{ 0x272b, "open-centre-black-star" },
+{ 0x272c, "black-centre-white-star" },
+{ 0x272d, "outlined-black-star" },
+{ 0x272e, "heavy-outlined-black-star" },
+{ 0x272f, "pinwheel-star" },
+{ 0x2730, "shadowed-white-star" },
+{ 0x2731, "heavy-asterisk" },
+{ 0x2732, "open-centre-asterisk" },
+{ 0x2733, "eight-spoked-asterisk" },
+{ 0x2734, "eight-pointed-black-star" },
+{ 0x2735, "eight-pointed-pinwheel-star" },
+{ 0x2736, "six-pointed-black-star" },
+{ 0x2737, "eight-pointed-rectilinear-black-star" },
+{ 0x2738, "heavy-eight-pointed-rectilinear-black-star" },
+{ 0x2739, "twelve-pointed-black-star" },
+{ 0x273a, "sixteen-pointed-asterisk" },
+{ 0x273b, "teardrop-spoked-asterisk" },
+{ 0x273c, "open-centre-teardrop-spoked-asterisk" },
+{ 0x273d, "heavy-teardrop-spoked-asterisk" },
+{ 0x273e, "six-petalled-black-and-white-florette" },
+{ 0x273f, "black-florette" },
+{ 0x2740, "white-florette" },
+{ 0x2741, "eight-petalled-outlined-black-florette" },
+{ 0x2742, "circled-open-centre-eight-pointed-star" },
+{ 0x2743, "heavy-teardrop-spoked-pinwheel-asterisk" },
+{ 0x2744, "snowflake" },
+{ 0x2745, "tight-trifoliate-snowflake" },
+{ 0x2746, "heavy-chevron-snowflake" },
+{ 0x2747, "sparkle" },
+{ 0x2748, "heavy-sparkle" },
+{ 0x2749, "balloon-spoked-asterisk" },
+{ 0x274a, "eight-teardrop-spoked-propeller-asterisk" },
+{ 0x274b, "heavy-eight-teardrop-spoked-propeller-asterisk" },
+{ 0x274d, "shadowed-white-circle" },
+{ 0x274f, "lower-right-drop-shadowed-white-square" },
+{ 0x2750, "upper-right-drop-shadowed-white-square" },
+{ 0x2751, "lower-right-shadowed-white-square" },
+{ 0x2752, "upper-right-shadowed-white-square" },
+{ 0x2756, "black-diamond-minus-white-x" },
+{ 0x2758, "light-vertical-bar" },
+{ 0x2759, "medium-vertical-bar" },
+{ 0x275a, "heavy-vertical-bar" },
+{ 0x275b, "heavy-single-turned-comma-quotation-mark-ornament" },
+{ 0x275c, "heavy-single-comma-quotation-mark-ornament" },
+{ 0x275d, "heavy-double-turned-comma-quotation-mark-ornament" },
+{ 0x275e, "heavy-double-comma-quotation-mark-ornament" },
+{ 0x2761, "curved-stem-paragraph-sign-ornament" },
+{ 0x2762, "heavy-exclamation-mark-ornament" },
+{ 0x2763, "heavy-heart-exclamation-mark-ornament" },
+{ 0x2764, "heavy-black-heart" },
+{ 0x2765, "rotated-heavy-black-heart-bullet" },
+{ 0x2766, "floral-heart" },
+{ 0x2767, "rotated-floral-heart-bullet" },
+{ 0x2776, "dingbat-negative-circled-digit-one" },
+{ 0x2777, "dingbat-negative-circled-digit-two" },
+{ 0x2778, "dingbat-negative-circled-digit-three" },
+{ 0x2779, "dingbat-negative-circled-digit-four" },
+{ 0x277a, "dingbat-negative-circled-digit-five" },
+{ 0x277b, "dingbat-negative-circled-digit-six" },
+{ 0x277c, "dingbat-negative-circled-digit-seven" },
+{ 0x277d, "dingbat-negative-circled-digit-eight" },
+{ 0x277e, "dingbat-negative-circled-digit-nine" },
+{ 0x277f, "dingbat-negative-circled-number-ten" },
+{ 0x2780, "dingbat-circled-sans-serif-digit-one" },
+{ 0x2781, "dingbat-circled-sans-serif-digit-two" },
+{ 0x2782, "dingbat-circled-sans-serif-digit-three" },
+{ 0x2783, "dingbat-circled-sans-serif-digit-four" },
+{ 0x2784, "dingbat-circled-sans-serif-digit-five" },
+{ 0x2785, "dingbat-circled-sans-serif-digit-six" },
+{ 0x2786, "dingbat-circled-sans-serif-digit-seven" },
+{ 0x2787, "dingbat-circled-sans-serif-digit-eight" },
+{ 0x2788, "dingbat-circled-sans-serif-digit-nine" },
+{ 0x2789, "dingbat-circled-sans-serif-number-ten" },
+{ 0x278a, "dingbat-negative-circled-sans-serif-digit-one" },
+{ 0x278b, "dingbat-negative-circled-sans-serif-digit-two" },
+{ 0x278c, "dingbat-negative-circled-sans-serif-digit-three" },
+{ 0x278d, "dingbat-negative-circled-sans-serif-digit-four" },
+{ 0x278e, "dingbat-negative-circled-sans-serif-digit-five" },
+{ 0x278f, "dingbat-negative-circled-sans-serif-digit-six" },
+{ 0x2790, "dingbat-negative-circled-sans-serif-digit-seven" },
+{ 0x2791, "dingbat-negative-circled-sans-serif-digit-eight" },
+{ 0x2792, "dingbat-negative-circled-sans-serif-digit-nine" },
+{ 0x2793, "dingbat-negative-circled-sans-serif-number-ten" },
+{ 0x2794, "heavy-wide-headed-rightwards-arrow" },
+{ 0x2798, "heavy-south-east-arrow" },
+{ 0x2799, "heavy-rightwards-arrow" },
+{ 0x279a, "heavy-north-east-arrow" },
+{ 0x279b, "drafting-point-rightwards-arrow" },
+{ 0x279c, "heavy-round-tipped-rightwards-arrow" },
+{ 0x279d, "triangle-headed-rightwards-arrow" },
+{ 0x279e, "heavy-triangle-headed-rightwards-arrow" },
+{ 0x279f, "dashed-triangle-headed-rightwards-arrow" },
+{ 0x27a0, "heavy-dashed-triangle-headed-rightwards-arrow" },
+{ 0x27a1, "black-rightwards-arrow" },
+{ 0x27a2, "three-d-top-lighted-rightwards-arrowhead" },
+{ 0x27a3, "three-d-bottom-lighted-rightwards-arrowhead" },
+{ 0x27a4, "black-rightwards-arrowhead" },
+{ 0x27a5, "heavy-black-curved-downwards-and-rightwards-arrow" },
+{ 0x27a6, "heavy-black-curved-upwards-and-rightwards-arrow" },
+{ 0x27a7, "squat-black-rightwards-arrow" },
+{ 0x27a8, "heavy-concave-pointed-black-rightwards-arrow" },
+{ 0x27a9, "right-shaded-white-rightwards-arrow" },
+{ 0x27aa, "left-shaded-white-rightwards-arrow" },
+{ 0x27ab, "back-tilted-shadowed-white-rightwards-arrow" },
+{ 0x27ac, "front-tilted-shadowed-white-rightwards-arrow" },
+{ 0x27ad, "heavy-lower-right-shadowed-white-rightwards-arrow" },
+{ 0x27ae, "heavy-upper-right-shadowed-white-rightwards-arrow" },
+{ 0x27af, "notched-lower-right-shadowed-white-rightwards-arrow" },
+{ 0x27b1, "notched-upper-right-shadowed-white-rightwards-arrow" },
+{ 0x27b2, "circled-heavy-white-rightwards-arrow" },
+{ 0x27b3, "white-feathered-rightwards-arrow" },
+{ 0x27b4, "black-feathered-south-east-arrow" },
+{ 0x27b5, "black-feathered-rightwards-arrow" },
+{ 0x27b6, "black-feathered-north-east-arrow" },
+{ 0x27b7, "heavy-black-feathered-south-east-arrow" },
+{ 0x27b8, "heavy-black-feathered-rightwards-arrow" },
+{ 0x27b9, "heavy-black-feathered-north-east-arrow" },
+{ 0x27ba, "teardrop-barbed-rightwards-arrow" },
+{ 0x27bb, "heavy-teardrop-shanked-rightwards-arrow" },
+{ 0x27bc, "wedge-tailed-rightwards-arrow" },
+{ 0x27bd, "heavy-wedge-tailed-rightwards-arrow" },
+{ 0x27be, "open-outlined-rightwards-arrow" },
+{ 0xfb01, "latin-small-ligature-fi" },
+{ 0xfb02, "latin-small-ligature-fl" },
diff --git a/style/charProps.h b/style/charProps.h
new file mode 100644 (file)
index 0000000..a63a327
--- /dev/null
@@ -0,0 +1,607 @@
+#ifdef SPACE
+{ 0x0020,  1 },
+{ 0x00a0,  1 }, 
+{ 0x2000, 12 }, 
+{ 0x3000,  1 }, 
+#endif
+#ifdef RECORD_END
+{ 0x000D,  1 }, 
+#endif 
+#ifdef BLANK
+{ 0x0000, 32 },
+{ 0x007f, 33 },
+{ 0x200e,  2 },
+{ 0x202a,  5 },
+{ 0x200c,  2 },
+{ 0x206a,  6 },
+#endif
+#ifdef INPUT_TAB
+{ 0x0009,  1 },
+#endif
+#ifdef INPUT_WHITESPACE
+{ 0x0009,  5 },
+{ 0x0020,  1 },
+{ 0x00a0,  1 },
+{ 0x2000, 12 },
+{ 0x2028,  2 },
+{ 0x3000,  1 },
+#endif
+#ifdef PUNCT
+{ 0x0021,  1 },
+{ 0x002c,  1 },
+{ 0x002e,  1 },
+{ 0x003a,  2 },
+{ 0x003f,  1 },
+{ 0x037e,  1 },
+{ 0x0387,  1 },
+{ 0x0589,  1 },
+{ 0x060c,  1 },
+{ 0x061b,  1 },
+{ 0x061f,  1 },
+{ 0x06d4,  1 },
+{ 0x0964,  2 },
+{ 0x0e5a,  2 },
+{ 0x203c,  2 },
+{ 0x3001,  2 },
+{ 0xfe50,  3 },
+{ 0xfe54,  4 },
+{ 0xff01,  1 },
+{ 0xff0c,  1 },
+{ 0xff0e,  1 },
+{ 0xff1a,  2 },
+{ 0xff1f,  1 },
+{ 0xff61,  1 },
+{ 0xff64,  1 },
+#endif
+#ifdef SCRIPT
+{ 0x0000, 0x007f, "Latin" },
+{ 0x0080, 0x00ff, "Latin" },
+{ 0x0100, 0x017f, "Latin" },
+{ 0x0180, 0x024f, "Latin" },
+{ 0x0370, 0x03ff, "Greek" },
+{ 0x0400, 0x04ff, "Cyrillic" },
+{ 0x0530, 0x058f, "Armenian" },
+{ 0x0590, 0x05ff, "Hebrew" },
+{ 0x0600, 0x06ff, "Arabic" },
+{ 0x0900, 0x097f, "Devanagari" },
+{ 0x0980, 0x09ff, "Bengali" },
+{ 0x0a00, 0x0a7f, "Gurmukhi" },
+{ 0x0a80, 0x0aff, "Gujarati" },
+{ 0x0b00, 0x0b7f, "Oriya" },
+{ 0x0b80, 0x0bff, "Tamil" },
+{ 0x0c00, 0x0c7f, "Telugu" },
+{ 0x0c80, 0x0cff, "Kannada" },
+{ 0x0d00, 0x0d7f, "Malayalam" },
+{ 0x0d80, 0x0dff, "Sinhala" },
+{ 0x0e00, 0x0e7f, "Thai" },
+{ 0x0e80, 0x0eff, "Lao" },
+{ 0x0f00, 0x0fbf, "Tibetan" },
+{ 0x10a0, 0x10ff, "Georgian" },
+{ 0x1100, 0x11ff, "Hangul" },
+{ 0x1200, 0x137f, "Ethiopian" },
+{ 0x1780, 0x17ff, "Khmer" },
+{ 0x1800, 0x18af, "Mongolian" },
+{ 0x1e00, 0x1eff, "Latin" },
+{ 0x1f00, 0x1fff, "Greek" },
+{ 0x2000, 0x206f, "Punctuation" },
+{ 0x20a0, 0x20cf, "Symbol" },
+{ 0x2100, 0x214f, "Symbol" },
+{ 0x2600, 0x26ff, "Symbol" },
+{ 0x3040, 0x309f, "Hiragana" },
+{ 0x30a0, 0x30ff, "Katakana" },
+{ 0x3100, 0x312f, "Bopomofo" },
+{ 0x3130, 0x318f, "Hangul" },
+{ 0xac00, 0xd7a3, "Hangul" },
+#endif
+#ifdef BREAK_PRIORITIES
+  // These are automatically generated by ../unicode/genbreakprios.pl.
+{ 0x0009, 2, 2, 3 },
+{ 0x000d, 1, 2, 3 },
+{ 0x0020, 1, 2, 3 },
+{ 0x0021, 4, 1, 1 },
+{ 0x0025, 1, 3, 1 },
+{ 0x0026, 2, 1, 1 },
+{ 0x0028, 1, 1, 3 },
+{ 0x0029, 1, 3, 1 },
+{ 0x002a, 3, 1, 1 },
+{ 0x002d, 1, 3, 2 },
+{ 0x002e, 1, 1, 1 },
+{ 0x002f, 1, 1, 2 },
+{ 0x0030, 43, 1, 1 },
+{ 0x005b, 1, 1, 3 },
+{ 0x005c, 1, 1, 1 },
+{ 0x005d, 1, 3, 1 },
+{ 0x005e, 29, 1, 1 },
+{ 0x007b, 1, 1, 3 },
+{ 0x007c, 1, 1, 2 },
+{ 0x007d, 1, 3, 1 },
+{ 0x007e, 1, 1, 1 },
+{ 0x00a0, 2, 1, 1 },
+{ 0x00a2, 1, 3, 1 },
+{ 0x00a3, 10, 1, 1 },
+{ 0x00ad, 1, 1, 2 },
+{ 0x00ae, 2, 1, 1 },
+{ 0x00b0, 1, 3, 1 },
+{ 0x00b1, 3, 1, 1 },
+{ 0x00b4, 1, 1, 2 },
+{ 0x00b5, 363, 1, 1 },
+{ 0x0222, 18, 1, 1 },
+{ 0x0250, 94, 1, 1 },
+{ 0x02b0, 24, 1, 1 },
+{ 0x02c8, 1, 2, 3 },
+{ 0x02c9, 3, 1, 1 },
+{ 0x02cc, 1, 2, 3 },
+{ 0x02cd, 34, 1, 1 },
+{ 0x0300, 79, 1, 1 },
+{ 0x0360, 3, 1, 1 },
+{ 0x0374, 2, 1, 1 },
+{ 0x037a, 1, 1, 1 },
+{ 0x037e, 1, 1, 1 },
+{ 0x0384, 7, 1, 1 },
+{ 0x038c, 1, 1, 1 },
+{ 0x038e, 20, 1, 1 },
+{ 0x03a3, 44, 1, 1 },
+{ 0x03d0, 8, 1, 1 },
+{ 0x03da, 26, 1, 1 },
+{ 0x0400, 135, 1, 1 },
+{ 0x0488, 2, 1, 1 },
+{ 0x048e, 55, 1, 1 },
+{ 0x04c7, 2, 1, 1 },
+{ 0x04cb, 2, 1, 1 },
+{ 0x04d0, 38, 1, 1 },
+{ 0x04f8, 2, 1, 1 },
+{ 0x0531, 38, 1, 1 },
+{ 0x0559, 7, 1, 1 },
+{ 0x0561, 39, 1, 1 },
+{ 0x0589, 1, 1, 1 },
+{ 0x058a, 1, 1, 2 },
+{ 0x0591, 17, 1, 1 },
+{ 0x05a3, 23, 1, 1 },
+{ 0x05bb, 10, 1, 1 },
+{ 0x05d0, 27, 1, 1 },
+{ 0x05f0, 5, 1, 1 },
+{ 0x060c, 1, 1, 1 },
+{ 0x061b, 1, 1, 1 },
+{ 0x061f, 1, 1, 1 },
+{ 0x0621, 26, 1, 1 },
+{ 0x0640, 22, 1, 1 },
+{ 0x0660, 14, 1, 1 },
+{ 0x0670, 126, 1, 1 },
+{ 0x06f0, 15, 1, 1 },
+{ 0x0700, 14, 1, 1 },
+{ 0x070f, 30, 1, 1 },
+{ 0x0730, 27, 1, 1 },
+{ 0x0780, 49, 1, 1 },
+{ 0x0901, 3, 1, 1 },
+{ 0x0905, 53, 1, 1 },
+{ 0x093c, 18, 1, 1 },
+{ 0x0950, 5, 1, 1 },
+{ 0x0958, 25, 1, 1 },
+{ 0x0981, 3, 1, 1 },
+{ 0x0985, 8, 1, 1 },
+{ 0x098f, 2, 1, 1 },
+{ 0x0993, 22, 1, 1 },
+{ 0x09aa, 7, 1, 1 },
+{ 0x09b2, 1, 1, 1 },
+{ 0x09b6, 4, 1, 1 },
+{ 0x09bc, 1, 1, 1 },
+{ 0x09be, 7, 1, 1 },
+{ 0x09c7, 2, 1, 1 },
+{ 0x09cb, 3, 1, 1 },
+{ 0x09d7, 1, 1, 1 },
+{ 0x09dc, 2, 1, 1 },
+{ 0x09df, 5, 1, 1 },
+{ 0x09e6, 21, 1, 1 },
+{ 0x0a02, 1, 1, 1 },
+{ 0x0a05, 6, 1, 1 },
+{ 0x0a0f, 2, 1, 1 },
+{ 0x0a13, 22, 1, 1 },
+{ 0x0a2a, 7, 1, 1 },
+{ 0x0a32, 2, 1, 1 },
+{ 0x0a35, 2, 1, 1 },
+{ 0x0a38, 2, 1, 1 },
+{ 0x0a3c, 1, 1, 1 },
+{ 0x0a3e, 5, 1, 1 },
+{ 0x0a47, 2, 1, 1 },
+{ 0x0a4b, 3, 1, 1 },
+{ 0x0a59, 4, 1, 1 },
+{ 0x0a5e, 1, 1, 1 },
+{ 0x0a66, 15, 1, 1 },
+{ 0x0a81, 3, 1, 1 },
+{ 0x0a85, 7, 1, 1 },
+{ 0x0a8d, 1, 1, 1 },
+{ 0x0a8f, 3, 1, 1 },
+{ 0x0a93, 22, 1, 1 },
+{ 0x0aaa, 7, 1, 1 },
+{ 0x0ab2, 2, 1, 1 },
+{ 0x0ab5, 5, 1, 1 },
+{ 0x0abc, 10, 1, 1 },
+{ 0x0ac7, 3, 1, 1 },
+{ 0x0acb, 3, 1, 1 },
+{ 0x0ad0, 1, 1, 1 },
+{ 0x0ae0, 1, 1, 1 },
+{ 0x0ae6, 10, 1, 1 },
+{ 0x0b01, 3, 1, 1 },
+{ 0x0b05, 8, 1, 1 },
+{ 0x0b0f, 2, 1, 1 },
+{ 0x0b13, 22, 1, 1 },
+{ 0x0b2a, 7, 1, 1 },
+{ 0x0b32, 2, 1, 1 },
+{ 0x0b36, 4, 1, 1 },
+{ 0x0b3c, 8, 1, 1 },
+{ 0x0b47, 2, 1, 1 },
+{ 0x0b4b, 3, 1, 1 },
+{ 0x0b56, 2, 1, 1 },
+{ 0x0b5c, 2, 1, 1 },
+{ 0x0b5f, 3, 1, 1 },
+{ 0x0b66, 11, 1, 1 },
+{ 0x0b82, 2, 1, 1 },
+{ 0x0b85, 6, 1, 1 },
+{ 0x0b8e, 3, 1, 1 },
+{ 0x0b92, 4, 1, 1 },
+{ 0x0b99, 2, 1, 1 },
+{ 0x0b9c, 1, 1, 1 },
+{ 0x0b9e, 2, 1, 1 },
+{ 0x0ba3, 2, 1, 1 },
+{ 0x0ba8, 3, 1, 1 },
+{ 0x0bae, 8, 1, 1 },
+{ 0x0bb7, 3, 1, 1 },
+{ 0x0bbe, 5, 1, 1 },
+{ 0x0bc6, 3, 1, 1 },
+{ 0x0bca, 4, 1, 1 },
+{ 0x0bd7, 1, 1, 1 },
+{ 0x0be7, 12, 1, 1 },
+{ 0x0c01, 3, 1, 1 },
+{ 0x0c05, 8, 1, 1 },
+{ 0x0c0e, 3, 1, 1 },
+{ 0x0c12, 23, 1, 1 },
+{ 0x0c2a, 10, 1, 1 },
+{ 0x0c35, 5, 1, 1 },
+{ 0x0c3e, 7, 1, 1 },
+{ 0x0c46, 3, 1, 1 },
+{ 0x0c4a, 4, 1, 1 },
+{ 0x0c55, 2, 1, 1 },
+{ 0x0c60, 2, 1, 1 },
+{ 0x0c66, 10, 1, 1 },
+{ 0x0c82, 2, 1, 1 },
+{ 0x0c85, 8, 1, 1 },
+{ 0x0c8e, 3, 1, 1 },
+{ 0x0c92, 23, 1, 1 },
+{ 0x0caa, 10, 1, 1 },
+{ 0x0cb5, 5, 1, 1 },
+{ 0x0cbe, 7, 1, 1 },
+{ 0x0cc6, 3, 1, 1 },
+{ 0x0cca, 4, 1, 1 },
+{ 0x0cd5, 2, 1, 1 },
+{ 0x0cde, 1, 1, 1 },
+{ 0x0ce0, 2, 1, 1 },
+{ 0x0ce6, 10, 1, 1 },
+{ 0x0d02, 2, 1, 1 },
+{ 0x0d05, 8, 1, 1 },
+{ 0x0d0e, 3, 1, 1 },
+{ 0x0d12, 23, 1, 1 },
+{ 0x0d2a, 16, 1, 1 },
+{ 0x0d3e, 6, 1, 1 },
+{ 0x0d46, 3, 1, 1 },
+{ 0x0d4a, 4, 1, 1 },
+{ 0x0d57, 1, 1, 1 },
+{ 0x0d60, 2, 1, 1 },
+{ 0x0d66, 10, 1, 1 },
+{ 0x0d82, 2, 1, 1 },
+{ 0x0d85, 18, 1, 1 },
+{ 0x0d9a, 24, 1, 1 },
+{ 0x0db3, 9, 1, 1 },
+{ 0x0dbd, 1, 1, 1 },
+{ 0x0dc0, 7, 1, 1 },
+{ 0x0dca, 1, 1, 1 },
+{ 0x0dcf, 6, 1, 1 },
+{ 0x0dd6, 1, 1, 1 },
+{ 0x0dd8, 8, 1, 1 },
+{ 0x0df2, 3, 1, 1 },
+{ 0x0e01, 58, 1, 1 },
+{ 0x0e3f, 27, 1, 1 },
+{ 0x0e5a, 2, 5, 1 },
+{ 0x0e81, 2, 1, 1 },
+{ 0x0e84, 1, 1, 1 },
+{ 0x0e87, 2, 1, 1 },
+{ 0x0e8a, 1, 1, 1 },
+{ 0x0e8d, 1, 1, 1 },
+{ 0x0e94, 4, 1, 1 },
+{ 0x0e99, 7, 1, 1 },
+{ 0x0ea1, 3, 1, 1 },
+{ 0x0ea5, 1, 1, 1 },
+{ 0x0ea7, 1, 1, 1 },
+{ 0x0eaa, 2, 1, 1 },
+{ 0x0ead, 13, 1, 1 },
+{ 0x0ebb, 3, 1, 1 },
+{ 0x0ec0, 5, 1, 1 },
+{ 0x0ec6, 1, 1, 1 },
+{ 0x0ec8, 6, 1, 1 },
+{ 0x0ed0, 10, 1, 1 },
+{ 0x0edc, 2, 1, 1 },
+{ 0x0f00, 11, 1, 1 },
+{ 0x0f0b, 1, 1, 2 },
+{ 0x0f0c, 46, 1, 1 },
+{ 0x0f3a, 1, 1, 3 },
+{ 0x0f3b, 1, 3, 1 },
+{ 0x0f3c, 1, 1, 3 },
+{ 0x0f3d, 1, 3, 1 },
+{ 0x0f3e, 10, 1, 1 },
+{ 0x0f49, 34, 1, 1 },
+{ 0x0f71, 27, 1, 1 },
+{ 0x0f90, 8, 1, 1 },
+{ 0x0f99, 36, 1, 1 },
+{ 0x0fbe, 15, 1, 1 },
+{ 0x0fcf, 1, 1, 1 },
+{ 0x1000, 34, 1, 1 },
+{ 0x1023, 5, 1, 1 },
+{ 0x1029, 2, 1, 1 },
+{ 0x102c, 7, 1, 1 },
+{ 0x1036, 4, 1, 1 },
+{ 0x1040, 26, 1, 1 },
+{ 0x10a0, 38, 1, 1 },
+{ 0x10d0, 39, 1, 1 },
+{ 0x10fb, 1, 1, 1 },
+{ 0x1160, 67, 1, 1 },
+{ 0x11a8, 82, 1, 1 },
+{ 0x1200, 7, 1, 1 },
+{ 0x1208, 63, 1, 1 },
+{ 0x1248, 1, 1, 1 },
+{ 0x124a, 4, 1, 1 },
+{ 0x1250, 7, 1, 1 },
+{ 0x1258, 1, 1, 1 },
+{ 0x125a, 4, 1, 1 },
+{ 0x1260, 39, 1, 1 },
+{ 0x1288, 1, 1, 1 },
+{ 0x128a, 4, 1, 1 },
+{ 0x1290, 31, 1, 1 },
+{ 0x12b0, 1, 1, 1 },
+{ 0x12b2, 4, 1, 1 },
+{ 0x12b8, 7, 1, 1 },
+{ 0x12c0, 1, 1, 1 },
+{ 0x12c2, 4, 1, 1 },
+{ 0x12c8, 7, 1, 1 },
+{ 0x12d0, 7, 1, 1 },
+{ 0x12d8, 23, 1, 1 },
+{ 0x12f0, 31, 1, 1 },
+{ 0x1310, 1, 1, 1 },
+{ 0x1312, 4, 1, 1 },
+{ 0x1318, 7, 1, 1 },
+{ 0x1320, 39, 1, 1 },
+{ 0x1348, 19, 1, 1 },
+{ 0x1361, 1, 1, 2 },
+{ 0x1362, 27, 1, 1 },
+{ 0x13a0, 85, 1, 1 },
+{ 0x1401, 630, 1, 1 },
+{ 0x1680, 1, 1, 2 },
+{ 0x1681, 28, 1, 1 },
+{ 0x16a0, 81, 1, 1 },
+{ 0x1780, 84, 1, 1 },
+{ 0x17d4, 1, 5, 1 },
+{ 0x17d5, 1, 1, 2 },
+{ 0x17d6, 5, 5, 1 },
+{ 0x17db, 2, 1, 1 },
+{ 0x17e0, 10, 1, 1 },
+{ 0x1800, 6, 1, 1 },
+{ 0x1806, 1, 2, 3 },
+{ 0x1807, 8, 1, 1 },
+{ 0x1810, 10, 1, 1 },
+{ 0x1820, 88, 1, 1 },
+{ 0x1880, 42, 1, 1 },
+{ 0x1e00, 156, 1, 1 },
+{ 0x1ea0, 90, 1, 1 },
+{ 0x1f00, 22, 1, 1 },
+{ 0x1f18, 6, 1, 1 },
+{ 0x1f20, 38, 1, 1 },
+{ 0x1f48, 6, 1, 1 },
+{ 0x1f50, 8, 1, 1 },
+{ 0x1f59, 1, 1, 1 },
+{ 0x1f5b, 1, 1, 1 },
+{ 0x1f5d, 1, 1, 1 },
+{ 0x1f5f, 31, 1, 1 },
+{ 0x1f80, 53, 1, 1 },
+{ 0x1fb6, 15, 1, 1 },
+{ 0x1fc6, 14, 1, 1 },
+{ 0x1fd6, 6, 1, 1 },
+{ 0x1fdd, 19, 1, 1 },
+{ 0x1ff2, 3, 1, 1 },
+{ 0x1ff6, 9, 1, 1 },
+{ 0x2000, 7, 1, 2 },
+{ 0x2007, 1, 1, 1 },
+{ 0x2008, 4, 1, 2 },
+{ 0x200c, 4, 1, 1 },
+{ 0x2010, 1, 1, 2 },
+{ 0x2011, 1, 1, 1 },
+{ 0x2012, 2, 1, 2 },
+{ 0x2014, 1, 3, 2 },
+{ 0x2015, 5, 1, 1 },
+{ 0x201a, 1, 1, 3 },
+{ 0x201b, 3, 1, 1 },
+{ 0x201e, 1, 1, 3 },
+{ 0x201f, 8, 1, 1 },
+{ 0x2027, 1, 1, 2 },
+{ 0x202a, 6, 1, 1 },
+{ 0x2030, 8, 3, 1 },
+{ 0x2038, 4, 1, 1 },
+{ 0x203c, 1, 5, 1 },
+{ 0x203d, 7, 1, 1 },
+{ 0x2044, 1, 5, 1 },
+{ 0x2045, 1, 1, 3 },
+{ 0x2046, 1, 3, 1 },
+{ 0x2048, 6, 1, 1 },
+{ 0x206a, 7, 1, 1 },
+{ 0x2074, 9, 1, 1 },
+{ 0x207d, 1, 1, 3 },
+{ 0x207e, 1, 3, 1 },
+{ 0x207f, 14, 1, 1 },
+{ 0x208d, 1, 1, 3 },
+{ 0x208e, 1, 3, 1 },
+{ 0x20a0, 7, 1, 1 },
+{ 0x20a7, 1, 3, 1 },
+{ 0x20a8, 7, 1, 1 },
+{ 0x20d0, 20, 1, 1 },
+{ 0x2100, 3, 1, 1 },
+{ 0x2103, 1, 3, 1 },
+{ 0x2104, 5, 1, 1 },
+{ 0x2109, 1, 3, 1 },
+{ 0x210a, 28, 1, 1 },
+{ 0x2126, 1, 3, 1 },
+{ 0x2127, 20, 1, 1 },
+{ 0x2153, 49, 1, 1 },
+{ 0x2190, 100, 1, 1 },
+{ 0x2200, 242, 1, 1 },
+{ 0x2300, 41, 1, 1 },
+{ 0x2329, 1, 1, 3 },
+{ 0x232a, 1, 3, 1 },
+{ 0x232b, 81, 1, 1 },
+{ 0x237d, 30, 1, 1 },
+{ 0x2400, 39, 1, 1 },
+{ 0x2440, 11, 1, 1 },
+{ 0x2460, 139, 1, 1 },
+{ 0x2500, 150, 1, 1 },
+{ 0x25a0, 88, 1, 1 },
+{ 0x2600, 20, 1, 1 },
+{ 0x2619, 89, 1, 1 },
+{ 0x2701, 4, 1, 1 },
+{ 0x2706, 4, 1, 1 },
+{ 0x270c, 28, 1, 1 },
+{ 0x2729, 35, 1, 1 },
+{ 0x274d, 1, 1, 1 },
+{ 0x274f, 4, 1, 1 },
+{ 0x2756, 1, 1, 1 },
+{ 0x2758, 7, 1, 1 },
+{ 0x2761, 7, 1, 1 },
+{ 0x2776, 31, 1, 1 },
+{ 0x2798, 24, 1, 1 },
+{ 0x27b1, 14, 1, 1 },
+{ 0x2800, 256, 1, 1 },
+{ 0x3001, 2, 3, 1 },
+{ 0x3005, 1, 5, 1 },
+{ 0x3008, 1, 1, 3 },
+{ 0x3009, 1, 3, 1 },
+{ 0x300a, 1, 1, 3 },
+{ 0x300b, 1, 3, 1 },
+{ 0x300c, 1, 1, 3 },
+{ 0x300d, 1, 3, 1 },
+{ 0x300e, 1, 1, 3 },
+{ 0x300f, 1, 3, 1 },
+{ 0x3010, 1, 1, 3 },
+{ 0x3011, 1, 3, 1 },
+{ 0x3014, 1, 1, 3 },
+{ 0x3015, 1, 3, 1 },
+{ 0x3016, 1, 1, 3 },
+{ 0x3017, 1, 3, 1 },
+{ 0x3018, 1, 1, 3 },
+{ 0x3019, 1, 3, 1 },
+{ 0x301a, 1, 1, 3 },
+{ 0x301b, 1, 3, 1 },
+{ 0x301c, 1, 5, 1 },
+{ 0x301d, 1, 1, 3 },
+{ 0x301e, 2, 3, 1 },
+{ 0x3041, 1, 5, 1 },
+{ 0x3043, 1, 5, 1 },
+{ 0x3045, 1, 5, 1 },
+{ 0x3047, 1, 5, 1 },
+{ 0x3049, 1, 5, 1 },
+{ 0x3063, 1, 5, 1 },
+{ 0x3083, 1, 5, 1 },
+{ 0x3085, 1, 5, 1 },
+{ 0x3087, 1, 5, 1 },
+{ 0x308e, 1, 5, 1 },
+{ 0x309b, 4, 5, 1 },
+{ 0x30a1, 1, 5, 1 },
+{ 0x30a3, 1, 5, 1 },
+{ 0x30a5, 1, 5, 1 },
+{ 0x30a7, 1, 5, 1 },
+{ 0x30a9, 1, 5, 1 },
+{ 0x30c3, 1, 5, 1 },
+{ 0x30e3, 1, 5, 1 },
+{ 0x30e5, 1, 5, 1 },
+{ 0x30e7, 1, 5, 1 },
+{ 0x30ee, 1, 5, 1 },
+{ 0x30f5, 2, 5, 1 },
+{ 0x30fb, 1, 5, 1 },
+{ 0x30fd, 1, 5, 1 },
+{ 0xe000, 1, 1, 1 },
+{ 0xf8ff, 1, 1, 1 },
+{ 0xfb00, 7, 1, 1 },
+{ 0xfb13, 5, 1, 1 },
+{ 0xfb1d, 26, 1, 1 },
+{ 0xfb38, 5, 1, 1 },
+{ 0xfb3e, 1, 1, 1 },
+{ 0xfb40, 2, 1, 1 },
+{ 0xfb43, 2, 1, 1 },
+{ 0xfb46, 108, 1, 1 },
+{ 0xfbd3, 363, 1, 1 },
+{ 0xfd3e, 1, 1, 3 },
+{ 0xfd3f, 1, 3, 1 },
+{ 0xfd50, 64, 1, 1 },
+{ 0xfd92, 54, 1, 1 },
+{ 0xfdf0, 12, 1, 1 },
+{ 0xfe20, 4, 1, 1 },
+{ 0xfe35, 1, 1, 3 },
+{ 0xfe36, 1, 3, 1 },
+{ 0xfe37, 1, 1, 3 },
+{ 0xfe38, 1, 3, 1 },
+{ 0xfe39, 1, 1, 3 },
+{ 0xfe3a, 1, 3, 1 },
+{ 0xfe3b, 1, 1, 3 },
+{ 0xfe3c, 1, 3, 1 },
+{ 0xfe3d, 1, 1, 3 },
+{ 0xfe3e, 1, 3, 1 },
+{ 0xfe3f, 1, 1, 3 },
+{ 0xfe40, 1, 3, 1 },
+{ 0xfe41, 1, 1, 3 },
+{ 0xfe42, 1, 3, 1 },
+{ 0xfe43, 1, 1, 3 },
+{ 0xfe44, 1, 3, 1 },
+{ 0xfe50, 1, 3, 1 },
+{ 0xfe52, 1, 3, 1 },
+{ 0xfe54, 2, 5, 1 },
+{ 0xfe56, 2, 1, 1 },
+{ 0xfe59, 1, 1, 3 },
+{ 0xfe5a, 1, 3, 1 },
+{ 0xfe5b, 1, 1, 3 },
+{ 0xfe5c, 1, 3, 1 },
+{ 0xfe5d, 1, 1, 3 },
+{ 0xfe5e, 1, 3, 1 },
+{ 0xfe69, 1, 1, 1 },
+{ 0xfe6a, 1, 3, 1 },
+{ 0xfe6b, 1, 1, 1 },
+{ 0xfe70, 3, 1, 1 },
+{ 0xfe74, 1, 1, 1 },
+{ 0xfe76, 135, 1, 1 },
+{ 0xfeff, 1, 1, 1 },
+{ 0xff01, 1, 1, 1 },
+{ 0xff04, 1, 1, 1 },
+{ 0xff05, 1, 3, 1 },
+{ 0xff08, 1, 1, 3 },
+{ 0xff09, 1, 3, 1 },
+{ 0xff0c, 1, 3, 1 },
+{ 0xff0e, 1, 3, 1 },
+{ 0xff1a, 2, 5, 1 },
+{ 0xff1f, 1, 1, 1 },
+{ 0xff3b, 1, 1, 3 },
+{ 0xff3d, 1, 3, 1 },
+{ 0xff5b, 1, 1, 3 },
+{ 0xff5d, 1, 3, 1 },
+{ 0xff61, 1, 3, 1 },
+{ 0xff62, 1, 1, 3 },
+{ 0xff63, 2, 3, 1 },
+{ 0xff65, 1, 5, 1 },
+{ 0xff66, 1, 1, 1 },
+{ 0xff67, 10, 5, 1 },
+{ 0xff71, 45, 1, 1 },
+{ 0xff9e, 2, 5, 1 },
+{ 0xffa0, 31, 1, 1 },
+{ 0xffc2, 6, 1, 1 },
+{ 0xffca, 6, 1, 1 },
+{ 0xffd2, 6, 1, 1 },
+{ 0xffda, 3, 1, 1 },
+{ 0xffe0, 1, 3, 1 },
+{ 0xffe1, 1, 1, 1 },
+{ 0xffe5, 2, 1, 1 },
+{ 0xffe8, 7, 1, 1 },
+{ 0xfff9, 3, 1, 1 },
+{ 0xfffc, 1, 2, 1 },
+#endif
diff --git a/style/common_inst.m4 b/style/common_inst.m4
new file mode 100644 (file)
index 0000000..00d37bc
--- /dev/null
@@ -0,0 +1,86 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+// Copyright (c) 1996 James Clark
+// See the file COPYING for copying permission.
+
+#include "stylelib.h"
+
+#ifdef SP_MANUAL_INST
+
+#define SP_DEFINE_TEMPLATES
+#include "StringOf.h"
+#include "Vector.h"
+#include "XcharMap.h"
+#include "CharMap.h"
+#include "Ptr.h"
+#include "PointerTable.h"
+#include "OwnerTable.h"
+#include "HashTable.h"
+#include "HashTableItemBase.h"
+#include "SubstTable.h"
+#include "ISet.h"
+#include "Owner.h"
+#undef SP_DEFINE_TEMPLATES
+
+#include "types.h"
+#include "Entity.h"
+#include "Syntax.h"
+#include "ExtendEntityManager.h"
+#include "Event.h"
+#include "CmdLineApp.h"
+
+#ifdef SP_NAMESPACE
+namespace SP_NAMESPACE {
+#endif
+
+__instantiate(Vector<const CmdLineApp::AppChar *>)
+__instantiate(Ptr<CodingSystemKit>)
+__instantiate(Ptr<Sd>)
+__instantiate(Ptr<InputSourceOrigin>)
+__instantiate(Vector<ParsedSystemId::Map>)
+__instantiate(Vector<size_t>)
+__instantiate(String<Char>)
+__instantiate(Vector<String<Char> >)
+__instantiate(Ptr<StringResource<Char> >)
+__instantiate(String<char>)
+__instantiate(`OwnerTable<Named,StringC,Hash,NamedTableKeyFunction>')
+__instantiate(`OwnerTableIter<Named,StringC,Hash,NamedTableKeyFunction>')
+__instantiate(XcharMap<PackedBoolean>)
+__instantiate(SharedXcharMap<PackedBoolean>)
+__instantiate(Ptr<SharedXcharMap<PackedBoolean> >)
+__instantiate(ConstPtr<SharedXcharMap<PackedBoolean> >)
+__instantiate(`PointerTableIter<Named*,StringC,Hash,NamedTableKeyFunction>')
+__instantiate(`PointerTable<Named*,StringC,Hash,NamedTableKeyFunction>')
+__instantiate(HashTableItemBase<String<Char> >)
+__instantiate(`OwnerTable<HashTableItemBase<String<Char> >,String<Char>,Hash,HashTableKeyFunction<String<Char> > >')
+__instantiate(`CopyOwnerTable<HashTableItemBase<String<Char> >,String<Char>,Hash,HashTableKeyFunction<String<Char> > >')
+__instantiate(`OwnerTableIter<HashTableItemBase<String<Char> >, String<Char>, Hash, HashTableKeyFunction<String<Char> > >')
+__instantiate(`PointerTable<HashTableItemBase<String<Char> >*,String<Char>,Hash,HashTableKeyFunction<String<Char> > >')
+__instantiate(`PointerTableIter<HashTableItemBase<String<Char> > *, String<Char>, Hash, HashTableKeyFunction<String<Char> > >')
+__instantiate(Vector<HashTableItemBase<String<Char> >*>)
+__instantiate(Ptr<Origin>)
+__instantiate(`HashTable<StringC,Char>')
+__instantiate(ConstPtr<Entity>)
+__instantiate(Ptr<Entity>)
+__instantiate(SubstTable<Char>)
+__instantiate(Ptr<Syntax>)
+__instantiate(ConstPtr<Syntax>)
+__instantiate(ISet<Char>)
+__instantiate(Vector<TextItem>)
+__instantiate(`HashTableItem<StringC, int>')
+__instantiate(`HashTable<StringC,int>')
+__instantiate(Vector<PackedBoolean>)
+__instantiate(Owner<EventHandler>)
+__instantiate(Ptr<EntityManager>)
+__instantiate(Ptr<ExtendEntityManager>)
+__instantiate(Vector<StorageObjectSpec>)
+__instantiate(Ptr<EntityCatalog>)
+__instantiate(ConstPtr<EntityCatalog>)
+__instantiate(CharMap<Char>)
+__instantiate(CharMapPage<Char>)
+#ifdef SP_NAMESPACE
+}
+#endif
+
+#endif /* SP_MANUAL_INST */
diff --git a/style/dsssl_ns.h b/style/dsssl_ns.h
new file mode 100644 (file)
index 0000000..c1d5c32
--- /dev/null
@@ -0,0 +1,48 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#ifndef dsssl_ns_INCLUDED
+#define dsssl_ns_INCLUDED 1
+
+#ifdef DSSSL_NAMESPACE
+
+#ifdef SP_NAMESPACE
+namespace SP_NAMESPACE { }
+#endif
+
+#ifdef GROVE_NAMESPACE
+namespace GROVE_NAMESPACE { }
+#endif
+
+namespace DSSSL_NAMESPACE {
+
+#ifdef SP_NAMESPACE
+  using namespace SP_NAMESPACE;
+#endif
+
+#ifdef GROVE_NAMESPACE
+  using namespace GROVE_NAMESPACE;
+#endif
+
+#if _MSC_VER >= 1100
+  /* This works around a bug with using directives in Visual C++ 6.0.
+     I don't know if it also works in 5.0 */
+  const int work_around_bug_in_visual_c_6 = 0;
+}
+
+namespace DSSSL_NAMESPACE {
+
+#ifdef SP_NAMESPACE
+  using namespace SP_NAMESPACE;
+#endif
+
+#ifdef GROVE_NAMESPACE
+  using namespace GROVE_NAMESPACE;
+#endif
+
+#endif /* _MSC_VER >= 1100 */
+}
+
+#endif /* DSSSL_NAMESPACE */
+
+#endif /* not dsssl_ns_INCLUDED */
diff --git a/style/jade_version.h b/style/jade_version.h
new file mode 100644 (file)
index 0000000..009a2cc
--- /dev/null
@@ -0,0 +1 @@
+#define JADE_VERSION SP_T("1.3.2")
diff --git a/style/primitive.cxx b/style/primitive.cxx
new file mode 100644 (file)
index 0000000..30e8334
--- /dev/null
@@ -0,0 +1,5704 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#include "stylelib.h"
+#include "Interpreter.h"
+#include "InterpreterMessages.h"
+#include "EvalContext.h"
+#include "SosofoObj.h"
+#include "Style.h"
+#include "Insn.h"
+#include "macros.h"
+#include "ELObjMessageArg.h"
+#include "LocNode.h"
+#include "VM.h"
+#include "Pattern.h"
+#include "ELObjPropVal.h"
+#include <math.h>
+#include <limits.h>
+#include <stdio.h>
+#include <time.h>
+#include "LangObj.h"
+#include <ctype.h>
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+class DescendantsNodeListObj : public NodeListObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  DescendantsNodeListObj(const NodePtr &, unsigned = 0);
+  NodePtr nodeListFirst(EvalContext &, Interpreter &);
+  NodeListObj *nodeListRest(EvalContext &, Interpreter &);
+  NodeListObj *nodeListChunkRest(EvalContext &, Interpreter &, bool &);
+private:
+  static void advance(NodePtr &, unsigned &);
+  static void chunkAdvance(NodePtr &, unsigned &);
+  // nodes in node list are strictly after this node
+  NodePtr start_;
+  unsigned depth_;
+};
+
+class SiblingNodeListObj : public NodeListObj {
+public:
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  SiblingNodeListObj(const NodePtr &first, const NodePtr &end);
+  NodePtr nodeListFirst(EvalContext &, Interpreter &);
+  NodeListObj *nodeListRest(EvalContext &, Interpreter &);
+  NodeListObj *nodeListChunkRest(EvalContext &, Interpreter &, bool &);
+private:
+  NodePtr first_;
+  NodePtr end_;
+};
+
+class SelectByClassNodeListObj : public NodeListObj {
+public:
+  SelectByClassNodeListObj(NodeListObj *nl, ComponentName::Id);
+  NodePtr nodeListFirst(EvalContext &, Interpreter &);
+  NodeListObj *nodeListRest(EvalContext &, Interpreter &);
+  NodeListObj *nodeListChunkRest(EvalContext &, Interpreter &, bool &);
+  void traceSubObjects(Collector &) const;
+private:
+  NodeListObj *nodeList_;
+  ComponentName::Id cls_;
+};
+
+class MapNodeListObj : public NodeListObj {
+public:
+  class Context : public Resource {
+  public:
+    Context(const EvalContext &, const Location &);
+    void set(EvalContext &) const;
+    void traceSubObjects(Collector &) const;
+    Location loc;
+  private:
+    NodePtr currentNode_;
+    const ProcessingMode *processingMode_;
+    StyleObj *overridingStyle_;
+    bool haveStyleStack_;
+  };
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  MapNodeListObj(FunctionObj *func, NodeListObj *nl, const ConstPtr<Context> &, NodeListObj *mapped = 0);
+  NodePtr nodeListFirst(EvalContext &, Interpreter &);
+  NodeListObj *nodeListRest(EvalContext &, Interpreter &);
+  void traceSubObjects(Collector &) const;
+  bool suppressError();
+private:
+  void mapNext(EvalContext &, Interpreter &);
+  FunctionObj *func_;
+  NodeListObj *nl_;
+  NodeListObj *mapped_;
+  ConstPtr<Context> context_;
+};
+
+class SelectElementsNodeListObj : public NodeListObj {
+public:
+  struct PatternSet : public Resource, public NCVector<Pattern> { };
+  void *operator new(size_t, Collector &c) {
+    return c.allocateObject(1);
+  }
+  SelectElementsNodeListObj(NodeListObj *, NCVector<Pattern> &);
+  SelectElementsNodeListObj(NodeListObj *, const ConstPtr<PatternSet> &);
+  void traceSubObjects(Collector &) const;
+  NodePtr nodeListFirst(EvalContext &, Interpreter &);
+  NodeListObj *nodeListRest(EvalContext &, Interpreter &);
+private:
+  NodeListObj *nodeList_;
+  ConstPtr<PatternSet> patterns_;
+};
+
+#define PRIMITIVE(name, string, nRequired, nOptional, rest) \
+class name ## PrimitiveObj : public PrimitiveObj { \
+public: \
+  static const Signature signature_; \
+  name ## PrimitiveObj() : PrimitiveObj(&signature_) { } \
+  ELObj *primitiveCall(int, ELObj **, EvalContext &, Interpreter &, const Location &); \
+}; \
+const Signature name ## PrimitiveObj::signature_ \
+  = { nRequired, nOptional, rest };
+
+#define XPRIMITIVE PRIMITIVE
+#define XXPRIMITIVE PRIMITIVE
+#define PRIMITIVE2 PRIMITIVE
+#include "primitive.h"
+#undef PRIMITIVE
+#undef XPRIMITIVE
+#undef XXPRIMITIVE
+#undef PRIMITIVE2
+
+#define DEFPRIMITIVE(name, argc, argv, context, interp, loc) \
+ ELObj *name ## PrimitiveObj \
+  ::primitiveCall(int argc, ELObj **argv, EvalContext &context, Interpreter &interp, \
+                  const Location &loc)
+
+DEFPRIMITIVE(Cons, argc, argv, context, interp, loc)
+{
+  return new (interp) PairObj(argv[0], argv[1]);
+}
+
+DEFPRIMITIVE(List, argc, argv, context, interp, loc)
+{
+  if (argc == 0)
+    return interp.makeNil();
+  PairObj *head = new (interp) PairObj(argv[0], 0);
+  ELObjDynamicRoot protect(interp, head);
+  PairObj *tail = head;
+  for (int i = 1; i < argc; i++) {
+    PairObj *tem = new (interp) PairObj(argv[i], 0);
+    tail->setCdr(tem);
+    tail = tem;
+  }
+  tail->setCdr(interp.makeNil());
+  return head;
+}
+
+DEFPRIMITIVE(IsNull, argc, argv, context, interp, loc)
+{
+  if (argv[0]->isNil())
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(IsList, argc, argv, context, interp, loc)
+{
+  ELObj *obj = argv[0];
+  for (;;) {
+    PairObj *pair = obj->asPair();
+    if (pair)
+      obj = pair->cdr();
+    else if (obj->isNil())
+      return interp.makeTrue();
+    else
+      break;
+  }
+  return interp.makeFalse();
+}
+
+DEFPRIMITIVE(IsEqual, argc, argv, context, interp, loc)
+{
+  if (ELObj::equal(*argv[0], *argv[1]))
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(IsEqv, argc, argv, context, interp, loc)
+{
+  if (ELObj::eqv(*argv[0], *argv[1]))
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(Car, argc, argv, context, interp, loc)
+{
+  PairObj *pair = argv[0]->asPair();
+  if (!pair)
+    return argError(interp, loc,
+                   InterpreterMessages::notAPair, 0, argv[0]);
+  else
+    return pair->car();
+}
+
+DEFPRIMITIVE(Cdr, argc, argv, context, interp, loc)
+{
+  PairObj *pair = argv[0]->asPair();
+  if (!pair)
+    return argError(interp, loc,
+                   InterpreterMessages::notAPair, 0, argv[0]);
+  else
+    return pair->cdr();
+}
+
+DEFPRIMITIVE(Append, argc, argv, context, interp, loc)
+{
+  if (argc == 0)
+    return interp.makeNil();
+  PairObj *tail = interp.makePair(0, 0);
+  PairObj *head = tail;
+  ELObjDynamicRoot protect(interp, head);
+  for (int i = 0; i < argc - 1; i++) {
+    for (ELObj *p = argv[i]; !p->isNil();) {
+      PairObj *tem = p->asPair();
+      if (!tem)
+       return argError(interp, loc,
+                       InterpreterMessages::notAList, i, p);
+      PairObj *newTail = new (interp) PairObj(tem->car(), 0);
+      tail->setCdr(newTail);
+      tail = newTail;
+      p = tem->cdr();
+    }
+  }
+  tail->setCdr(argv[argc - 1]);
+  return head->cdr();
+}
+
+DEFPRIMITIVE(Reverse, argc, argv, context, interp, loc)
+{
+  ELObjDynamicRoot protect(interp, interp.makeNil());
+  ELObj *p = argv[0];
+  while (!p->isNil()) {
+    PairObj *tem = p->asPair();
+    if (!tem)
+      return argError(interp, loc,
+                     InterpreterMessages::notAList, 0, argv[0]);
+    protect = new (interp) PairObj(tem->car(), protect);
+    p = tem->cdr();
+  }
+  return protect;
+}
+
+DEFPRIMITIVE(ListTail, argc, argv, context, interp, loc)
+{
+  long k;
+  if (!argv[1]->exactIntegerValue(k))
+    return argError(interp, loc,
+                   InterpreterMessages::notAnExactInteger, 1, argv[1]);
+  if (k < 0) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::outOfRange);
+    return interp.makeError();
+  }
+  ELObj *p = argv[0];
+  for (; k > 0; k--) {
+    PairObj *tem = p->asPair();
+    if (!tem) {
+      if (p->isNil()) {
+        interp.setNextLocation(loc);
+       interp.message(InterpreterMessages::outOfRange);
+       return interp.makeError();
+      }
+      else
+        return argError(interp, loc,
+                       InterpreterMessages::notAList, 0, argv[0]);
+    }
+    p = tem->cdr();
+  }
+  return p;
+}
+
+DEFPRIMITIVE(ListRef, argc, argv, context, interp, loc)
+{
+  long k;
+  if (!argv[1]->exactIntegerValue(k))
+    return argError(interp, loc,
+                   InterpreterMessages::notAnExactInteger, 1, argv[1]);
+  if (k < 0) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::outOfRange);
+    return interp.makeError();
+  }
+  ELObj *p = argv[0];
+  for (;;) {
+    PairObj *tem = p->asPair();
+    if (!tem)
+      break;
+    if (k == 0)
+      return tem->car();
+    --k;
+    p = tem->cdr();
+  }
+  if (p->isNil()) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::outOfRange);
+    return interp.makeError();
+  }
+  else
+    return argError(interp, loc,
+                   InterpreterMessages::notAList, 0, argv[0]);
+}
+
+DEFPRIMITIVE(Member, argc, argv, context, interp, loc)
+{
+  ELObj *p = argv[1];
+  while (!p->isNil()) {
+    PairObj *tem = p->asPair();
+    if (!tem)
+      return argError(interp, loc,
+                     InterpreterMessages::notAList, 1, argv[1]);
+    if (ELObj::equal(*argv[0], *tem->car()))
+      return p;
+    p = tem->cdr();
+  }
+  return interp.makeFalse();
+}
+
+DEFPRIMITIVE(Memv, argc, argv, context, interp, loc)
+{
+  ELObj *p = argv[1];
+  while (!p->isNil()) {
+    PairObj *tem = p->asPair();
+    if (!tem)
+      return argError(interp, loc,
+                     InterpreterMessages::notAList, 1, argv[1]);
+    if (ELObj::eqv(*argv[0], *tem->car()))
+      return p;
+    p = tem->cdr();
+  }
+  return interp.makeFalse();
+}
+
+DEFPRIMITIVE(Length, argc, argv, context, interp, loc)
+{
+  ELObj *obj = argv[0];
+  long n = 0;
+  for (;;) {
+    PairObj *pair = obj->asPair();
+    if (pair) {
+      n++;
+      obj = pair->cdr();
+    }
+    else if (obj->isNil())
+      break;
+    else if (interp.isError(obj))
+      return obj;
+    else
+      return argError(interp, loc,
+                     InterpreterMessages::notAList, 0, obj);
+  }
+  return interp.makeInteger(n);
+}
+
+DEFPRIMITIVE(Not, argc, argv, context, interp, loc)
+{
+  if (argv[0]->isTrue())
+    return interp.makeFalse();
+  else
+    return interp.makeTrue();
+}
+
+DEFPRIMITIVE(IsSymbol, argc, argv, context, interp, loc)
+{
+  if (argv[0]->asSymbol())
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(IsKeyword, argc, argv, context, interp, loc)
+{
+  if (argv[0]->asKeyword())
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(IsInteger, argc, argv, context, interp, loc)
+{
+  long n;
+  if (argv[0]->exactIntegerValue(n))
+    return interp.makeTrue();
+  double x;
+  if (argv[0]->realValue(x) && modf(x, &x) == 0.0)
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(IsReal, argc, argv, context, interp, loc)
+{
+  double x;
+  if (argv[0]->realValue(x))
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(IsNumber, argc, argv, context, interp, loc)
+{
+  double x;
+  if (argv[0]->realValue(x))
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(IsQuantity, argc, argv, context, interp, loc)
+{
+  long n;
+  double d;
+  int dim;
+  if (argv[0]->quantityValue(n, d, dim) != ELObj::noQuantity)
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(IsPair, argc, argv, context, interp, loc)
+{
+  if (argv[0]->asPair())
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(IsProcedure, argc, argv, context, interp, loc)
+{
+  if (argv[0]->asFunction())
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(IsBoolean, argc, argv, context, interp, loc)
+{
+  if (argv[0] == interp.makeTrue())
+    return argv[0];
+  else if (argv[0] == interp.makeFalse())
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(IsChar, argc, argv, context, interp, loc)
+{
+  Char c;
+  if (argv[0]->charValue(c))
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(IsCharEqual, argc, argv, context, interp, loc)
+{
+  Char c1, c2;
+  if (!argv[0]->charValue(c1))
+    return argError(interp, loc,
+                   InterpreterMessages::notAChar, 0, argv[0]);
+  if (!argv[1]->charValue(c2))
+    return argError(interp, loc,
+                   InterpreterMessages::notAChar, 1, argv[1]);
+  if (c1 == c2)
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(String, argc, argv, context, interp, loc)
+{
+  StringObj *obj = new (interp) StringObj;
+  for (int i = 0; i < argc; i++) {
+    Char c;
+    if (!argv[i]->charValue(c)) 
+      return argError(interp, loc,
+                     InterpreterMessages::notAChar, i, argv[i]);
+    *obj += c;
+  }
+  return obj;
+}
+
+DEFPRIMITIVE(SymbolToString, argc, argv, context, interp, loc)
+{
+  SymbolObj *obj = argv[0]->asSymbol();
+  if (!obj)
+    return argError(interp, loc,
+                   InterpreterMessages::notASymbol, 0, argv[0]);
+  return obj->name();
+}
+
+DEFPRIMITIVE(StringToSymbol, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  return interp.makeSymbol(StringC(s, n));
+}
+
+DEFPRIMITIVE(IsString, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (argv[0]->stringData(s, n))
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(StringLength, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  return interp.makeInteger(n);
+}
+
+DEFPRIMITIVE(IsStringEqual, argc, argv, context, interp, loc)
+{
+  const Char *s1, *s2;
+  size_t n1, n2;
+  if (!argv[0]->stringData(s1, n1))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  if (!argv[1]->stringData(s2, n2))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 1, argv[1]);
+  if (n1 == n2
+      && (n1 == 0 || memcmp(s1, s2, n1*sizeof(Char)) == 0))
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(StringAppend, argc, argv, context, interp, loc)
+{
+  StringObj *result = new (interp) StringObj;
+  for (int i = 0; i < argc; i++) {
+    const Char *s;
+    size_t n;
+    if (!argv[i]->stringData(s, n))
+      return argError(interp, loc,
+                     InterpreterMessages::notAString, i,
+                     argv[i]);
+    result->append(s, n);
+  }
+  return result;
+}
+
+DEFPRIMITIVE(StringRef, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  long k;
+  if (!argv[1]->exactIntegerValue(k))
+    return argError(interp, loc,
+                   InterpreterMessages::notAnExactInteger, 1, argv[1]);
+  if (k < 0 || (unsigned long)k >= n) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::outOfRange);
+    return interp.makeError();
+  }
+  return interp.makeChar(s[size_t(k)]);
+}
+
+DEFPRIMITIVE(Substring, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  long start;
+  if (!argv[1]->exactIntegerValue(start))
+    return argError(interp, loc,
+                   InterpreterMessages::notAnExactInteger, 1, argv[1]);
+  long end;
+  if (!argv[2]->exactIntegerValue(end))
+    return argError(interp, loc,
+                   InterpreterMessages::notAnExactInteger, 2, argv[2]);
+  if (start < 0 || (unsigned long)end > n || start > end) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::outOfRange);
+    return interp.makeError();
+  }
+  return new (interp) StringObj(s + size_t(start), size_t(end - start));
+}
+
+DEFPRIMITIVE(Equal, argc, argv, context, interp, loc)
+{
+  if (argc == 0)
+    return interp.makeTrue();
+  long lResult;
+  double dResult;
+  int dim;
+  int i = 1;
+  switch (argv[0]->quantityValue(lResult, dResult, dim)) {
+  case ELObj::noQuantity:
+    return argError(interp, loc,
+                   InterpreterMessages::notAQuantity, 0, argv[0]);
+  case ELObj::longQuantity:
+    break;
+  case ELObj::doubleQuantity:
+    goto useDouble;
+    break;
+  default:
+    CANNOT_HAPPEN();
+  }
+  long lResult2;
+  double dResult2;
+  int dim2;
+  for (; i < argc; i++) {
+    switch (argv[i]->quantityValue(lResult2, dResult2, dim2)) {
+    case ELObj::noQuantity:
+      return argError(interp, loc,
+                   InterpreterMessages::notAQuantity, i, argv[i]);
+    case ELObj::longQuantity:
+      if (lResult2 != lResult || dim2 != dim)
+       return interp.makeFalse();
+      break;
+    case ELObj::doubleQuantity:
+      dResult = lResult;
+      if (dResult2 != dResult || dim2 != dim)
+       return interp.makeFalse();
+      i++;
+      goto useDouble;
+    default:
+      CANNOT_HAPPEN();
+    }
+  }
+  return interp.makeTrue();
+ useDouble:
+  for (; i < argc; i++) {
+    switch (argv[i]->quantityValue(lResult2, dResult2, dim2)) {
+    case ELObj::noQuantity:
+      return argError(interp, loc,
+                     InterpreterMessages::notAQuantity, i, argv[i]);
+    case ELObj::longQuantity:
+      if (lResult2 != dResult || dim2 != dim)
+       return interp.makeFalse();
+      break;
+    case ELObj::doubleQuantity:
+      if (dResult2 != dResult || dim2 != dim)
+       return interp.makeFalse();
+      break;
+    }
+  }
+  return interp.makeTrue();
+}
+
+DEFPRIMITIVE(Plus, argc, argv, context, interp, loc)
+{
+  if (argc == 0)
+    return interp.makeInteger(0);
+  long lResult;
+  double dResult;
+  bool usingD;
+  bool spec = 0;
+  int dim;
+  switch (argv[0]->quantityValue(lResult, dResult, dim)) {
+  case ELObj::noQuantity:
+    dim = 1;
+    spec = 1;
+    break;
+  case ELObj::longQuantity:
+    usingD = 0;
+    break;
+  case ELObj::doubleQuantity:
+    usingD = 1;
+    break;
+  default:
+    CANNOT_HAPPEN();
+  }
+  for (int i = 1; !spec && i < argc; i++) {
+    long lResult2;
+    double dResult2;
+    int dim2;
+    switch (argv[i]->quantityValue(lResult2, dResult2, dim2)) {
+    case ELObj::noQuantity:
+      // FIXME shouldn't quantityValue set dim to 1 for length-specs ?
+      dim2 = 1;
+      spec = 1;
+      break;
+    case ELObj::longQuantity:
+      if (!usingD) {
+       if (lResult2 < 0) {
+         if (lResult >= LONG_MIN - lResult2) {
+           lResult += lResult2;
+           break;
+         }
+       }
+       else {
+         if (lResult <= LONG_MAX - lResult2) {
+           lResult += lResult2;
+           break;
+         }
+       }
+       usingD = 1;
+       dResult = double(lResult);
+      }
+      dResult += double(lResult2);
+      break;
+    case ELObj::doubleQuantity:
+      if (!usingD) {
+       dResult = lResult;
+       usingD = 1;
+      }
+      dResult += dResult2;
+      break;
+    default:
+      CANNOT_HAPPEN();
+    }
+    if (dim2 != dim) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::incompatibleDimensions);
+      return interp.makeError();
+    }
+  }
+
+  if (spec) {
+    LengthSpec ls;
+    for (int i = 0; i < argc; i++) {
+      const LengthSpec *lsp = argv[i]->lengthSpec();
+      if (lsp)
+       ls += *lsp;
+      else {
+       switch (argv[i]->quantityValue(lResult, dResult, dim)) {
+       case ELObj::noQuantity:
+         return argError(interp, loc, InterpreterMessages::notAQuantityOrLengthSpec,
+                         i, argv[i]);
+       case ELObj::longQuantity:
+         dResult = lResult;
+         // fall through
+       case ELObj::doubleQuantity:
+         if (dim != 1) {
+           interp.setNextLocation(loc);
+           interp.message(InterpreterMessages::incompatibleDimensions);
+           return interp.makeError();
+         }
+         ls += dResult;
+         break;
+       }
+      }
+    }
+    return new (interp) LengthSpecObj(ls);
+  }
+
+  if (!usingD) {
+    if (dim == 0)
+      return interp.makeInteger(lResult);
+    else if (dim == 1)
+      return new (interp) LengthObj(lResult);
+    else
+      dResult = lResult;
+  }
+  if (dim == 0)
+    return new (interp) RealObj(dResult);
+  else
+    return new (interp) QuantityObj(dResult, dim);
+}
+
+DEFPRIMITIVE(Minus, argc, argv, context, interp, loc)
+{
+  long lResult;
+  double dResult;
+  bool usingD;
+  bool spec = 0;
+  int dim;
+  switch (argv[0]->quantityValue(lResult, dResult, dim)) {
+  case ELObj::noQuantity:
+    spec = 1;
+    break;
+  case ELObj::longQuantity:
+    usingD = 0;
+    break;
+  case ELObj::doubleQuantity:
+    usingD = 1;
+    break;
+  default:
+    CANNOT_HAPPEN();
+  }
+  if (argc == 1) {
+    if (usingD)
+      dResult = -dResult;
+    else
+      lResult = -lResult;
+  }
+  else {
+    for (int i = 1; !spec && i < argc; i++) {
+      long lResult2;
+      double dResult2;
+      int dim2;
+      switch (argv[i]->quantityValue(lResult2, dResult2, dim2)) {
+      case ELObj::noQuantity:
+        dim2 = dim;
+       spec = 1;
+       break;
+      case ELObj::longQuantity:
+       if (!usingD) {
+         if (lResult2 > 0) {
+           if (lResult >= LONG_MIN + lResult2) {
+             lResult -= lResult2;
+             break;
+           }
+         }
+         else {
+           if (lResult <= LONG_MAX + lResult2) {
+             lResult -= lResult2;
+             break;
+           }
+         }
+         usingD = 1;
+         dResult = double(lResult);
+       }
+       dResult -= double(lResult2);
+       break;
+      case ELObj::doubleQuantity:
+       if (!usingD) {
+         dResult = lResult;
+         usingD = 1;
+       }
+       dResult -= dResult2;
+       break;
+      default:
+       CANNOT_HAPPEN();
+      }
+      if (dim2 != dim) {
+       interp.setNextLocation(loc);
+       interp.message(InterpreterMessages::incompatibleDimensions);
+       return interp.makeError();
+      }
+    }
+  }
+
+  if (spec) {
+    LengthSpec ls;
+    for (int i = 0; i < argc; i++) {
+      const LengthSpec *lsp = argv[i]->lengthSpec();
+      if (lsp) {
+        if (i > 0 || argc == 1) 
+          ls -= *lsp;
+        else
+          ls += *lsp;
+      }
+      else {
+        switch (argv[i]->quantityValue(lResult, dResult, dim)) {
+        case ELObj::noQuantity:
+          return argError(interp, loc, InterpreterMessages::notAQuantityOrLengthSpec,
+                         i, argv[i]);
+       case ELObj::longQuantity:
+         dResult = lResult;
+         // fall through
+       case ELObj::doubleQuantity:
+         if (dim != 1) {
+           interp.setNextLocation(loc);
+           interp.message(InterpreterMessages::incompatibleDimensions);
+           return interp.makeError();
+         }
+          if (i > 0 || argc == 1) 
+           ls -= dResult;
+          else 
+           ls += dResult;
+         break;
+       }
+      }
+    }
+    return new (interp) LengthSpecObj(ls);
+  }
+  
+  if (!usingD) {
+    if (dim == 0)
+      return interp.makeInteger(lResult);
+    else if (dim == 1)
+      return new (interp) LengthObj(lResult);
+    else
+      dResult = lResult;
+  }
+  if (dim == 0)
+    return new (interp) RealObj(dResult);
+  else
+    return new (interp) QuantityObj(dResult, dim);
+}
+
+DEFPRIMITIVE(Multiply, argc, argv, context, interp, loc)
+{
+  if (argc == 0)
+    return interp.makeInteger(1);
+  long lResult;
+  double dResult;
+  int dim;
+  int i = 1;
+  switch (argv[0]->quantityValue(lResult, dResult, dim)) {
+  case ELObj::noQuantity:
+    {
+      const LengthSpec *ls = argv[0]->lengthSpec();
+      if (ls) {
+       LengthSpec result(*ls);
+       double d;
+       for (; i < argc; i++) {
+         if (!argv[i]->realValue(d))
+           return argError(interp, loc,
+                           InterpreterMessages::notANumber, 1, argv[1]);
+         result *= d;
+       }
+       return new (interp) LengthSpecObj(result);
+      }
+    }
+    return argError(interp, loc,
+                   InterpreterMessages::notAQuantity, 0, argv[0]);
+  case ELObj::longQuantity:
+    break;
+  case ELObj::doubleQuantity:
+    goto useDouble;
+  default:
+    CANNOT_HAPPEN();
+  }
+  long lResult2;
+  double dResult2;
+  int dim2;
+  for (; i < argc; i++) {
+    switch (argv[i]->quantityValue(lResult2, dResult2, dim2)) {
+    case ELObj::noQuantity:
+      return argError(interp, loc,
+                     InterpreterMessages::notAQuantity, i, argv[i]);
+    case ELObj::longQuantity:
+      dim += dim2;
+      if (dim > 1
+         || (lResult2 != 0
+             && (lResult2 < 0
+                 ? (lResult > 0
+                    ? lResult > -(unsigned)LONG_MIN / -(unsigned)lResult2
+                    : -(unsigned)lResult > LONG_MAX / -(unsigned)lResult2)
+                 : (lResult > 0
+                    ? lResult > LONG_MAX / lResult2
+                    : -(unsigned)lResult > -(unsigned)LONG_MIN / lResult2)))) {
+       dResult = double(lResult) * lResult2;
+       i++;
+       goto useDouble;
+      }
+      lResult *= lResult2;
+      break;
+    case ELObj::doubleQuantity:
+      dim += dim2;
+      dResult = lResult * dResult2;
+      i++;
+      goto useDouble;
+    default:
+      CANNOT_HAPPEN();
+    }
+  }
+  if (dim == 0)
+    return interp.makeInteger(lResult);
+  else
+    return new (interp) LengthObj(lResult);
+ useDouble:
+  for (; i < argc; i++) {
+    switch (argv[i]->quantityValue(lResult2, dResult2, dim2)) {
+    case ELObj::noQuantity:
+      return argError(interp, loc,
+                     InterpreterMessages::notAQuantity, i, argv[i]);
+    case ELObj::longQuantity:
+      dResult *= lResult2;
+      break;
+    case ELObj::doubleQuantity:
+      dResult *= dResult2;
+      break;
+    }
+    dim += dim2;
+  }
+  if (dim == 0)
+    return new (interp) RealObj(dResult);
+  else
+    return new (interp) QuantityObj(dResult, dim);
+}
+
+DEFPRIMITIVE(Divide, argc, argv, context, interp, loc)
+{
+  long lResult;
+  double dResult;
+  int dim;
+  if (argc == 1) {
+    switch (argv[0]->quantityValue(lResult, dResult, dim)) {
+    case ELObj::noQuantity:
+      return argError(interp, loc,
+                     InterpreterMessages::notAQuantity, 0, argv[0]);
+    case ELObj::longQuantity:
+      if (lResult == 0)
+       goto divide0;
+      dResult = 1.0/lResult;
+      break;
+    case ELObj::doubleQuantity:
+      if (dResult == 0.0)
+       goto divide0;
+      dResult = 1.0/dResult;
+      break;
+    default:
+      CANNOT_HAPPEN();
+    }
+    dim = -dim;
+  }
+  else {
+    int i = 1;
+    switch (argv[0]->quantityValue(lResult, dResult, dim)) {
+    case ELObj::noQuantity:
+      {
+       const LengthSpec *ls = argv[0]->lengthSpec();
+       if (ls) {
+         LengthSpec result(*ls);
+         double d;
+         for (; i < argc; i++) {
+           if (!argv[i]->realValue(d))
+             return argError(interp, loc,
+                             InterpreterMessages::notANumber, 1, argv[1]);
+           if (d == 0.0)
+             goto divide0;
+           result /= d;
+         }
+         return new (interp) LengthSpecObj(result);
+       }
+      }
+      return argError(interp, loc,
+                     InterpreterMessages::notAQuantity, 0, argv[0]);
+    case ELObj::longQuantity:
+      break;
+    case ELObj::doubleQuantity:
+      goto useDouble;
+    default:
+      CANNOT_HAPPEN();
+    }
+    long lResult2;
+    double dResult2;
+    int dim2;
+    for (; i < argc; i++) {
+      switch (argv[i]->quantityValue(lResult2, dResult2, dim2)) {
+      case ELObj::noQuantity:
+       return argError(interp, loc,
+                       InterpreterMessages::notAQuantity, 0, argv[0]);
+      case ELObj::longQuantity:
+       if (lResult2 == 0)
+         goto divide0;
+       dim -= dim2;
+       // If dim and dim2 are both 1, must goto useDouble:
+       // since lengths are inexact, result must be inexact.
+       if (dim2 == 0 && lResult % lResult2 == 0) {
+         lResult /= lResult2;
+         break;
+       }
+       dResult = double(lResult)/lResult2;
+       i++;
+       goto useDouble;
+      case ELObj::doubleQuantity:
+       dim -= dim2;
+       dResult = lResult;
+       if (dResult2 == 0.0)
+         goto divide0;
+       dResult /= dResult2;
+       i++;
+       goto useDouble;
+      default:
+       CANNOT_HAPPEN();
+      }
+    }
+    if (dim == 0)
+      return interp.makeInteger(lResult);
+    else
+      return new (interp) LengthObj(lResult);
+  useDouble:
+    for (; i < argc; i++) {
+      switch (argv[i]->quantityValue(lResult2, dResult2, dim2)) {
+      case ELObj::noQuantity:
+       return argError(interp, loc,
+                       InterpreterMessages::notAQuantity, i, argv[i]);
+      case ELObj::longQuantity:
+       if (lResult2 == 0)
+         goto divide0;
+       dResult /= lResult2;
+       break;
+      case ELObj::doubleQuantity:
+       dResult /= dResult2;
+       if (dResult2 == 0.0)
+         goto divide0;
+       break;
+      }
+      dim -= dim2;
+    }
+  }
+  if (dim == 0)
+    return new (interp) RealObj(dResult);
+  else
+    return new (interp) QuantityObj(dResult, dim);
+ divide0:
+  interp.setNextLocation(loc);
+  interp.message(InterpreterMessages::divideBy0);
+  return interp.makeError();
+}
+
+DEFPRIMITIVE(Quotient, argc, argv, context, interp, loc)
+{
+  long n1;
+  long n2;
+  if (argv[0]->exactIntegerValue(n1) && argv[1]->exactIntegerValue(n2)) {
+    if (n2 == 0) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::divideBy0);
+      return interp.makeError();
+    }
+    // This isn't strictly portable.
+    return interp.makeInteger(n1 / n2);
+  }
+  double d1;
+  if (!argv[0]->realValue(d1) || modf(d1, &d1) != 0.0)
+    return argError(interp, loc,
+                   InterpreterMessages::notAnExactInteger, 0, argv[0]);
+  double d2;
+  if (!argv[1]->realValue(d2) || modf(d2, &d2) != 0.0)
+    return argError(interp, loc,
+                   InterpreterMessages::notAnExactInteger, 1, argv[1]);
+  if (d2 == 0.0) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::divideBy0);
+    return interp.makeError();
+  }
+  return new (interp) RealObj((d1 - fmod(d1, d2))/d2);
+}
+
+DEFPRIMITIVE(Remainder, argc, argv, context, interp, loc)
+{
+  long n1;
+  long n2;
+  if (argv[0]->exactIntegerValue(n1) && argv[1]->exactIntegerValue(n2)) {
+    if (n2 == 0) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::divideBy0);
+      return interp.makeError();
+    }
+    // This isn't strictly portable.
+    return interp.makeInteger(n1 % n2);
+  }
+  double d1;
+  if (!argv[0]->realValue(d1) || modf(d1, &d1) != 0.0)
+    return argError(interp, loc,
+                   InterpreterMessages::notAnExactInteger, 0, argv[0]);
+  double d2;
+  if (!argv[1]->realValue(d2) || modf(d2, &d2) != 0.0)
+    return argError(interp, loc,
+                   InterpreterMessages::notAnExactInteger, 1, argv[1]);
+  if (d2 == 0.0) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::divideBy0);
+    return interp.makeError();
+  }
+  return new (interp) RealObj(fmod(d1, d2));
+}
+
+DEFPRIMITIVE(Modulo, argc, argv, context, interp, loc)
+{
+  long n1;
+  long n2;
+  if (argv[0]->exactIntegerValue(n1) && argv[1]->exactIntegerValue(n2)) {
+    if (n2 == 0) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::divideBy0);
+      return interp.makeError();
+    }
+    long r = n1 % n2;
+    if (n2 > 0 ? r < 0 : r > 0)
+      r += n2;
+    return interp.makeInteger(r);
+  }
+  double d1;
+  if (!argv[0]->realValue(d1) || modf(d1, &d1) != 0.0)
+    return argError(interp, loc,
+                   InterpreterMessages::notAnExactInteger, 0, argv[0]);
+  double d2;
+  if (!argv[1]->realValue(d2) || modf(d2, &d2) != 0.0)
+    return argError(interp, loc,
+                   InterpreterMessages::notAnExactInteger, 1, argv[1]);
+  if (d2 == 0.0) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::divideBy0);
+    return interp.makeError();
+  }
+  double r = fmod(d1, d2);
+  if (d2 > 0 ? r < 0 : r > 0)
+    r += d2;
+  return new (interp) RealObj(r);
+}
+
+#define DEFCOMPARE(NAME, OP) \
+DEFPRIMITIVE(NAME, argc, argv, context, interp, loc) \
+{ \
+  if (argc == 0) \
+    return interp.makeTrue(); \
+  long lResult; \
+  double dResult; \
+  int dim; \
+  bool lastWasDouble; \
+  switch (argv[0]->quantityValue(lResult, dResult, dim)) { \
+  case ELObj::noQuantity: \
+    return argError(interp, loc, \
+                   InterpreterMessages::notAQuantity, 0, argv[0]); \
+  case ELObj::longQuantity: \
+    lastWasDouble = 0; \
+    break; \
+  case ELObj::doubleQuantity: \
+    lastWasDouble = 1; \
+    break; \
+  default: \
+    CANNOT_HAPPEN(); \
+  } \
+  for (int i = 1; i < argc; i++) { \
+    long lResult2; \
+    double dResult2; \
+    int dim2; \
+    switch (argv[i]->quantityValue(lResult2, dResult2, dim2)) { \
+    case ELObj::noQuantity: \
+      return argError(interp, loc, \
+                     InterpreterMessages::notAQuantity, i, argv[i]); \
+    case ELObj::longQuantity: \
+      if (dim2 != dim) \
+       goto badDim; \
+      if (!(lastWasDouble \
+           ? (dResult OP lResult2) \
+           : (lResult OP lResult2))) \
+       return interp.makeFalse(); \
+      lResult = lResult2; \
+      lastWasDouble = 0; \
+      break; \
+    case ELObj::doubleQuantity: \
+      if (dim != dim2) \
+       goto badDim; \
+      if (!(lastWasDouble \
+           ? (dResult OP dResult2) \
+           : (lResult OP dResult2))) \
+       return interp.makeFalse(); \
+      dResult = dResult2; \
+      lastWasDouble = 1; \
+      break; \
+    } \
+  } \
+  return interp.makeTrue(); \
+ badDim: \
+  interp.setNextLocation(loc); \
+  interp.message(InterpreterMessages::incompatibleDimensions); \
+  return interp.makeError(); \
+}
+
+DEFCOMPARE(Less, <)
+DEFCOMPARE(Greater, >)
+DEFCOMPARE(LessEqual, <=)
+DEFCOMPARE(GreaterEqual, >=)
+
+DEFPRIMITIVE(Min, argc, argv, context, interp, loc)
+{
+  long lResult;
+  double dResult;
+  int dim;
+  int i = 1;
+  switch (argv[0]->quantityValue(lResult, dResult, dim)) {
+  case ELObj::noQuantity:
+    return argError(interp, loc,
+                   InterpreterMessages::notAQuantity, 0, argv[0]);
+  case ELObj::longQuantity:
+    break;
+  case ELObj::doubleQuantity:
+    goto useDouble;
+  default:
+    CANNOT_HAPPEN();
+  }
+  // Note that result is inexact if any of the arguments are
+  for (; i < argc; i++) {
+    long lResult2;
+    double dResult2;
+    int dim2;
+    switch (argv[i]->quantityValue(lResult2, dResult2, dim2)) {
+    case ELObj::noQuantity:
+      return argError(interp, loc,
+                     InterpreterMessages::notAQuantity, i, argv[i]);
+    case ELObj::longQuantity:
+      if (dim2 != dim)
+       goto badDim;
+      if (lResult2 < lResult)
+       lResult = lResult2;
+      break;
+    case ELObj::doubleQuantity:
+      if (dim != dim2)
+       goto badDim;
+      if (dResult2 < lResult)
+       dResult = dResult2;
+      else if (dim)
+       break;
+      else
+       dResult = lResult;
+      i++;
+      goto useDouble;
+    }
+  }
+  if (dim == 0)
+    return interp.makeInteger(lResult);
+  else
+    return new (interp) LengthObj(lResult);
+ useDouble:
+  for (; i < argc; i++) {
+    long lResult2;
+    double dResult2;
+    int dim2;
+    switch (argv[i]->quantityValue(lResult2, dResult2, dim2)) {
+    case ELObj::noQuantity:
+      return argError(interp, loc,
+                     InterpreterMessages::notAQuantity, i, argv[i]);
+    case ELObj::longQuantity:
+      if (dim2 != dim)
+       goto badDim;
+      if (lResult2 < dResult)
+       dResult = lResult2;
+      break;
+    case ELObj::doubleQuantity:
+      if (dim != dim2)
+       goto badDim;
+      if (dResult2 < dResult)
+       dResult = dResult2;
+      break;
+    }
+  }
+  if (dim == 0)
+    return new (interp) RealObj(dResult);
+  else
+    return new (interp) QuantityObj(dResult, dim);
+ badDim:
+  interp.setNextLocation(loc);
+  interp.message(InterpreterMessages::incompatibleDimensions);
+  return interp.makeError();
+}
+
+DEFPRIMITIVE(Max, argc, argv, context, interp, loc)
+{
+  long lResult;
+  double dResult;
+  int dim;
+  int i = 1;
+  switch (argv[0]->quantityValue(lResult, dResult, dim)) {
+  case ELObj::noQuantity:
+    return argError(interp, loc,
+                   InterpreterMessages::notAQuantity, 0, argv[0]);
+  case ELObj::longQuantity:
+    break;
+  case ELObj::doubleQuantity:
+    goto useDouble;
+  default:
+    CANNOT_HAPPEN();
+  }
+  // Note that result is inexact if any of the arguments are
+  for (; i < argc; i++) {
+    long lResult2;
+    double dResult2;
+    int dim2;
+    switch (argv[i]->quantityValue(lResult2, dResult2, dim2)) {
+    case ELObj::noQuantity:
+      return argError(interp, loc,
+                     InterpreterMessages::notAQuantity, i, argv[i]);
+    case ELObj::longQuantity:
+      if (dim2 != dim)
+       goto badDim;
+      if (lResult2 > lResult)
+       lResult = lResult2;
+      break;
+    case ELObj::doubleQuantity:
+      if (dim != dim2)
+       goto badDim;
+      if (dResult2 > lResult)
+       dResult = dResult2;
+      else if (dim)
+       break;
+      else
+       dResult = lResult;
+      i++;
+      goto useDouble;
+    }
+  }
+  if (dim == 0)
+    return interp.makeInteger(lResult);
+  else
+    return new (interp) LengthObj(lResult);
+ useDouble:
+  for (; i < argc; i++) {
+    long lResult2;
+    double dResult2;
+    int dim2;
+    switch (argv[i]->quantityValue(lResult2, dResult2, dim2)) {
+    case ELObj::noQuantity:
+      return argError(interp, loc,
+                     InterpreterMessages::notAQuantity, i, argv[i]);
+    case ELObj::longQuantity:
+      if (dim2 != dim)
+       goto badDim;
+      if (lResult2 > dResult)
+       dResult = lResult2;
+      break;
+    case ELObj::doubleQuantity:
+      if (dim != dim2)
+       goto badDim;
+      if (dResult2 > dResult)
+       dResult = dResult2;
+      break;
+    }
+  }
+  if (dim == 0)
+    return new (interp) RealObj(dResult);
+  else
+    return new (interp) QuantityObj(dResult, dim);
+ badDim:
+  interp.setNextLocation(loc);
+  interp.message(InterpreterMessages::incompatibleDimensions);
+  return interp.makeError();
+}
+
+DEFPRIMITIVE(Floor, argc, argv, context, interp, loc)
+{
+  double d;
+  if (argv[0]->inexactRealValue(d))
+    return new (interp) RealObj(floor(d));
+  long n;
+  if (argv[0]->exactIntegerValue(n))
+    return argv[0];
+  return argError(interp, loc,
+                 InterpreterMessages::notANumber, 0, argv[0]);
+}
+
+DEFPRIMITIVE(Ceiling, argc, argv, context, interp, loc)
+{
+  double d;
+  if (argv[0]->inexactRealValue(d))
+    return new (interp) RealObj(ceil(d));
+  long n;
+  if (argv[0]->exactIntegerValue(n))
+    return argv[0];
+  return argError(interp, loc,
+                 InterpreterMessages::notANumber, 0, argv[0]);
+}
+
+DEFPRIMITIVE(Round, argc, argv, context, interp, loc)
+{
+  double d;
+  if (argv[0]->inexactRealValue(d)) {
+    double result = floor(d + .5);
+    // That rounded it upwards.
+    // Now figure out if that was different from round to
+    // even.
+    if (result - d == 0.5 && fmod(result, 2.0) != 0)
+      result -= 1.0;
+    return new (interp) RealObj(result);
+  }
+  long n;
+  if (argv[0]->exactIntegerValue(n))
+    return argv[0];
+  return argError(interp, loc,
+                 InterpreterMessages::notANumber, 0, argv[0]);
+}
+
+DEFPRIMITIVE(Truncate, argc, argv, context, interp, loc)
+{
+  double d;
+  if (argv[0]->inexactRealValue(d)) {
+    double iPart;
+    modf(d, &iPart);
+    return new (interp) RealObj(iPart);
+  }
+  long n;
+  if (argv[0]->exactIntegerValue(n))
+    return argv[0];
+  return argError(interp, loc,
+                 InterpreterMessages::notANumber, 0, argv[0]);
+}
+
+DEFPRIMITIVE(Abs, argc, argv, context, interp, loc)
+{
+  long lResult;
+  double dResult;
+  int dim;
+  switch (argv[0]->quantityValue(lResult, dResult, dim)) {
+  case ELObj::noQuantity:
+    return argError(interp, loc,
+                   InterpreterMessages::notAQuantity, 0, argv[0]);
+  case ELObj::longQuantity:
+    if (lResult != LONG_MIN) {
+      if (lResult >= 0)
+       return argv[0];
+      if (dim == 0)
+       return interp.makeInteger(-lResult);
+      else
+       return new (interp) LengthObj(-lResult);
+    }
+    dResult = lResult;
+    break;
+  case ELObj::doubleQuantity:
+    break;
+  default:
+    CANNOT_HAPPEN();
+  }
+  if (dResult >= 0)
+    return argv[0];
+  if (dim == 0)
+    return new (interp) RealObj(-dResult);
+  else
+    return new (interp) QuantityObj(-dResult, dim);
+}
+
+DEFPRIMITIVE(Sqrt, argc, argv, context, interp, loc)
+{
+  long lResult;
+  double dResult;
+  int dim;
+  ELObj::QuantityType type
+    = argv[0]->quantityValue(lResult, dResult, dim);
+  switch (type) {
+  case ELObj::noQuantity:
+    return argError(interp, loc,
+                   InterpreterMessages::notAQuantity, 0, argv[0]);
+  case ELObj::longQuantity:
+    dResult = lResult;
+    break;
+  case ELObj::doubleQuantity:
+    break;
+  default:
+    CANNOT_HAPPEN();
+  }
+  if ((dim & 1) || dResult < 0.0) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::outOfRange);
+    return interp.makeError();
+  }
+  dim /= 2;
+  dResult = sqrt(dResult);
+  if (type == ELObj::longQuantity && dim == 0) {
+    long n = long(dResult);
+    if (n*n == lResult)
+      return interp.makeInteger(n);
+  }
+  return new (interp) QuantityObj(dResult, dim);
+}
+
+DEFPRIMITIVE(Time, argc, argv, context, interp, loc)
+{
+  // This assumes a Posix compatible time().
+  time_t t = time(0);
+  return interp.makeInteger(long(t));
+}
+
+DEFPRIMITIVE(TimeToString, argc, argv, context, interp, loc)
+{
+  long k;
+  if (!argv[0]->exactIntegerValue(k))
+    return argError(interp, loc,
+                   InterpreterMessages::notAnExactInteger, 0, argv[0]);
+  time_t t = time_t(k);
+  const struct tm *p;
+  if (argc > 1 && argv[1] != interp.makeFalse())
+    p = gmtime(&t);
+  else
+    p = localtime(&t);
+  char buf[64];
+  sprintf(buf, "%04d-%02d-%02dT%02d:%02d:%02d",
+          p->tm_year + 1900, p->tm_mon + 1, p->tm_mday,
+         p->tm_hour, p->tm_min, p->tm_sec);
+  return new (interp) StringObj(interp.makeStringC(buf));
+}
+
+DEFPRIMITIVE(CharProperty, argc, argv, context, interp, loc)
+{
+  SymbolObj *sym = argv[0]->asSymbol();
+  if (!sym)
+    return argError(interp, loc,
+                   InterpreterMessages::notASymbol, 0, argv[0]);
+  StringObj *prop = argv[0]->asSymbol()->convertToString();
+  Char c;
+  if (!argv[1]->charValue(c))
+    return argError(interp, loc,
+                   InterpreterMessages::notAChar, 1, argv[1]);
+  return interp.charProperty(*prop, c, loc, (argc > 2) ? argv[2] : 0);
+}
+
+DEFPRIMITIVE(Literal, argc, argv, context, interp, loc)
+{
+  if (argc == 0)
+    return new (interp) EmptySosofoObj;
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc, InterpreterMessages::notAString,
+                     0, argv[0]);
+  if (argc == 1)
+    return new (interp) LiteralSosofoObj(argv[0]);
+  StringObj *strObj = new (interp) StringObj(s, n);
+  for (int i = 1; i < argc; i++) {
+    if (!argv[i]->stringData(s, n))
+      return argError(interp, loc, InterpreterMessages::notAString,
+                     i, argv[i]);
+    strObj->append(s, n);
+  }
+  ELObjDynamicRoot protect(interp, strObj);
+  return new (interp) LiteralSosofoObj(strObj);
+}
+
+DEFPRIMITIVE(ProcessChildren, argc, argv, context, interp, loc)
+{
+  if (!context.processingMode) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::noCurrentProcessingMode);
+    return interp.makeError();
+  }
+  return new (interp) ProcessChildrenSosofoObj(context.processingMode);
+}
+
+DEFPRIMITIVE(ProcessChildrenTrim, argc, argv, context, interp, loc)
+{
+  if (!context.processingMode) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::noCurrentProcessingMode);
+    return interp.makeError();
+  }
+  return new (interp) ProcessChildrenTrimSosofoObj(context.processingMode);
+}
+
+DEFPRIMITIVE(SosofoAppend, argc, argv, context, interp, loc)
+{
+  /* Optimize the case where there is no or only
+     one argument */
+  if (argc == 0)
+    return new (interp) EmptySosofoObj;
+  else if (argc == 1) {
+    SosofoObj *sosofo = argv[0]->asSosofo();
+    if (!sosofo)
+      return argError(interp, loc, InterpreterMessages::notASosofo,
+                     0, argv[0]);
+    return sosofo;     
+  }
+
+  /* Don't create another object if the first argument is
+     already an AppendSosofoObj, this handles gracefully 
+     case like 
+     (let loop ( (res (empty-sosofo))
+                (nl  (node-list-rest (children (current-node)))))
+       (loop (sosofo-append res (process-node-list (node-list-first nl)))
+             (node-list-rest nl)))
+   */
+  AppendSosofoObj *obj;
+  int i = 0; 
+  if ( argv[i]->asAppendSosofo() )
+    obj = argv[i++]->asAppendSosofo();
+  else 
+    obj = new (interp) AppendSosofoObj;
+
+  for ( ; i < argc; i++) {
+    SosofoObj *sosofo = argv[i]->asSosofo();
+    if (!sosofo)
+      return argError(interp, loc, InterpreterMessages::notASosofo,
+                     i, argv[i]);
+    obj->append(sosofo);
+  }
+  return obj;
+}
+
+DEFPRIMITIVE(NextMatch, argc, argv, context, interp, loc)
+{
+  if (!context.processingMode) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::noCurrentProcessingMode);
+    return interp.makeError();
+  }
+  StyleObj *style;
+  if (argc == 0)
+    style = 0;
+  else {
+    style = argv[0]->asStyle();
+    if (!style)
+      return argError(interp, loc, InterpreterMessages::notAStyle, 0, argv[0]);
+  }
+  return new (interp) NextMatchSosofoObj(style);
+}
+
+DEFPRIMITIVE(EmptySosofo, argc, argv, context, interp, loc)
+{
+  return new (interp) EmptySosofoObj;
+}
+
+DEFPRIMITIVE(SosofoLabel, argc, argv, context, interp, loc)
+{
+  SosofoObj *sosofo = argv[0]->asSosofo();
+  if (!sosofo)
+    return argError(interp, loc, InterpreterMessages::notASosofo,
+                   0, argv[0]);
+
+  SymbolObj *sym = argv[1]->asSymbol();
+  if (!sym)
+    return argError(interp, loc,
+                   InterpreterMessages::notASymbol, 1, argv[1]);
+  return new (interp) LabelSosofoObj(sym, loc, sosofo);
+}
+
+DEFPRIMITIVE(SosofoDiscardLabeled, argc, argv, context, interp, loc)
+{
+  SosofoObj *sosofo = argv[0]->asSosofo();
+  if (!sosofo)
+    return argError(interp, loc, InterpreterMessages::notASosofo,
+                   0, argv[0]);
+
+  SymbolObj *sym = argv[1]->asSymbol();
+  if (!sym)
+    return argError(interp, loc,
+                   InterpreterMessages::notASymbol, 1, argv[1]);
+  return new (interp) DiscardLabeledSosofoObj(sym, sosofo);
+}
+
+DEFPRIMITIVE(IsSosofo, argc, argv, context, interp, loc)
+{
+  if (argv[0]->asSosofo())
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(MergeStyle, argc, argv, context, interp, loc)
+{
+  MergeStyleObj *merged = new (interp) MergeStyleObj;
+  for (int i = 0; i < argc; i++) {
+    StyleObj *style = argv[i]->asStyle();
+    if (!style)
+      return argError(interp, loc,
+                     InterpreterMessages::notAStyle, i, argv[i]);
+    merged->append(style);
+  }
+  return merged;
+}
+
+DEFPRIMITIVE(IsStyle, argc, argv, context, interp, loc)
+{
+  if (argv[0]->asStyle())
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(CurrentNodePageNumberSosofo, argc, argv, context, interp, loc)
+{
+  if (!context.currentNode)
+    return noCurrentNodeError(interp, loc);
+  return new (interp) CurrentNodePageNumberSosofoObj(context.currentNode);
+}
+
+DEFPRIMITIVE(PageNumberSosofo, argc, argv, context, interp, loc)
+{
+  return new (interp) PageNumberSosofoObj;
+}
+
+DEFPRIMITIVE(ProcessElementWithId, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc, InterpreterMessages::notAString, 0, argv[0]);
+  if (!context.currentNode)
+    return noCurrentNodeError(interp, loc);
+  if (!context.processingMode) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::noCurrentProcessingMode);
+    return interp.makeError();
+  }
+  NodePtr root;
+  NamedNodeListPtr elements;
+  if (context.currentNode->getGroveRoot(root) == accessOK
+      && root->getElements(elements) == accessOK) {
+    NodePtr node;
+    if (elements->namedNode(GroveString(s, n), node) == accessOK)
+      return new (interp) ProcessNodeSosofoObj(node, context.processingMode);
+  }
+  return new (interp) EmptySosofoObj;
+}
+
+DEFPRIMITIVE(ProcessFirstDescendant, argc, argv, context, interp, loc)
+{
+  if (!context.processingMode) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::noCurrentProcessingMode);
+    return interp.makeError();
+  }
+  if (!context.currentNode)
+    return noCurrentNodeError(interp, loc);
+  
+  NCVector<Pattern> patterns(argc);
+  for (size_t i = 0; i < argc; i++) {
+    if (!interp.convertToPattern(argv[i], loc, patterns[i]))
+      return interp.makeError();
+  }
+  NodeListObj *nl = new (interp) DescendantsNodeListObj(context.currentNode);
+  ELObjDynamicRoot protect(interp, nl);
+  nl = new (interp) SelectElementsNodeListObj(nl, patterns);
+  protect = nl;
+  NodePtr nd(nl->nodeListFirst(context, interp));
+  if (!nd)
+    return new (interp) EmptySosofoObj;
+  return new (interp) ProcessNodeSosofoObj(nd, context.processingMode);
+}
+
+DEFPRIMITIVE(ProcessMatchingChildren, argc, argv, context, interp, loc)
+{
+  if (!context.processingMode) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::noCurrentProcessingMode);
+    return interp.makeError();
+  }
+  if (!context.currentNode)
+    return noCurrentNodeError(interp, loc);
+  NCVector<Pattern> patterns(argc);
+  for (size_t i = 0; i < argc; i++) {
+    if (!interp.convertToPattern(argv[i], loc, patterns[i])) 
+      return interp.makeError();
+  }
+  NodeListPtr nlPtr;
+  // FIXME handle root
+  if (patterns.size() == 0 || context.currentNode->children(nlPtr) != accessOK)
+    return new (interp) EmptySosofoObj;
+  NodeListObj *nl = new (interp) NodeListPtrNodeListObj(nlPtr);
+  ELObjDynamicRoot protect(interp, nl);
+  nl = new (interp) SelectElementsNodeListObj(nl, patterns);
+  protect = nl;
+  return new (interp) ProcessNodeListSosofoObj(nl, context.processingMode);
+}
+
+DEFPRIMITIVE(SelectElements, argc, argv, context, interp, loc)
+{
+  NodeListObj *nl = argv[0]->asNodeList();
+  if (!nl)
+    return argError(interp, loc,
+                   InterpreterMessages::notANodeList, 0, argv[0]);
+  NCVector<Pattern> patterns(1);
+  if (!interp.convertToPattern(argv[1], loc, patterns[0]))
+    return interp.makeError();
+  return new (interp) SelectElementsNodeListObj(nl, patterns);
+}
+
+DEFPRIMITIVE(IsMatchElement, argc, argv, context, interp, loc)
+{
+  Pattern pattern;
+  if (!interp.convertToPattern(argv[0], loc, pattern))
+    return interp.makeError();
+  NodePtr node;
+  if (!argv[1]->optSingletonNodeList(context, interp, node) || !node)
+    return argError(interp, loc,
+                   InterpreterMessages::notASingletonNode, 1, argv[1]);
+  if (pattern.matches(node, interp))
+    return interp.makeTrue();
+  return interp.makeFalse();
+}
+
+DEFPRIMITIVE(ProcessNodeList, argc, argv, context, interp, loc)
+{
+  if (!context.processingMode) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::noCurrentProcessingMode);
+    return interp.makeError();
+  }
+  NodeListObj *nl = argv[0]->asNodeList();
+  if (!nl)
+    return argError(interp, loc,
+                   InterpreterMessages::notANodeList, 0, argv[0]);
+  return new (interp) ProcessNodeListSosofoObj(nl, context.processingMode);
+}
+
+static
+void reverse(StringC &s)
+{
+  size_t i = 0;
+  size_t j = s.size() - 1;
+  while (i < j) {
+    Char tem = s[i];
+    s[i] = s[j];
+    s[j] = tem;
+    i++;
+    j--;
+  }
+}
+
+static
+StringC formatNumberLetter(long n, const char *letters)
+{
+  StringC result;
+  if (n == 0)
+    result += '0';
+  else {
+    bool neg;
+    // FIXME possibility of overflow
+    if (n < 0) {
+      n = -n;
+      neg = 1;
+    }
+    else
+      neg = 0;
+    do {
+      n--;
+      int r = n % 26;
+      n -= r;
+      n /= 26;
+      result += letters[r];
+    } while (n > 0);
+    if (neg)
+      result += '-';
+    reverse(result);
+  }
+  return result;
+}
+
+static
+StringC formatNumberDecimal(long n, size_t minWidth)
+{
+  StringC result;
+  char buf[32];
+  sprintf(buf, "%ld", n);
+  const char *p = buf;
+  if (*p == '-') {
+    p++;
+    result += '-';
+  }
+  size_t len = strlen(p);
+  while (len < minWidth) {
+    result += '0';
+    len++;
+  }
+  while (*p)
+    result += *p++;
+  return result;
+}
+
+static
+StringC formatNumberRoman(long n, const char *letters)
+{
+  StringC result;
+  if (n > 5000 || n < -5000 || n == 0)
+    return formatNumberDecimal(n, 1);
+  if (n < 0) {
+    n = -n;
+    result += '-';
+  }
+  while (n >= 1000) {
+    result += letters[0];
+    n -= 1000;
+  }
+  for (int i = 100; i > 0; i /= 10, letters += 2) {
+    long q = n / i;
+    n -= q * i;
+    switch (q) {
+    case 1:
+      result += letters[2];
+      break;
+    case 2:
+      result += letters[2];
+      result += letters[2];
+      break;
+    case 3:
+      result += letters[2];
+      result += letters[2];
+      result += letters[2];
+      break;
+    case 4:
+      result += letters[2];
+      result += letters[1];
+      break;
+    case 5:
+      result += letters[1];
+      break;
+    case 6:
+      result += letters[1];
+      result += letters[2];
+      break;
+    case 7:
+      result += letters[1];
+      result += letters[2];
+      result += letters[2];
+      break;
+    case 8:
+      result += letters[1];
+      result += letters[2];
+      result += letters[2];
+      result += letters[2];
+      break;
+    case 9:
+      result += letters[2];
+      result += letters[0];
+      break;
+    }
+  }
+  return result;
+}
+
+static
+bool formatNumber(long n, const Char *s, size_t len, StringC &result)
+{
+  if (len > 0) {
+    switch (s[len - 1]) {
+    case 'a':
+      result += formatNumberLetter(n, "abcdefghijklmnopqrstuvwxyz");
+      return 1;
+    case 'A':
+      result += formatNumberLetter(n, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
+      return 1;
+    case 'i':
+      result += formatNumberRoman(n, "mdclxvi");
+      return 1;
+    case 'I':
+      result += formatNumberRoman(n, "MDCLXVI");
+      return 1;
+    case '1':
+      result += formatNumberDecimal(n, len);
+      return 1;
+    default:
+      break;
+    }
+  }
+  result += formatNumberDecimal(n, 1);
+  return 0;
+}
+
+DEFPRIMITIVE(FormatNumber, argc, argv, context, interp, loc)
+{
+  long n;
+  if (!argv[0]->exactIntegerValue(n))
+    return argError(interp, loc,
+                   InterpreterMessages::notAnExactInteger, 0, argv[0]);
+  const Char *s;
+  size_t len;
+  if (!argv[1]->stringData(s, len))
+    return argError(interp, loc, InterpreterMessages::notAString, 1, argv[1]);
+  StringObj *result = new (interp) StringObj;
+  if (!formatNumber(n, s, len, *result)) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::invalidNumberFormat,
+                   StringMessageArg(StringC(s, len)));
+  }
+  return result;
+}
+
+DEFPRIMITIVE(FormatNumberList, argc, argv, context, interp, loc)
+{
+  ELObj *numbers = argv[0];
+  ELObj *formats = argv[1];
+  ELObj *seps = argv[2];
+  StringObj *result = new (interp) StringObj;
+  while (!numbers->isNil()) {
+    PairObj *tem;
+    const Char *s;
+    size_t len;
+    if (numbers != argv[0]) {
+      if (!seps->stringData(s, len)) {
+       tem = seps->asPair();
+       if (!tem)
+         return argError(interp, loc,
+                         InterpreterMessages::notAList, 2, argv[2]);
+       if (!tem->car()->stringData(s, len))
+         return argError(interp, loc,
+                         InterpreterMessages::notAString, 2, tem->car());
+       seps = tem->cdr();
+      }
+      result->append(s, len);
+    }
+    tem = numbers->asPair();
+    if (!tem)
+      return argError(interp, loc,
+                     InterpreterMessages::notAList, 0, argv[0]);
+    long k;
+    if (!tem->car()->exactIntegerValue(k))
+      // FIXME message not quite right
+      return argError(interp, loc,
+                     InterpreterMessages::notAnExactInteger, 0, tem->car());
+    numbers = tem->cdr();
+    if (!formats->stringData(s, len)) {
+      tem = formats->asPair();
+      if (!tem)
+       return argError(interp, loc,
+                       InterpreterMessages::notAList, 1, argv[1]);
+      if (!tem->car()->stringData(s, len))
+        return argError(interp, loc,
+                       InterpreterMessages::notAString, 0, tem->car());
+      formats = tem->cdr();
+    }
+    if (!formatNumber(k, s, len, *result)) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::invalidNumberFormat,
+                    StringMessageArg(StringC(s, len)));
+    }
+  }
+  return result;
+}
+
+DEFPRIMITIVE(ExternalProcedure, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  StringC tem(s, n);
+  FunctionObj *func = interp.lookupExternalProc(tem);
+  if (func)
+    return func;
+  return interp.makeFalse();
+}
+
+DEFPRIMITIVE(Error, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  interp.setNextLocation(loc);
+  interp.message(InterpreterMessages::errorProc,
+                StringMessageArg(StringC(s, n)));
+  return interp.makeError();
+}
+
+DEFPRIMITIVE(StringToNumber, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  long radix;
+  if (argc > 1) {
+    if (!argv[1]->exactIntegerValue(radix))
+      return argError(interp, loc,
+                     InterpreterMessages::notAnExactInteger, 1, argv[1]);
+    switch (radix) {
+    case 2:
+    case 8:
+    case 10:
+    case 16:
+      break;
+    default:
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::invalidRadix);
+      radix = 10;
+      break;
+    }
+  }
+  else
+    radix = 10;
+  ELObj *result = interp.convertNumber(StringC(s, n), int(radix));
+  if (result) {
+    result = result->resolveQuantities(0, interp, loc);
+    if (interp.isError(result))
+      return result;
+    long n;
+    double d;
+    int dim;
+    if (result->quantityValue(n, d, dim) != ELObj::noQuantity)
+      return result;
+  }
+  return interp.makeFalse();
+}
+
+DEFPRIMITIVE(NumberToString, argc, argv, context, interp, loc)
+{
+  double x;
+  if (!argv[0]->realValue(x))
+    return argError(interp, loc,
+                   InterpreterMessages::notANumber, 0, argv[0]);
+  unsigned radix;
+  if (argc > 1) {
+    long r;
+    if (!argv[1]->exactIntegerValue(r))
+      return argError(interp, loc,
+                     InterpreterMessages::notAnExactInteger, 1, argv[1]);
+    switch (r) {
+    case 2:
+    case 8:
+    case 10:
+    case 16:
+      radix = unsigned(r);
+      break;
+    default:
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::invalidRadix);
+      radix = 10;
+      break;
+    }
+  }
+  else
+    radix = 10;
+  StrOutputCharStream os;
+  argv[0]->print(interp, os, radix);
+  StringC tem;
+  os.extractString(tem);
+  return new (interp) StringObj(tem);
+}
+
+DEFPRIMITIVE(QuantityToString, argc, argv, context, interp, loc)
+{
+  long lResult;
+  double dResult;
+  int dim;
+  if (argv[0]->quantityValue(lResult, dResult, dim) == ELObj::noQuantity)
+    return argError(interp, loc,
+                   InterpreterMessages::notAQuantity, 0, argv[0]);
+  unsigned radix;
+  if (argc > 1) {
+    long r;
+    if (!argv[1]->exactIntegerValue(r))
+      return argError(interp, loc,
+                     InterpreterMessages::notAnExactInteger, 1, argv[1]);
+    switch (r) {
+    case 2:
+    case 8:
+    case 10:
+    case 16:
+      radix = unsigned(r);
+      break;
+    default:
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::invalidRadix);
+      radix = 10;
+      break;
+    }
+  }
+  else
+    radix = 10;
+  StrOutputCharStream os;
+  argv[0]->print(interp, os, radix);
+  StringC tem;
+  os.extractString(tem);
+  return new (interp) StringObj(tem);
+}
+
+DEFPRIMITIVE(DisplaySize, argc, argv, context, interp, loc)
+{
+  return new (interp) LengthSpecObj(LengthSpec(LengthSpec::displaySize, 1.0));
+}
+
+DEFPRIMITIVE(TableUnit, argc, argv, context, interp, loc)
+{
+  long k;
+  if (!argv[0]->exactIntegerValue(k))
+    return argError(interp, loc,
+                   InterpreterMessages::notAnExactInteger, 0, argv[0]);
+
+  return new (interp) LengthSpecObj(LengthSpec(LengthSpec::tableUnit, double(k)));
+}
+
+DEFPRIMITIVE(IsDisplaySpace, argc, argv, context, interp, loc)
+{
+  if (argv[0]->asDisplaySpace())
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+
+DEFPRIMITIVE(DisplaySpace, argc, argv, context, interp, loc)
+{
+  FOTBuilder::DisplaySpace displaySpace;
+  if (!interp.convertLengthSpec(argv[0], displaySpace.nominal))
+    return argError(interp, loc,
+                   InterpreterMessages::notALengthSpec, 0, argv[0]);
+  displaySpace.min = displaySpace.nominal;
+  displaySpace.max = displaySpace.nominal;
+  // first specified keyword argument takes priority,
+  // so scan them backwards...
+  for (int i = argc - 1; i > 0; i -= 2) {
+    if ((argc & 1) == 0) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::oddKeyArgs);
+      return interp.makeError();
+    }
+    KeywordObj *keyObj = argv[i - 1]->asKeyword();
+    if (!keyObj) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::keyArgsNotKey);
+      return interp.makeError();
+    }
+    Identifier::SyntacticKey key;
+    if (!keyObj->identifier()->syntacticKey(key)) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::invalidKeyArg,
+                    StringMessageArg(keyObj->identifier()->name()));
+      return interp.makeError();
+    }
+    else {
+      switch (key) {
+      case Identifier::keyMin:
+       if (!interp.convertLengthSpec(argv[i], displaySpace.min))
+         return argError(interp, loc,
+                         InterpreterMessages::notALengthSpec, i, argv[i]);
+       break;
+      case Identifier::keyMax:
+       if (!interp.convertLengthSpec(argv[i], displaySpace.max))
+         return argError(interp, loc,
+                         InterpreterMessages::notALengthSpec, i, argv[i]);
+       break;
+      case Identifier::keyIsConditional:
+       if (argv[i] == interp.makeTrue())
+         displaySpace.conditional = 1;
+       else if (argv[i] == interp.makeFalse())
+         displaySpace.conditional = 0;
+       else
+         return argError(interp, loc,
+                         InterpreterMessages::notABoolean, i, argv[i]);
+       break;
+      case Identifier::keyPriority:
+       if (argv[i]->exactIntegerValue(displaySpace.priority))
+         displaySpace.force = 0;
+       else {
+         SymbolObj *sym = argv[i]->asSymbol();
+         if (sym && sym->cValue() == FOTBuilder::symbolForce)
+           displaySpace.force = 1;
+         else
+           return argError(interp, loc,
+                           InterpreterMessages::notAPriority, i, argv[i]);
+       }
+       break;
+      default:
+       interp.setNextLocation(loc);
+       interp.message(InterpreterMessages::invalidKeyArg,
+                      StringMessageArg(keyObj->identifier()->name()));
+       return interp.makeError();
+      }
+    }
+  }
+  return new (interp) DisplaySpaceObj(displaySpace);
+}
+
+DEFPRIMITIVE(IsInlineSpace, argc, argv, context, interp, loc)
+{
+  if (argv[0]->asInlineSpace())
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(InlineSpace, argc, argv, context, interp, loc)
+{
+  FOTBuilder::InlineSpace inlineSpace;
+  if (!interp.convertLengthSpec(argv[0], inlineSpace.nominal))
+    return argError(interp, loc,
+                   InterpreterMessages::notALengthSpec, 0, argv[0]);
+  inlineSpace.min = inlineSpace.nominal;
+  inlineSpace.max = inlineSpace.nominal;
+  // first specified keyword argument takes priority,
+  // so scan them backwards...
+  for (int i = argc - 1; i > 0; i -= 2) {
+    if ((argc & 1) == 0) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::oddKeyArgs);
+      return interp.makeError();
+    }
+    KeywordObj *keyObj = argv[i - 1]->asKeyword();
+    if (!keyObj) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::keyArgsNotKey);
+      return interp.makeError();
+    }
+    Identifier::SyntacticKey key;
+    if (!keyObj->identifier()->syntacticKey(key)) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::invalidKeyArg,
+                    StringMessageArg(keyObj->identifier()->name()));
+      return interp.makeError();
+    }
+    else {
+      switch (key) {
+      case Identifier::keyMin:
+       if (!interp.convertLengthSpec(argv[i], inlineSpace.min))
+         return argError(interp, loc,
+                         InterpreterMessages::notALengthSpec, i, argv[i]);
+       break;
+      case Identifier::keyMax:
+       if (!interp.convertLengthSpec(argv[i], inlineSpace.max))
+         return argError(interp, loc,
+                         InterpreterMessages::notALengthSpec, i, argv[i]);
+       break;
+      default:
+       interp.setNextLocation(loc);
+       interp.message(InterpreterMessages::invalidKeyArg,
+                      StringMessageArg(keyObj->identifier()->name()));
+       return interp.makeError();
+      }
+    }
+  }
+  return new (interp) InlineSpaceObj(inlineSpace);
+  return argv[0];
+}
+
+DEFPRIMITIVE(IsColor, argc, argv, context, interp, loc)
+{
+  if (argv[0]->asColor())
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(IsColorSpace, argc, argv, context, interp, loc)
+{
+  if (argv[0]->asColorSpace())
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+static
+bool decodeKeyArgs(int argc, ELObj **argv, const Identifier::SyntacticKey *keys,
+                  int nKeys, Interpreter &interp, const Location &loc, int *pos); 
+
+// return 1 if obj is a list of numbers of length len.
+static 
+bool decodeNumVector(double *res, int len, ELObj *obj)
+{
+  ELObj *e = obj;
+  PairObj *p; 
+  for (int i = 0; i < len; i++) { 
+    p = e->asPair(); 
+    if (!p || !p->car()->realValue(res[i]))
+      return 0;
+    e = p->cdr();
+  }
+  return 1;
+}
+
+static 
+bool decodeFuncVector(FunctionObj **res, int len, ELObj *obj)
+{
+  ELObj *e = obj;
+  PairObj *p; 
+  for (int i = 0; i < len; i++) { 
+    p = e->asPair(); 
+    if (!p || !(res[i] = p->car()->asFunction())) 
+      return 0;
+    e = p->cdr();
+  }
+  return 1;
+}
+
+DEFPRIMITIVE(ColorSpace, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+     return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  StringC str(s, (n < 43) ? n : 43);
+  if (str == interp.makeStringC("ISO/IEC 10179:1996//Color-Space Family::Dev")) { 
+    str.assign(s + 40, n - 40);
+    ELObj *res;
+    if (str == interp.makeStringC("Device RGB")) 
+      res = new (interp) DeviceRGBColorSpaceObj;
+    else if (str == interp.makeStringC("Device Gray")) 
+      res = new (interp) DeviceGrayColorSpaceObj;
+    else if (str == interp.makeStringC("Device CMYK")) 
+      res = new (interp) DeviceCMYKColorSpaceObj;
+    else if (str == interp.makeStringC("Device KX")) 
+      res = new (interp) DeviceKXColorSpaceObj;
+    else {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::unknownColorSpaceFamily,
+                     StringMessageArg(StringC(s, n)));
+      return interp.makeError();
+    }
+    if (argc > 1) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::colorSpaceNoArgs,
+                     StringMessageArg(str));
+    }
+    return res;
+  }
+  else if (str == interp.makeStringC("ISO/IEC 10179:1996//Color-Space Family::CIE")) { 
+    str.assign(s + 40, n - 40);
+    if (   str == interp.makeStringC("CIE LUV") 
+        || str == interp.makeStringC("CIE LAB")
+        || str == interp.makeStringC("CIE Based ABC")
+        || str == interp.makeStringC("CIE Based A")) { 
+      static const Identifier::SyntacticKey keys[12] = {
+        Identifier::keyWhitePoint, 
+        Identifier::keyBlackPoint, 
+        Identifier::keyRange,
+        Identifier::keyRangeAbc,
+        Identifier::keyRangeLmn,
+        Identifier::keyRangeA,
+        Identifier::keyMatrixAbc,
+        Identifier::keyMatrixLmn,
+        Identifier::keyMatrixA,
+        Identifier::keyDecodeAbc,
+        Identifier::keyDecodeLmn,
+        Identifier::keyDecodeA
+      };
+      int pos[12];
+      // FIXME messages
+      double wp[3], bp[3], range[6];
+      double rangeAbc[6], rangeLmn[6], rangeA[2];
+      double matrixAbc[9], matrixLmn[9], matrixA[3];
+      FunctionObj *decodeAbc[3], *decodeLmn[3], *decodeA;
+      if (!decodeKeyArgs(argc - 1, argv + 1, keys, 12, interp, loc, pos)
+          || (pos[0] < 0)  
+          || (pos[0] >= 0 && !decodeNumVector(wp, 3, argv[pos[0] + 1])) 
+          || (pos[1] >= 0 && !decodeNumVector(bp, 3, argv[pos[1] + 1]))
+          || (pos[2] >= 0 && !decodeNumVector(range, 6, argv[pos[2] + 1])) 
+          || (pos[3] >= 0 && !decodeNumVector(rangeAbc, 6, argv[pos[3] + 1]))
+          || (pos[4] >= 0 && !decodeNumVector(rangeLmn, 6, argv[pos[4] + 1]))
+          || (pos[5] >= 0 && !decodeNumVector(rangeA, 2, argv[pos[5] + 1]))
+          || (pos[6] >= 0 && !decodeNumVector(matrixAbc, 9, argv[pos[6] + 1]))
+          || (pos[7] >= 0 && !decodeNumVector(matrixLmn, 9, argv[pos[7] + 1]))
+          || (pos[8] >= 0 && !decodeNumVector(matrixA, 3, argv[pos[8] + 1]))
+          || (pos[9] >= 0 && !decodeFuncVector(decodeAbc, 3, argv[pos[9] + 1]))
+          || (pos[10] >= 0 && !decodeFuncVector(decodeLmn, 3, argv[pos[10] + 1]))
+          || (pos[11] >= 0 && !(decodeA = argv[pos[11] + 1]->asFunction()))) {
+        interp.setNextLocation(loc);
+        interp.message(InterpreterMessages::colorSpaceArgError,
+                       StringMessageArg(str));
+        return interp.makeError();
+      }
+      if (   str == interp.makeStringC("CIE LUV")
+          || str == interp.makeStringC("CIE LAB")) {
+        for (int i = 3; i < 12; i++)
+          if (pos[i] >= 0) {
+            interp.setNextLocation(loc);
+            interp.message(InterpreterMessages::colorSpaceArgError,
+                           StringMessageArg(str));
+            return interp.makeError();
+          }
+        if (str == interp.makeStringC("CIE LUV"))
+          return new (interp) CIELUVColorSpaceObj(wp, (pos[1] >= 0) ? bp : 0, 
+                                                  (pos[2] >= 0) ? range : 0);
+        else 
+          return new (interp) CIELABColorSpaceObj(wp, (pos[1] >= 0) ? bp : 0, 
+                                                  (pos[2] >= 0) ? range : 0);
+      } 
+      else if (str == interp.makeStringC("CIE Based ABC")) {
+        if (pos[2] >= 0 || pos[5] >= 0 || pos[8] >= 0 || pos[11] >= 0) {
+          interp.setNextLocation(loc);
+          interp.message(InterpreterMessages::colorSpaceArgError,
+                         StringMessageArg(str));
+          return interp.makeError();
+        }
+        return new (interp) CIEABCColorSpaceObj(wp, 
+            (pos[1] >= 0) ? bp : 0, 
+            (pos[3] >= 0) ? rangeAbc : 0,
+            (pos[9] >= 0) ? decodeAbc : 0,
+            (pos[6] >= 0) ? matrixAbc : 0,
+            (pos[4] >= 0) ? rangeLmn : 0,
+            (pos[10] >= 0) ? decodeLmn : 0,
+            (pos[7] >= 0) ? matrixLmn : 0);
+      }
+      else { // CIE Based A
+        if (pos[2] >= 0 || pos[3] >= 0 || pos[6] >= 0 || pos[9] >= 0) {
+          interp.setNextLocation(loc);
+          interp.message(InterpreterMessages::colorSpaceArgError,
+                         StringMessageArg(str));
+          return interp.makeError();
+        }
+        return new (interp) CIEAColorSpaceObj(wp, 
+            (pos[1] >= 0) ? bp : 0, 
+            (pos[5] >= 0) ? rangeA : 0,
+            (pos[11] >= 0) ? decodeA : 0,
+            (pos[8] >= 0) ? matrixA : 0,
+            (pos[4] >= 0) ? rangeLmn : 0,
+            (pos[10] >= 0) ? decodeLmn : 0,
+            (pos[7] >= 0) ? matrixLmn : 0);
+      }
+    }
+  } 
+  interp.setNextLocation(loc);
+  interp.message(InterpreterMessages::unknownColorSpaceFamily,
+                 StringMessageArg(StringC(s, n)));
+  return interp.makeError();
+}
+
+DEFPRIMITIVE(Color, argc, argv, context, interp, loc)
+{
+  ColorSpaceObj *colorSpace = argv[0]->asColorSpace();
+  if (!colorSpace)
+    return argError(interp, loc,
+                   InterpreterMessages::notAColorSpace, 0, argv[0]);
+  return colorSpace->makeColor(argc - 1, argv + 1, interp, loc);
+ }
+
+DEFPRIMITIVE(IsAddress, argc, argv, context, interp, loc)
+{
+  if (argv[0]->asAddress())
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(IsAddressLocal, argc, argv, context, interp, loc)
+{
+  AddressObj *address = argv[0]->asAddress();
+  if (!address)
+    return argError(interp, loc,
+                   InterpreterMessages::notAnAddress, 0, argv[0]);
+  if (!context.currentNode)
+    return noCurrentNodeError(interp, loc);
+  switch (address->address().type) {
+  case FOTBuilder::Address::resolvedNode:
+    if (address->address().node->sameGrove(*context.currentNode))
+      return interp.makeTrue();
+    else
+      return interp.makeFalse();
+  case FOTBuilder::Address::idref:
+    return interp.makeTrue();
+  case FOTBuilder::Address::entity:
+    return interp.makeFalse();
+  default:
+    break;
+  }
+  return interp.makeFalse();
+}
+
+DEFPRIMITIVE(IsAddressVisited, argc, argv, context, interp, loc)
+{
+  AddressObj *address = argv[0]->asAddress();
+  if (!address)
+    return argError(interp, loc,
+                   InterpreterMessages::notAnAddress, 0, argv[0]);
+  // FIXME
+  return interp.makeFalse();
+}
+
+DEFPRIMITIVE(CurrentNodeAddress, argc, argv, context, interp, loc)
+{
+  if (!context.currentNode)
+    return noCurrentNodeError(interp, loc);
+  return new (interp) AddressObj(FOTBuilder::Address::resolvedNode, context.currentNode);
+}
+
+DEFPRIMITIVE(HytimeLinkend, argc, argv, context, interp, loc)
+{
+  if (!context.currentNode)
+    return noCurrentNodeError(interp, loc);
+  return new (interp) AddressObj(FOTBuilder::Address::hytimeLinkend, context.currentNode);
+}
+
+DEFPRIMITIVE(SgmlDocumentAddress, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  StringC sysid(s, n);
+  if (!argv[1]->stringData(s, n))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 1, argv[1]);
+  return new (interp) AddressObj(FOTBuilder::Address::sgmlDocument, NodePtr(), sysid, StringC(s, n));
+}
+
+DEFPRIMITIVE(IdrefAddress, argc, argv, context, interp, loc)
+{
+  // The advantage of doing this rather than using an NodeAddressObj,
+  // is that when it's a forward reference we don't have to
+  // wait for the node.  It might be cleaner to use a ProxyNode class
+  // for this.
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  if (!context.currentNode)
+    return noCurrentNodeError(interp, loc);
+  return new (interp) AddressObj(FOTBuilder::Address::idref, context.currentNode, StringC(s, n));
+}
+
+DEFPRIMITIVE(EntityAddress, argc, argv, context, interp, loc)
+{
+  // Note that multiple space separated entity names are allowed;
+  // currently Address doesn't support multiple nodes, so we can't resolve here.
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  if (!context.currentNode)
+    return noCurrentNodeError(interp, loc);
+  return new (interp) AddressObj(FOTBuilder::Address::entity, context.currentNode, StringC(s, n));
+}
+
+DEFPRIMITIVE(NodeListAddress, argc, argv, context, interp, loc)
+{
+  NodePtr node;
+  if (!argv[0]->optSingletonNodeList(context, interp, node) || !node)
+    return argError(interp, loc,
+                   InterpreterMessages::notASingletonNode, 0, argv[0]);
+  return new (interp) AddressObj(FOTBuilder::Address::resolvedNode, node);
+}
+
+DEFPRIMITIVE(CharScriptCase, argc, argv, context, interp, loc)
+{
+  if (!context.styleStack) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::notInCharacteristicValue);
+    return interp.makeError();
+  }
+  for (size_t i = 0; i < argc; i += 2) {
+    const Char *s;
+    size_t n;
+    if (!argv[i]->stringData(s, n))
+      return argError(interp, loc,
+                     InterpreterMessages::notAString, i, argv[i]);
+  }
+  // FIXME
+  return argv[argc - 1];
+}
+
+DEFPRIMITIVE(IsGlyphId, argc, argv, context, interp, loc)
+{
+  if (argv[0]->glyphId())
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(GlyphId, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  return interp.convertGlyphId(s, n, loc);
+}
+
+DEFPRIMITIVE(IsGlyphSubstTable, argc, argv, context, interp, loc)
+{
+  if (argv[0]->asGlyphSubstTable())
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(GlyphSubstTable, argc, argv, context, interp, loc)
+{
+  ELObj *p = argv[0];
+  Ptr<FOTBuilder::GlyphSubstTable> table = new FOTBuilder::GlyphSubstTable;
+  table->uniqueId = interp.allocGlyphSubstTableUniqueId();
+  while (!p->isNil()) {
+    PairObj *tem = p->asPair();
+    if (!tem)
+      return argError(interp, loc,
+                     InterpreterMessages::notAGlyphIdPairList, 0, argv[0]);
+    p = tem->cdr();
+    tem = tem->car()->asPair();
+    const FOTBuilder::GlyphId *g1, *g2;      
+    if (!tem
+        || (g1 = tem->car()->glyphId()) == 0
+       || (g2 = tem->cdr()->glyphId()) == 0)
+      return argError(interp, loc,
+                     InterpreterMessages::notAGlyphIdPairList, 0, argv[0]);
+    table->pairs.push_back(*g1);
+    table->pairs.push_back(*g2);
+  }
+  return new (interp) GlyphSubstTableObj(table);
+}
+
+DEFPRIMITIVE(GlyphSubst, argc, argv, context, interp, loc)
+{
+  GlyphSubstTableObj *table = argv[0]->asGlyphSubstTable();
+  if (!table)
+    return argError(interp, loc,
+                   InterpreterMessages::notAGlyphSubstTable, 0, argv[0]);
+  const FOTBuilder::GlyphId *glyphId = argv[1]->glyphId();
+  if (!glyphId)
+    return argError(interp, loc,
+                   InterpreterMessages::notAGlyphId, 1, argv[1]);
+  return new (interp) GlyphIdObj(table->glyphSubstTable()->subst(*glyphId));
+}
+
+// Core query language
+
+DEFPRIMITIVE(CurrentNode, argc, argv, context, interp, loc)
+{
+  if (!context.currentNode)
+    return noCurrentNodeError(interp, loc);
+  return new (interp) NodePtrNodeListObj(context.currentNode);
+}
+
+DEFPRIMITIVE(NodeListError, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  if (!argv[1]->asNodeList())
+    return argError(interp, loc,
+                   InterpreterMessages::notANodeList, 1, argv[1]);
+  NodePtr nd;
+  const LocNode *lnp;
+  Location nodeLoc;
+  if (argv[1]->optSingletonNodeList(context, interp, nd)
+      && (lnp = LocNode::convert(nd)) != 0
+      && lnp->getLocation(nodeLoc) == accessOK)
+    interp.setNextLocation(nodeLoc);
+  else
+    interp.setNextLocation(loc);
+  interp.message(InterpreterMessages::errorProc,
+                StringMessageArg(StringC(s, n)));
+  return interp.makeError();
+}
+
+DEFPRIMITIVE(IsNodeListEmpty, argc, argv, context, interp, loc)
+{
+  NodeListObj *nl = argv[0]->asNodeList();
+  if (!nl)
+    return argError(interp, loc,
+                   InterpreterMessages::notANodeList, 0, argv[0]);
+  if (nl->nodeListFirst(context, interp))
+    return interp.makeFalse();
+  else
+    return interp.makeTrue();
+}
+
+DEFPRIMITIVE(IsNodeList, argc, argv, context, interp, loc)
+{
+  if (argv[0]->asNodeList())
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(Parent, argc, argv, context, interp, loc)
+{
+  NodePtr node;
+  if (argc > 0) {
+    if (!argv[0]->optSingletonNodeList(context, interp, node))
+      return argError(interp, loc,
+                     InterpreterMessages::notAnOptSingletonNode, 0, argv[0]);
+    if (!node)
+      return argv[0];
+  }
+  else {
+    node = context.currentNode;
+    if (!node)
+      return noCurrentNodeError(interp, loc);
+  }
+  if (node->getParent(node) != accessOK)
+    return interp.makeEmptyNodeList();
+  return new (interp) NodePtrNodeListObj(node);
+}
+
+static
+bool convertGeneralName(ELObj *obj, const NodePtr &node, StringC &result)
+{
+  const Char *s;
+  size_t n;
+  if (!obj->stringData(s, n))
+    return 0;
+  result.assign(s, n);
+  NodePtr root;
+  node->getGroveRoot(root);
+  NamedNodeListPtr elements;
+  root->getElements(elements);
+  result.resize(elements->normalize(result.begin(), result.size()));
+  return 1;
+}
+
+DEFPRIMITIVE(Ancestor, argc, argv, context, interp, loc)
+{
+  NodePtr node;
+  if (argc > 1) {
+    if (!argv[1]->optSingletonNodeList(context, interp, node) || !node)
+      return argError(interp, loc,
+                     InterpreterMessages::notASingletonNode, 1, argv[1]);
+  }
+  else {
+    node = context.currentNode;
+    if (!node)
+      return noCurrentNodeError(interp, loc);
+  }
+  StringC gi;
+  if (!convertGeneralName(argv[0], node, gi))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  while (node->getParent(node) == accessOK) {
+    GroveString str;
+    if (node->getGi(str) == accessOK && str == GroveString(gi.data(), gi.size()))
+      return new (interp) NodePtrNodeListObj(node);
+  }
+  return interp.makeEmptyNodeList();
+}
+
+DEFPRIMITIVE(Gi, argc, argv, context, interp, loc)
+{
+  NodePtr node;
+  if (argc > 0) {
+    if (!argv[0]->optSingletonNodeList(context, interp, node))
+      return argError(interp, loc,
+                     InterpreterMessages::notAnOptSingletonNode, 0, argv[0]);
+  }
+  else {
+    if (!context.currentNode)
+      return noCurrentNodeError(interp, loc);
+    node = context.currentNode;
+  }
+  GroveString str;
+  if (node && node->getGi(str) == accessOK)
+    return new (interp) StringObj(str.data(), str.size());
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(FirstChildGi, argc, argv, context, interp, loc)
+{
+  NodePtr node;
+  if (argc > 0) {
+    if (!argv[0]->optSingletonNodeList(context, interp, node))
+      return argError(interp, loc,
+                     InterpreterMessages::notAnOptSingletonNode, 0, argv[0]);
+    if (!node)
+      return interp.makeFalse();
+  }
+  else {
+    if (!context.currentNode)
+      return noCurrentNodeError(interp, loc);
+    node = context.currentNode;
+  }
+  if (node.assignFirstChild() != accessOK)
+    return interp.makeFalse();
+  for (;;) {
+    GroveString str;
+    if (node->getGi(str) == accessOK)
+      return new (interp) StringObj(str.data(), str.size());
+    if (node.assignNextChunkSibling() != accessOK)
+      break;
+  }
+  return interp.makeFalse();
+}
+
+DEFPRIMITIVE(Id, argc, argv, context, interp, loc)
+{
+  NodePtr node;
+  if (argc > 0) {
+    if (!argv[0]->optSingletonNodeList(context, interp, node))
+      return argError(interp, loc,
+                     InterpreterMessages::notAnOptSingletonNode, 0, argv[0]);
+  }
+  else {
+    if (!context.currentNode)
+      return noCurrentNodeError(interp, loc);
+    node = context.currentNode;
+  }
+  GroveString str;
+  if (node && node->getId(str) == accessOK)
+    return new (interp) StringObj(str.data(), str.size());
+  else
+    return interp.makeFalse();
+}
+
+static
+bool nodeAttributeString(const NodePtr &node, const Char *s, size_t n,
+                        const SdataMapper &mapper, StringC &value)
+{
+  NamedNodeListPtr atts;
+  if (node->getAttributes(atts) != accessOK)
+    return 0;
+  NodePtr att;
+  if (atts->namedNode(GroveString(s, n), att) != accessOK)
+    return 0;
+  bool implied;
+  if (att->getImplied(implied) == accessOK && implied)
+    return 0;
+  GroveString tokens;
+  if (att->tokens(tokens) == accessOK) {
+    value.assign(tokens.data(), tokens.size());
+    return 1;
+  }
+  NodePtr tem;
+  value.resize(0);
+  if (att->firstChild(tem) == accessOK) {
+    do {
+      GroveString chunk;
+      if (tem->charChunk(mapper, chunk) == accessOK)
+       value.append(chunk.data(), chunk.size());
+    } while (tem.assignNextChunkSibling() == accessOK);
+  }
+  return 1;
+}
+
+DEFPRIMITIVE(AttributeString, argc, argv, context, interp, loc)
+{
+  NodePtr node;
+  if (argc > 1) {
+    if (!argv[1]->optSingletonNodeList(context, interp, node))
+      return argError(interp, loc,
+                     InterpreterMessages::notAnOptSingletonNode, 1, argv[1]);
+    if (!node)
+      return interp.makeFalse();
+  }
+  else {
+    if (!context.currentNode)
+      return noCurrentNodeError(interp, loc);
+    node = context.currentNode;
+  }
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc, InterpreterMessages::notAString, 0, argv[0]);
+  StringC value;
+  if (nodeAttributeString(node, s, n, interp, value))
+    return new (interp) StringObj(value);
+  return interp.makeFalse();
+}
+
+DEFPRIMITIVE(InheritedAttributeString, argc, argv, context, interp, loc)
+{
+  NodePtr node;
+  if (argc > 1) {
+    if (!argv[1]->optSingletonNodeList(context, interp, node))
+      return argError(interp, loc,
+                     InterpreterMessages::notAnOptSingletonNode, 1, argv[1]);
+    if (!node)
+      return interp.makeFalse();
+  }
+  else {
+    if (!context.currentNode)
+      return noCurrentNodeError(interp, loc);
+    node = context.currentNode;
+  }
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc, InterpreterMessages::notAString, 0, argv[0]);
+  do {
+    StringC value;
+    if (nodeAttributeString(node, s, n, interp, value))
+      return new (interp) StringObj(value);
+  } while (node->getParent(node) == accessOK);
+  return interp.makeFalse();
+}
+
+DEFPRIMITIVE(InheritedElementAttributeString, argc, argv, context, interp, loc)
+{
+  NodePtr node;
+  if (argc > 2) {
+    if (!argv[2]->optSingletonNodeList(context, interp, node))
+      return argError(interp, loc,
+                     InterpreterMessages::notAnOptSingletonNode, 2, argv[2]);
+    if (!node)
+      return interp.makeFalse();
+  }
+  else {
+    if (!context.currentNode)
+      return noCurrentNodeError(interp, loc);
+    node = context.currentNode;
+  }
+  StringC gi;
+  if (!convertGeneralName(argv[0], node, gi))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  const Char *s;
+  size_t n;
+  if (!argv[1]->stringData(s, n))
+    return argError(interp, loc, InterpreterMessages::notAString, 1, argv[1]);
+  do {
+    GroveString nodeGi;
+    StringC value;
+    if (node->getGi(nodeGi) == accessOK
+        && nodeGi == GroveString(gi.data(), gi.size())
+       && nodeAttributeString(node, s, n, interp, value))
+      return new (interp) StringObj(value);
+  } while (node->getParent(node) == accessOK);
+  return interp.makeFalse();
+}
+
+DEFPRIMITIVE(IsFirstSibling, argc, argv, context, interp, loc)
+{
+  NodePtr nd;
+  if (argc > 0) {
+    if (!argv[0]->optSingletonNodeList(context, interp, nd) || !nd)
+      return argError(interp, loc,
+                     InterpreterMessages::notASingletonNode, 0, argv[0]);
+  }
+  else {
+    if (!context.currentNode)
+      return noCurrentNodeError(interp, loc);
+    nd = context.currentNode;
+  }
+  GroveString gi;
+  NodePtr p;
+  if (nd->firstSibling(p) != accessOK
+      || nd->getGi(gi) != accessOK)
+    return interp.makeFalse();
+  while (*p != *nd) {
+    GroveString tem;
+    if (p->getGi(tem) == accessOK && tem == gi)
+      return interp.makeFalse();
+    if (p.assignNextChunkSibling() != accessOK)
+      CANNOT_HAPPEN();
+  }
+  return interp.makeTrue();
+}
+
+DEFPRIMITIVE(IsAbsoluteFirstSibling, argc, argv, context, interp, loc)
+{
+  NodePtr nd;
+  if (argc > 0) {
+    if (!argv[0]->optSingletonNodeList(context, interp, nd) || !nd)
+      return argError(interp, loc,
+                     InterpreterMessages::notASingletonNode, 0, argv[0]);
+  }
+  else {
+    if (!context.currentNode)
+      return noCurrentNodeError(interp, loc);
+    nd = context.currentNode;
+  }
+  NodePtr p;
+  if (nd->firstSibling(p) != accessOK)
+    return interp.makeFalse();
+  while (*p != *nd) {
+    GroveString tem;
+    if (p->getGi(tem) == accessOK)
+      return interp.makeFalse();
+    if (p.assignNextChunkSibling() != accessOK)
+      CANNOT_HAPPEN();
+  }
+  return interp.makeTrue();
+}
+
+DEFPRIMITIVE(IsLastSibling, argc, argv, context, interp, loc)
+{
+  NodePtr nd;
+  if (argc > 0) {
+    if (!argv[0]->optSingletonNodeList(context, interp, nd) || !nd)
+      return argError(interp, loc,
+                     InterpreterMessages::notASingletonNode, 0, argv[0]);
+  }
+  else {
+    if (!context.currentNode)
+      return noCurrentNodeError(interp, loc);
+    nd = context.currentNode;
+  }
+  GroveString gi;
+  if (nd->getGi(gi) != accessOK)
+    return interp.makeFalse();
+  while (nd.assignNextChunkSibling() == accessOK) {
+    GroveString tem;
+    if (nd->getGi(tem) == accessOK && tem == gi)
+      return interp.makeFalse();
+  }
+  return interp.makeTrue();
+}
+
+DEFPRIMITIVE(IsAbsoluteLastSibling, argc, argv, context, interp, loc)
+{
+  NodePtr nd;
+  if (argc > 0) {
+    if (!argv[0]->optSingletonNodeList(context, interp, nd) || !nd)
+      return argError(interp, loc,
+                     InterpreterMessages::notASingletonNode, 0, argv[0]);
+  }
+  else {
+    if (!context.currentNode)
+      return noCurrentNodeError(interp, loc);
+    nd = context.currentNode;
+  }  while (nd.assignNextChunkSibling() == accessOK) {
+    GroveString tem;
+    if (nd->getGi(tem) == accessOK)
+      return interp.makeFalse();
+  }
+  return interp.makeTrue();
+}
+
+// Return 0 on error.
+
+bool matchAncestors(ELObj *obj, const NodePtr &node, ELObj *&unmatched)
+{
+  NodePtr parent;
+  if (node->getParent(parent) != accessOK) {
+    unmatched = obj;
+    return 1;
+  }
+  if (!matchAncestors(obj, parent, unmatched))
+    return 0;
+  if (!unmatched->isNil()) {
+    PairObj *pair = unmatched->asPair();
+    if (!pair)
+      return 0;
+    StringC gi;
+    if (!convertGeneralName(pair->car(), node, gi))
+      return 0;
+    GroveString tem;
+    if (parent->getGi(tem) == accessOK
+       && tem == GroveString(gi.data(), gi.size()))
+      unmatched = pair->cdr();
+  }
+  return 1;
+}
+
+DEFPRIMITIVE(IsHaveAncestor, argc, argv, context, interp, loc)
+{
+  NodePtr node;
+  if (argc > 1) {
+    if (!argv[1]->optSingletonNodeList(context, interp, node) || !node)
+      return argError(interp, loc,
+                     InterpreterMessages::notASingletonNode, 1, argv[1]);
+  }
+  else {
+    if (!context.currentNode)
+      return noCurrentNodeError(interp, loc);
+    node = context.currentNode;
+  }
+  StringC gi;
+  if (convertGeneralName(argv[0], node, gi)) {
+    while (node->getParent(node) == accessOK) {
+      GroveString tem;
+      if (node->getGi(tem) == accessOK && tem == GroveString(gi.data(), gi.size()))
+       return interp.makeTrue();
+    }
+    return interp.makeFalse();
+  }
+  ELObj *unmatched;
+  if (!matchAncestors(argv[0], node, unmatched))
+    return argError(interp, loc,
+                   InterpreterMessages::notAList, 0, argv[0]);
+  else if (unmatched->isNil())
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(ChildNumber, argc, argv, context, interp, loc)
+{
+  NodePtr node;
+  if (argc > 0) {
+    if (!argv[0]->optSingletonNodeList(context, interp, node) || !node)
+      return argError(interp, loc,
+                     InterpreterMessages::notASingletonNode, 0, argv[0]);
+  }
+  else {
+    if (!context.currentNode)
+      return noCurrentNodeError(interp, loc);
+    node = context.currentNode;
+  }
+  unsigned long num;
+  if (!interp.childNumber(node, num))
+    return interp.makeFalse();
+  return interp.makeInteger(num + 1);
+}
+
+DEFPRIMITIVE(AncestorChildNumber, argc, argv, context, interp, loc)
+{
+  NodePtr node;
+  if (argc > 1) {
+    if (!argv[1]->optSingletonNodeList(context, interp, node) || !node)
+      return argError(interp, loc,
+                     InterpreterMessages::notASingletonNode, 1, argv[1]);
+  }
+  else {
+    if (!context.currentNode)
+      return noCurrentNodeError(interp, loc);
+    node = context.currentNode;
+  }
+  StringC gi;
+  if (!convertGeneralName(argv[0], node, gi))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  while (node->getParent(node) == accessOK) {
+    GroveString str;
+    if (node->getGi(str) == accessOK
+        && str == GroveString(gi.data(), gi.size())) {
+      unsigned long num;
+      interp.childNumber(node, num);
+      return interp.makeInteger(num + 1);
+    }
+  }
+  return interp.makeFalse();
+}
+
+DEFPRIMITIVE(HierarchicalNumber, argc, argv, context, interp, loc)
+{
+  NodePtr node;
+  if (argc > 1) {
+    if (!argv[1]->optSingletonNodeList(context, interp, node) || !node)
+      return argError(interp, loc,
+                     InterpreterMessages::notASingletonNode, 1, argv[1]);
+  }
+  else {
+    if (!context.currentNode)
+      return noCurrentNodeError(interp, loc);
+    node = context.currentNode;
+  }
+  // Make a reversed copy of the list of GIs.
+  ELObjDynamicRoot list(interp, 0);
+  ELObj *p = argv[0];
+  while (!p->isNil()) {
+    PairObj *tem = p->asPair();
+    if (!tem)
+      return argError(interp, loc,
+                     InterpreterMessages::notAList, 0, argv[0]);
+    list = new (interp) PairObj(tem->car(), list);
+    p = tem->cdr();
+  }
+  p = list;
+  while (p) {
+    PairObj *pair = (PairObj *)p;
+    StringC gi;
+    // FIXME error message not quite right
+    if (!convertGeneralName(pair->car(), node, gi))
+      return argError(interp, loc,
+                     InterpreterMessages::notAString, 0, pair->car());
+    for (;;) {
+      // Replace the GI by its number.
+      if (node->getParent(node) != accessOK) {
+       pair->setCar(interp.makeInteger(0));
+       break;
+      }
+      GroveString str;
+      if (node->getGi(str) == accessOK
+          && str == GroveString(gi.data(), gi.size())) {
+       unsigned long num;
+       interp.childNumber(node, num);
+       pair->setCar(interp.makeInteger(num + 1));
+       break;
+      }
+    }
+    p = pair->cdr();
+  }
+  // Reverse the list of numbers in place.
+  p = list;
+  ELObj *result = interp.makeNil();
+  while (p) {
+    PairObj *tem = (PairObj *)p;
+    p = tem->cdr();
+    tem->setCdr(result);
+    result = tem;
+  }
+  return result;
+}
+
+DEFPRIMITIVE(HierarchicalNumberRecursive, argc, argv, context, interp, loc)
+{
+  NodePtr node;
+  if (argc > 1) {
+    if (!argv[1]->optSingletonNodeList(context, interp, node) || !node)
+      return argError(interp, loc,
+                     InterpreterMessages::notASingletonNode, 1, argv[1]);
+  }
+  else {
+    if (!context.currentNode)
+      return noCurrentNodeError(interp, loc);
+    node = context.currentNode;
+  }
+  StringC gi;
+  if (!convertGeneralName(argv[0], node, gi))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  ELObjDynamicRoot result(interp, interp.makeNil());
+  while (node->getParent(node) == accessOK) {
+    GroveString str;
+    if (node->getGi(str) == accessOK
+        && str == GroveString(gi.data(), gi.size())) {
+      unsigned long num;
+      interp.childNumber(node, num);
+      PairObj *pair = new (interp) PairObj(0, result);
+      result = pair;
+      pair->setCar(interp.makeInteger(num + 1));
+    }
+  }
+  return result;
+}
+
+DEFPRIMITIVE(ElementNumber, argc, argv, context, interp, loc)
+{
+  NodePtr node;
+  if (argc > 0) {
+    if (!argv[0]->optSingletonNodeList(context, interp, node) || !node)
+      return argError(interp, loc,
+                     InterpreterMessages::notASingletonNode, 0, argv[0]);
+  }
+  else {
+    if (!context.currentNode)
+      return noCurrentNodeError(interp, loc);
+    node = context.currentNode;
+  }
+  GroveString gi;
+  if (node->getGi(gi) != accessOK)
+    return interp.makeFalse();
+  StringC buf(gi.data(), gi.size());
+  unsigned long num = interp.elementNumber(node, buf);
+  return interp.makeInteger(num);
+}
+
+DEFPRIMITIVE(ElementNumberList, argc, argv, context, interp, loc)
+{
+  NodePtr node;
+  if (argc > 1) {
+    if (!argv[1]->optSingletonNodeList(context, interp, node) || !node)
+      return argError(interp, loc,
+                     InterpreterMessages::notASingletonNode, 1, argv[1]);
+  }
+  else {
+    if (!context.currentNode)
+      return noCurrentNodeError(interp, loc);
+    node = context.currentNode;
+  }
+  ELObjDynamicRoot list(interp, 0);
+  ELObj *p = argv[0];
+  while (!p->isNil()) {
+    PairObj *tem = p->asPair();
+    if (!tem)
+      return argError(interp, loc,
+                     InterpreterMessages::notAList, 0, argv[0]);
+    list = new (interp) PairObj(tem->car(), list);
+    p = tem->cdr();
+  }
+  ELObjDynamicRoot result(interp, interp.makeNil());
+  p = list;
+  if (p) {
+    PairObj *pair = (PairObj *)p;
+    StringC gi;
+    if (!convertGeneralName(pair->car(), node, gi))
+      return argError(interp, loc,
+                     InterpreterMessages::notAString, 0, pair->car());
+    p = pair->cdr();
+    while (p) {
+      pair = (PairObj *)p;
+      StringC numGi(gi);
+      if (!convertGeneralName(pair->car(), node, gi))
+        return argError(interp, loc,
+                       InterpreterMessages::notAString, 0, pair->car());
+      unsigned long num = interp.elementNumberAfter(node, numGi, gi);
+      PairObj *tem = new (interp) PairObj(0, result);
+      result = tem;
+      tem->setCar(interp.makeInteger(num));
+      p = pair->cdr();
+    }
+    unsigned long num = interp.elementNumber(node, gi);
+    PairObj *tem = new (interp) PairObj(0, result);
+    result = tem;
+    tem->setCar(interp.makeInteger(num));
+  }
+  return result;
+}
+
+DEFPRIMITIVE(EntityAttributeString, argc, argv, context, interp, loc)
+{
+  const Char *entityName;
+  size_t entityNameLen;
+  if (!argv[0]->stringData(entityName, entityNameLen))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  const Char *attName;
+  size_t attNameLen;
+  if (!argv[1]->stringData(attName, attNameLen))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 1, argv[1]);
+  NodePtr node;
+  if (argc > 2) {
+    if (!argv[2]->optSingletonNodeList(context, interp, node) || !node)
+      return argError(interp, loc,
+                     InterpreterMessages::notASingletonNode, 2, argv[2]);
+  }
+  else {
+    node = context.currentNode;
+    if (!node)
+      return noCurrentNodeError(interp, loc);
+  }
+  NamedNodeListPtr entities;
+  StringC value;
+  if (node->getGroveRoot(node) == accessOK
+      && node->getEntities(entities) == accessOK
+      && entities->namedNode(GroveString(entityName, entityNameLen), node) == accessOK
+      && nodeAttributeString(node, attName, attNameLen, interp, value))
+    return new (interp) StringObj(value);
+  return interp.makeFalse();
+}
+
+DEFPRIMITIVE(EntityGeneratedSystemId, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  NodePtr node;
+  if (argc > 1) {
+    if (!argv[1]->optSingletonNodeList(context, interp, node) || !node)
+      return argError(interp, loc,
+                     InterpreterMessages::notASingletonNode, 1, argv[1]);
+  }
+  else {
+    node = context.currentNode;
+    if (!node)
+      return noCurrentNodeError(interp, loc);
+  }
+  GroveString str;
+  NamedNodeListPtr entities;
+  if (node->getGroveRoot(node) == accessOK
+      && node->getEntities(entities) == accessOK
+      && entities->namedNode(GroveString(s, n), node) == accessOK
+      && node->getExternalId(node) == accessOK
+      && node->getGeneratedSystemId(str) == accessOK)
+    return new (interp) StringObj(str.data(), str.size());
+  return interp.makeFalse();
+}
+DEFPRIMITIVE(EntitySystemId, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  NodePtr node;
+  if (argc > 1) {
+    if (!argv[1]->optSingletonNodeList(context, interp, node) || !node)
+      return argError(interp, loc,
+                     InterpreterMessages::notASingletonNode, 1, argv[1]);
+  }
+  else {
+    node = context.currentNode;
+    if (!node)
+      return noCurrentNodeError(interp, loc);
+  }
+  GroveString str;
+  NamedNodeListPtr entities;
+  if (node->getGroveRoot(node) == accessOK
+      && node->getEntities(entities) == accessOK
+      && entities->namedNode(GroveString(s, n), node) == accessOK
+      && node->getExternalId(node) == accessOK
+      && node->getSystemId(str) == accessOK)
+    return new (interp) StringObj(str.data(), str.size());
+  return interp.makeFalse();
+}
+
+DEFPRIMITIVE(EntityPublicId, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  NodePtr node;
+  if (argc > 1) {
+    if (!argv[1]->optSingletonNodeList(context, interp, node) || !node)
+      return argError(interp, loc,
+                     InterpreterMessages::notASingletonNode, 1, argv[1]);
+  }
+  else {
+    node = context.currentNode;
+    if (!node)
+      return noCurrentNodeError(interp, loc);
+  }
+  GroveString str;
+  NamedNodeListPtr entities;
+  if (node->getGroveRoot(node) == accessOK
+      && node->getEntities(entities) == accessOK) {
+    StringC tem(s, n);
+    tem.resize(entities->normalize(tem.begin(), tem.size()));
+    if (entities->namedNode(GroveString(tem.data(), tem.size()), node) == accessOK
+       && node->getExternalId(node) == accessOK
+       && node->getPublicId(str) == accessOK)
+      return new (interp) StringObj(str.data(), str.size());
+  }
+  return interp.makeFalse();
+}
+
+DEFPRIMITIVE(EntityNotation, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  NodePtr node;
+  if (argc > 1) {
+    if (!argv[1]->optSingletonNodeList(context, interp, node) || !node)
+      return argError(interp, loc,
+                     InterpreterMessages::notASingletonNode, 1, argv[1]);
+  }
+  else {
+    node = context.currentNode;
+    if (!node)
+      return noCurrentNodeError(interp, loc);
+  }
+  GroveString str;
+  NamedNodeListPtr entities;
+  if (node->getGroveRoot(node) == accessOK
+      && node->getEntities(entities) == accessOK
+      && entities->namedNode(GroveString(s, n), node) == accessOK
+      && node->getNotation(node) == accessOK
+      && node->getName(str) == accessOK)
+    return new (interp) StringObj(str.data(), str.size());
+  return interp.makeFalse();
+}
+
+DEFPRIMITIVE(EntityText, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  NodePtr node;
+  if (argc > 1) {
+    if (!argv[1]->optSingletonNodeList(context, interp, node) || !node)
+      return argError(interp, loc,
+                     InterpreterMessages::notASingletonNode, 1, argv[1]);
+  }
+  else {
+    node = context.currentNode;
+    if (!node)
+      return noCurrentNodeError(interp, loc);
+  }
+  GroveString str;
+  NamedNodeListPtr entities;
+  if (node->getGroveRoot(node) == accessOK
+      && node->getEntities(entities) == accessOK
+      && entities->namedNode(GroveString(s, n), node) == accessOK
+      && node->getText(str) == accessOK)
+    return new (interp) StringObj(str.data(), str.size());
+  return interp.makeFalse();
+}
+
+DEFPRIMITIVE(EntityType, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  NodePtr node;
+  if (argc > 1) {
+    if (!argv[1]->optSingletonNodeList(context, interp, node) || !node)
+      return argError(interp, loc,
+                     InterpreterMessages::notASingletonNode, 1, argv[1]);
+  }
+  else {
+    node = context.currentNode;
+    if (!node)
+      return noCurrentNodeError(interp, loc);
+  }
+  NamedNodeListPtr entities;
+  Node::EntityType::Enum type;
+  if (node->getGroveRoot(node) == accessOK
+      && node->getEntities(entities) == accessOK
+      && entities->namedNode(GroveString(s, n), node) == accessOK
+      && node->getEntityType(type) == accessOK) {
+    const char *s;
+    switch (type) {
+    case Node::EntityType::text:
+      s = "text";
+      break;
+    case Node::EntityType::cdata:
+      s = "cdata";
+      break;
+    case Node::EntityType::sdata:
+      s = "sdata";
+      break;
+    case Node::EntityType::ndata:
+      s = "ndata";
+      break;
+    case Node::EntityType::subdocument:
+      s = "subdocument";
+      break;
+    case Node::EntityType::pi:
+      s = "pi";
+      break;
+    default:
+      CANNOT_HAPPEN();
+    }
+    return interp.makeSymbol(interp.makeStringC(s));
+  }
+  return interp.makeFalse();
+}
+
+DEFPRIMITIVE(NotationSystemId, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  NodePtr node;
+  if (argc > 1) {
+    if (!argv[1]->optSingletonNodeList(context, interp, node) || !node)
+      return argError(interp, loc,
+                     InterpreterMessages::notASingletonNode, 1, argv[1]);
+  }
+  else {
+    node = context.currentNode;
+    if (!node)
+      return noCurrentNodeError(interp, loc);
+  }
+  GroveString str;
+  NamedNodeListPtr notations;
+  if (node->getGroveRoot(node) == accessOK
+      && node->getGoverningDoctype(node) == accessOK
+      && node->getNotations(notations) == accessOK
+      && notations->namedNode(GroveString(s, n), node) == accessOK
+      && node->getExternalId(node) == accessOK
+      && node->getSystemId(str) == accessOK)
+    return new (interp) StringObj(str.data(), str.size());
+  return interp.makeFalse();
+}
+
+DEFPRIMITIVE(NotationPublicId, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  NodePtr node;
+  if (argc > 1) {
+    if (!argv[1]->optSingletonNodeList(context, interp, node) || !node)
+      return argError(interp, loc,
+                     InterpreterMessages::notASingletonNode, 1, argv[1]);
+  }
+  else {
+    node = context.currentNode;
+    if (!node)
+      return noCurrentNodeError(interp, loc);
+  }
+  GroveString str;
+  NamedNodeListPtr notations;
+  if (node->getGroveRoot(node) == accessOK
+      && node->getGoverningDoctype(node) == accessOK
+      && node->getNotations(notations) == accessOK
+      && notations->namedNode(GroveString(s, n), node) == accessOK
+      && node->getExternalId(node) == accessOK
+      && node->getPublicId(str) == accessOK)
+    return new (interp) StringObj(str.data(), str.size());
+  return interp.makeFalse();
+}
+
+DEFPRIMITIVE(NotationGeneratedSystemId, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  NodePtr node;
+  if (argc > 1) {
+    if (!argv[1]->optSingletonNodeList(context, interp, node) || !node)
+      return argError(interp, loc,
+                     InterpreterMessages::notASingletonNode, 1, argv[1]);
+  }
+  else {
+    node = context.currentNode;
+    if (!node)
+      return noCurrentNodeError(interp, loc);
+  }
+  GroveString str;
+  NamedNodeListPtr notations;
+  if (node->getGroveRoot(node) == accessOK
+      && node->getGoverningDoctype(node) == accessOK
+      && node->getNotations(notations) == accessOK
+      && notations->namedNode(GroveString(s, n), node) == accessOK
+      && node->getExternalId(node) == accessOK
+      && node->getGeneratedSystemId(str) == accessOK)
+    return new (interp) StringObj(str.data(), str.size());
+  return interp.makeFalse();
+}
+
+DEFPRIMITIVE(GeneralNameNormalize, argc, argv, context, interp, loc)
+{
+  NodePtr node;
+  if (argc > 1) {
+    if (!argv[1]->optSingletonNodeList(context, interp, node) || !node)
+      return argError(interp, loc,
+                     InterpreterMessages::notASingletonNode, 1, argv[1]);
+  }
+  else {
+    node = context.currentNode;
+    if (!node)
+      return noCurrentNodeError(interp, loc);
+  }
+  StringC result;
+  if (!convertGeneralName(argv[0], node, result))
+    return argError(interp, loc, InterpreterMessages::notAString, 0, argv[0]);
+  return new (interp) StringObj(result);
+}
+
+DEFPRIMITIVE(EntityNameNormalize, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc, InterpreterMessages::notAString, 0, argv[0]);
+  NodePtr node;
+  if (argc > 1) {
+    if (!argv[1]->optSingletonNodeList(context, interp, node) || !node)
+      return argError(interp, loc,
+                     InterpreterMessages::notASingletonNode, 1, argv[1]);
+  }
+  else {
+    node = context.currentNode;
+    if (!node)
+      return noCurrentNodeError(interp, loc);
+  }
+  StringC result(s, n);
+
+  node->getGroveRoot(node);
+  NamedNodeListPtr entities;
+  node->getEntities(entities);
+  result.resize(entities->normalize(result.begin(), result.size()));
+  return new (interp) StringObj(result);
+}
+
+DEFPRIMITIVE(NodeListFirst, argc, argv, context, interp, loc)
+{
+  NodeListObj *nl = argv[0]->asNodeList();
+  if (!nl)
+    return argError(interp, loc,
+                   InterpreterMessages::notANodeList, 0, argv[0]);
+  NodePtr nd = nl->nodeListFirst(context, interp);
+  return new (interp) NodePtrNodeListObj(nd);
+}
+
+DEFPRIMITIVE(NodeListRest, argc, argv, context, interp, loc)
+{
+  NodeListObj *nl = argv[0]->asNodeList();
+  if (!nl)
+    return argError(interp, loc,
+                   InterpreterMessages::notANodeList, 0, argv[0]);
+  return nl->nodeListRest(context, interp);
+}
+
+DEFPRIMITIVE(NodeList, argc, argv, context, interp, loc)
+{
+  if (argc == 0)
+    return interp.makeEmptyNodeList();
+  int i = argc - 1;
+  NodeListObj *nl = argv[i]->asNodeList();
+  if (!nl)
+    return argError(interp, loc,
+                   InterpreterMessages::notANodeList, i, argv[i]);
+  if (i > 0) {
+    ELObjDynamicRoot protect(interp, nl);
+    for (;;) {
+      i--;
+      NodeListObj *tem = argv[i]->asNodeList();
+      if (!tem)
+        return argError(interp, loc,
+                       InterpreterMessages::notANodeList, i, argv[i]);
+      nl = new (interp) PairNodeListObj(tem, nl);
+      if (i == 0)
+       break;
+      protect = nl;
+    }
+  }
+  return nl;
+}
+
+DEFPRIMITIVE(NodeListNoOrder, argc, argv, context, interp, loc)
+{
+  NodeListObj *nl = argv[0]->asNodeList();
+  if (!nl)
+    return argError(interp, loc,
+                   InterpreterMessages::notANodeList, 0, argv[0]);
+  return nl->nodeListNoOrder(interp);
+}
+
+DEFPRIMITIVE(IsNodeListEqual, argc, argv, context, interp, loc)
+{
+  NodeListObj *nl1 = argv[0]->asNodeList();
+  if (!nl1)
+    return argError(interp, loc,
+                   InterpreterMessages::notANodeList, 0, argv[0]);
+  if (nl1 == argv[1])
+    return interp.makeTrue();
+  NodeListObj *nl2 = argv[1]->asNodeList();
+  if (!nl2)
+    return argError(interp, loc,
+                   InterpreterMessages::notANodeList, 1, argv[1]);
+  ELObjDynamicRoot protect1(interp, nl1);
+  ELObjDynamicRoot protect2(interp, nl2);
+  for (;;) {
+    NodePtr nd1 = nl1->nodeListFirst(context, interp);
+    NodePtr nd2 = nl2->nodeListFirst(context, interp);
+    if (!nd1) {
+      if (nd2)
+       return interp.makeFalse();
+      else
+       break;
+    }
+    else if (!nd2)
+      return interp.makeFalse();
+    else if (*nd1 != *nd2)
+      return interp.makeFalse();
+    nl1 = nl1->nodeListRest(context, interp);
+    protect1 = nl1;
+    nl2 = nl2->nodeListRest(context, interp);
+    protect2 = nl2;
+  }
+  return interp.makeTrue();
+}
+
+DEFPRIMITIVE(IsNamedNodeList, argc, argv, context, interp, loc)
+{
+  if (argv[0]->asNamedNodeList())
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(NamedNode, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  NamedNodeListObj *nnl = argv[1]->asNamedNodeList();
+  if (!nnl)
+    return argError(interp, loc,
+                   InterpreterMessages::notANamedNodeList, 1, argv[1]);
+  return new (interp) NodePtrNodeListObj(nnl->namedNode(s, n));
+}
+
+DEFPRIMITIVE(NamedNodeListNormalize, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc, InterpreterMessages::notAString, 0, argv[0]);
+  NamedNodeListObj *nnl = argv[1]->asNamedNodeList();
+  if (!nnl)
+    return argError(interp, loc,
+                   InterpreterMessages::notANamedNodeList, 1, argv[1]);
+  if (!argv[2]->asSymbol())
+    return argError(interp, loc,
+                   InterpreterMessages::notASymbol, 2, argv[2]);
+  StringC result(s, n);
+  result.resize(nnl->normalize(result.begin(), result.size()));
+  return new (interp) StringObj(result);
+}
+
+DEFPRIMITIVE(NamedNodeListNames, argc, argv, context, interp, loc)
+{
+  NamedNodeListObj *nnl = argv[0]->asNamedNodeList();
+  if (!nnl)
+    return argError(interp, loc,
+                   InterpreterMessages::notANamedNodeList, 0, argv[0]);
+  NodeListObj *nl = nnl;
+  PairObj *tail = interp.makePair(0, 0);
+  PairObj *head = tail;
+  ELObjDynamicRoot protect(interp, head);
+  for (;;) {
+    ELObjDynamicRoot protect(interp, nl);
+    NodePtr nd = nl->nodeListFirst(context, interp);
+    if (!nd)
+      break;
+    GroveString str;
+    if (nnl->nodeName(nd, str)) {
+      // protect the StringObj by putting in the head's car
+      head->setCar(new (interp) StringObj(str.data(), str.size()));
+      PairObj *newTail = new (interp) PairObj(head->car(), 0);
+      tail->setCdr(newTail);
+      tail = newTail;
+    }
+    nl = nl->nodeListRest(context, interp);
+  }
+  tail->setCdr(interp.makeNil());
+  return head->cdr();
+}
+
+DEFPRIMITIVE(Children, argc, argv, context, interp, loc)
+{
+  NodePtr node;
+  if (!argv[0]->optSingletonNodeList(context, interp, node)) {
+    NodeListObj *nl = argv[0]->asNodeList();
+    if (nl)
+      return new (interp) MapNodeListObj(this, nl, new MapNodeListObj::Context(context, loc));
+    return argError(interp, loc,
+                   InterpreterMessages::notANodeList, 0, argv[0]);
+  }
+  if (!node)
+    return argv[0];
+  NodeListPtr nl;
+  if (node->children(nl) != accessOK)
+    return interp.makeEmptyNodeList();
+  return new (interp) NodeListPtrNodeListObj(nl);
+}
+
+DEFPRIMITIVE(Follow, argc, argv, context, interp, loc)
+{
+  NodePtr node;
+  if (!argv[0]->optSingletonNodeList(context, interp, node)) {
+    NodeListObj *nl = argv[0]->asNodeList();
+    if (nl)
+      return new (interp) MapNodeListObj(this, nl, new MapNodeListObj::Context(context, loc));
+    return argError(interp, loc,
+                   InterpreterMessages::notANodeList, 0, argv[0]);
+  }
+  if (!node)
+    return argv[0];
+  NodeListPtr nl;
+  if (node->follow(nl) != accessOK)
+    return interp.makeEmptyNodeList();
+  return new (interp) NodeListPtrNodeListObj(nl);
+}
+
+DEFPRIMITIVE(Descendants, argc, argv, context, interp, loc)
+{
+  NodePtr node;
+  if (!argv[0]->optSingletonNodeList(context, interp, node)) {
+    NodeListObj *nl = argv[0]->asNodeList();
+    if (nl)
+      return new (interp) MapNodeListObj(this, nl, new MapNodeListObj::Context(context, loc));
+    return argError(interp, loc,
+                   InterpreterMessages::notANodeList, 0, argv[0]);
+  }
+  return new (interp) DescendantsNodeListObj(node);
+}
+
+DEFPRIMITIVE(Preced, argc, argv, context, interp, loc)
+{
+  NodePtr node;
+  if (!argv[0]->optSingletonNodeList(context, interp, node)) {
+    NodeListObj *nl = argv[0]->asNodeList();
+    if (nl)
+      return new (interp) MapNodeListObj(this, nl, new MapNodeListObj::Context(context, loc));
+    return argError(interp, loc,
+                   InterpreterMessages::notANodeList, 0, argv[0]);
+  }
+  NodePtr first;
+  if (!node || node->firstSibling(first) != accessOK)
+    return interp.makeEmptyNodeList();
+  return new (interp) SiblingNodeListObj(first, node);
+}
+
+DEFPRIMITIVE(Attributes, argc, argv, context, interp, loc)
+{
+  NodePtr node;
+  if (!argv[0]->optSingletonNodeList(context, interp, node)) {
+    NodeListObj *nl = argv[0]->asNodeList();
+    if (nl)
+      return new (interp) MapNodeListObj(this, nl, new MapNodeListObj::Context(context, loc));
+    return argError(interp, loc,
+                   InterpreterMessages::notANodeList, 0, argv[0]);
+  }
+  if (!node)
+    return argv[0];
+  NamedNodeListPtr nnl;
+  if (node->getAttributes(nnl) != accessOK)
+    return interp.makeEmptyNodeList();
+  return new (interp) NamedNodeListPtrNodeListObj(nnl);
+}
+
+static
+void nodeData(const NodePtr &nd, const SdataMapper &mapper, bool chunk, StringC &s)
+{
+  GroveString tem;
+  if (nd->charChunk(mapper, tem) == accessOK) {
+    s.append(tem.data(), chunk ? tem.size() : 1);
+    return;
+  }
+  if (nd->tokens(tem) == accessOK) {
+    s.append(tem.data(), tem.size());
+    return;
+  }
+  NodePtr cnd;
+  if (nd->firstChild(cnd) == accessOK) {
+    do {
+      nodeData(cnd, mapper, 1, s);
+    } while (cnd.assignNextChunkSibling() == accessOK);
+    return;
+  }
+  // This happens if the data procedure is called on an AVT node
+  if (nd->getToken(tem) == accessOK)
+    s.append(tem.data(), tem.size());
+}
+
+DEFPRIMITIVE(Data, argc, argv, context, interp, loc)
+{
+  NodeListObj *nl = argv[0]->asNodeList();
+  if (!nl)
+    return argError(interp, loc,
+                   InterpreterMessages::notANodeList, 0, argv[0]);
+  StringObj *s = new (interp) StringObj;
+  ELObjDynamicRoot protect(interp, s);
+  for (;;) {
+    ELObjDynamicRoot protect(interp, nl);
+    NodePtr nd = nl->nodeListFirst(context, interp);
+    if (!nd)
+      break;
+    bool chunk;
+    nl = nl->nodeListChunkRest(context, interp, chunk);
+    nodeData(nd, interp, chunk, *s);
+  }
+  return s;
+}
+
+DEFPRIMITIVE(ElementWithId, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc, InterpreterMessages::notAString, 0, argv[0]);
+  NodePtr node;
+  if (argc > 1) {
+    if (!argv[1]->optSingletonNodeList(context, interp, node) || !node)
+      return argError(interp, loc,
+                     InterpreterMessages::notASingletonNode, 1, argv[1]);
+  }
+  else {
+    node = context.currentNode;
+    if (!node)
+      return noCurrentNodeError(interp, loc);
+  }
+  NamedNodeListPtr elements;
+  if (node->getGroveRoot(node) == accessOK
+      && node->getElements(elements) == accessOK
+      && elements->namedNode(GroveString(s, n), node) == accessOK)
+    return new (interp) NodePtrNodeListObj(node);
+  return interp.makeEmptyNodeList();
+}
+
+DEFPRIMITIVE(EmptyNodeList, argc, argv, context, interp, loc)
+{
+  return interp.makeEmptyNodeList();
+}
+
+static
+bool decodeKeyArgs(int argc, ELObj **argv, const Identifier::SyntacticKey *keys,
+                  int nKeys, Interpreter &interp, const Location &loc, int *pos)
+{
+  if ((argc & 1) == 1) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::oddKeyArgs);
+    return 0;
+  }
+  for (int i = 0; i < nKeys; i++)
+    pos[i] = -1;
+  // First has priority, so scan in reverse order
+  for (int i = argc - 1; i > 0; i -= 2) {
+    KeywordObj *keyObj = argv[i - 1]->asKeyword();
+    if (!keyObj) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::keyArgsNotKey);
+      return 0;
+    }
+    bool found = 0;
+    Identifier::SyntacticKey key;
+    if (keyObj->identifier()->syntacticKey(key)) {
+      for (int j = 0; j < nKeys; j++) {
+       if (key == keys[j]) {
+         pos[j] = i;
+         found = 1;
+       }
+      }
+    }
+    if (!found) {
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::invalidKeyArg,
+                    StringMessageArg(keyObj->identifier()->name()));
+      return 0;
+    }
+  }
+  return 1;
+}
+
+DEFPRIMITIVE(NodeProperty, argc, argv, context, interp, loc)
+{
+  StringObj *str = argv[0]->convertToString();
+  if (!str)
+    return argError(interp, loc,
+                   InterpreterMessages::notAStringOrSymbol, 0, argv[0]);
+  NodePtr node;
+  if (!argv[1]->optSingletonNodeList(context, interp, node) || !node)
+    return argError(interp, loc,
+                   InterpreterMessages::notASingletonNode, 1, argv[1]);
+  static const Identifier::SyntacticKey keys[3] = {
+    Identifier::keyDefault, Identifier::keyNull, Identifier::keyIsRcs
+  };
+  int pos[3];
+  if (!decodeKeyArgs(argc - 2, argv + 2, keys, 3, interp, loc, pos))
+    return interp.makeError();
+  //FIXME: this is just a hack to fix the single duplicate rcsname 'tokens';
+  //       should really be handled in Interpreter.
+  StringC propname;
+  ComponentName::Id cls;
+  ComponentName::Id id = ComponentName::noId;
+  if (*str == "tokens" 
+      && node->getClassName(cls) == accessOK 
+      && cls == ComponentName::idModelGroup) 
+    id = ComponentName::idContentTokens;
+  else
+    interp.lookupNodeProperty(*str, id);
+  if (id != ComponentName::noId) {
+    ELObjPropertyValue value(interp,
+                            pos[2] >= 0
+                            && argv[pos[2] + 2] != interp.makeFalse());
+    AccessResult ret = node->property(id, interp, value);
+    if (ret == accessOK)
+      return value.obj;
+    if (ret == accessNull && pos[1] >= 0)
+      return argv[pos[1] + 2];
+  }
+  if (pos[0] < 0) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::noNodePropertyValue,
+                  StringMessageArg(*str));
+    return interp.makeError();
+  }
+  return argv[pos[0] + 2];
+}
+
+DEFPRIMITIVE(SelectByClass, argc, argv, context, interp, loc)
+{
+  NodeListObj *nl = argv[0]->asNodeList();
+  if (!nl)
+    return argError(interp, loc,
+                   InterpreterMessages::notANodeList, 0, argv[0]);
+  StringObj *str = argv[1]->convertToString();
+  if (!str)
+    return argError(interp, loc,
+                   InterpreterMessages::notAStringOrSymbol, 1, argv[1]);
+  ComponentName::Id id;
+  if (!interp.lookupNodeProperty(*str, id))
+    return interp.makeEmptyNodeList();
+  return new (interp) SelectByClassNodeListObj(nl, id);
+}
+
+DEFPRIMITIVE(NodeListMap, argc, argv, context, interp, loc)
+{
+  FunctionObj *func = argv[0]->asFunction();
+  if (!func)
+    return argError(interp, loc,
+                   InterpreterMessages::notAProcedure, 0, argv[0]);
+  if (func->nRequiredArgs() > 1) {
+    interp.setNextLocation(loc);
+    // FIXME
+    interp.message(InterpreterMessages::missingArg);
+    return interp.makeError();
+  }
+  if (func->nRequiredArgs() + func->nOptionalArgs() + func->restArg() == 0) {
+    interp.setNextLocation(loc);
+    // FIXME
+    interp.message(InterpreterMessages::tooManyArgs);
+    return interp.makeError();
+  }
+  interp.makeReadOnly(func);
+  NodeListObj *nl = argv[1]->asNodeList();
+  if (!nl)
+    return argError(interp, loc,
+                   InterpreterMessages::notANodeList, 1, argv[1]);
+  return new (interp) MapNodeListObj(func, nl, new MapNodeListObj::Context(context, loc));
+}
+
+DEFPRIMITIVE(NodeListRef, argc, argv, context, interp, loc)
+{
+  NodeListObj *nl = argv[0]->asNodeList();
+  if (!nl)
+    return argError(interp, loc,
+                   InterpreterMessages::notANodeList, 0, argv[0]);
+  long k;
+  if (!argv[1]->exactIntegerValue(k))
+    return argError(interp, loc,
+                   InterpreterMessages::notAnExactInteger, 1, argv[1]);
+  // Must use temporary variable, because operator new may bew called before nodeListRef.
+  NodePtr nd(nl->nodeListRef(k, context, interp));
+  return new (interp) NodePtrNodeListObj(nd);
+}
+
+DEFPRIMITIVE(NodeListReverse, argc, argv, context, interp, loc)
+{
+  NodeListObj *nl = argv[0]->asNodeList();
+  if (!nl)
+    return argError(interp, loc,
+                   InterpreterMessages::notANodeList, 0, argv[0]);
+  return nl->nodeListReverse(context, interp);
+}
+
+DEFPRIMITIVE(NodeListLength, argc, argv, context, interp, loc)
+{
+  NodeListObj *nl = argv[0]->asNodeList();
+  if (!nl)
+    return argError(interp, loc,
+                   InterpreterMessages::notANodeList, 0, argv[0]);
+  return interp.makeInteger(nl->nodeListLength(context, interp));
+}
+
+DEFPRIMITIVE(SgmlParse, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  StringC sysid(s, n);
+  static const Identifier::SyntacticKey keys[2] = {
+      Identifier::keyActive, Identifier::keyParent
+  };
+  int pos[2];
+  if (!decodeKeyArgs(argc - 1, argv + 1, keys, 2, interp, loc, pos))
+    return interp.makeError();
+  Vector<StringC> lists[2];
+  if (pos[0] >= 0) {
+    ELObj *obj = argv[pos[0] + 1];
+    while (!obj->isNil()) {
+      PairObj *pair = obj->asPair();
+      if (!pair)
+       return argError(interp, loc,
+                       InterpreterMessages::notAList, pos[0] + 1, argv[pos[0] + 1]);
+      if (!pair->car()->stringData(s, n))
+       return argError(interp, loc,
+                       InterpreterMessages::notAString, pos[0] + 1, pair->car());
+      lists[0].resize(lists[0].size() + 1);
+      lists[0].back().assign(s, n);
+      obj = pair->cdr();
+    }
+  }
+
+  NodePtr parent;
+  if (pos[1] >= 0) {
+    if (!argv[pos[1] + 1]->optSingletonNodeList(context, interp, parent) || !parent)
+      return argError(interp, loc,
+                     InterpreterMessages::notASingletonNode, pos[1] + 1, argv[pos[1] + 1]);
+  }
+
+  NodePtr nd;
+  if (!interp.groveManager()->load(sysid, lists[0], parent, nd, lists[1]))
+    return interp.makeEmptyNodeList();
+  return new (interp) NodePtrNodeListObj(nd);
+}
+
+DEFPRIMITIVE(XSgmlParse, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  StringC sysid(s, n);
+  static const Identifier::SyntacticKey keys[3] = {
+      Identifier::keyActive, Identifier::keyArchitecture, Identifier::keyParent
+  };
+  int pos[3];
+  if (!decodeKeyArgs(argc - 1, argv + 1, keys, 3, interp, loc, pos))
+    return interp.makeError();
+  Vector<StringC> lists[2];
+  for (int i = 0; i < 3; i++) {
+    if (pos[i] >= 0) {
+      ELObj *obj = argv[pos[0] + 1];
+      while (!obj->isNil()) {
+       PairObj *pair = obj->asPair();
+       if (!pair)
+         return argError(interp, loc,
+                         InterpreterMessages::notAList, pos[i] + 1, argv[pos[i] + 1]);
+       if (!pair->car()->stringData(s, n))
+         return argError(interp, loc,
+                         InterpreterMessages::notAString, pos[i] + 1, pair->car());
+       lists[i].resize(lists[i].size() + 1);
+       lists[i].back().assign(s, n);
+       obj = pair->cdr();
+      }
+    }
+  }
+
+  NodePtr parent;
+  if (pos[2] >= 0) {
+    if (!argv[pos[2] + 1]->optSingletonNodeList(context, interp, parent) || !parent)
+      return argError(interp, loc,
+                     InterpreterMessages::notASingletonNode, pos[2] + 1, argv[pos[2] + 1]);
+  }
+
+  NodePtr nd;
+  if (!interp.groveManager()->load(sysid, lists[0], parent, nd, lists[1]))
+    return interp.makeEmptyNodeList();
+  return new (interp) NodePtrNodeListObj(nd);
+}
+
+DEFPRIMITIVE(ReadEntity, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  StringC sysid(s, n);
+  StringObj *contents = new (interp) StringObj;
+  if (interp.groveManager()->readEntity(sysid, *contents))
+    return contents;
+  return interp.makeError();
+}
+
+DEFPRIMITIVE(Debug, argc, argv, context, interp, loc)
+{
+  interp.setNextLocation(loc);
+  interp.message(InterpreterMessages::debug, ELObjMessageArg(argv[0], interp));
+  return argv[0];
+}
+
+DEFPRIMITIVE(IfFirstPage, argc, argv, context, interp, loc)
+{
+  SosofoObj *sosofo[2];
+  for (int i = 0; i < 2; i++) {
+    sosofo[i] = argv[i]->asSosofo();
+    if (!sosofo[i])
+      return argError(interp, loc, InterpreterMessages::notASosofo,
+                     i, argv[i]);
+  }
+  return new (interp) PageTypeSosofoObj(FOTBuilder::firstHF, sosofo[0], sosofo[1]);
+}
+
+DEFPRIMITIVE(IfFrontPage, argc, argv, context, interp, loc)
+{
+  SosofoObj *sosofo[2];
+  for (int i = 0; i < 2; i++) {
+    sosofo[i] = argv[i]->asSosofo();
+    if (!sosofo[i])
+      return argError(interp, loc, InterpreterMessages::notASosofo,
+                     i, argv[i]);
+  }
+  return new (interp) PageTypeSosofoObj(FOTBuilder::frontHF, sosofo[0], sosofo[1]);
+}
+
+DEFPRIMITIVE(AllElementNumber, argc, argv, context, interp, loc)
+{
+  NodePtr node;
+  if (argc > 0) {
+    if (!argv[0]->optSingletonNodeList(context, interp, node))
+      return argError(interp, loc,
+                     InterpreterMessages::notAnOptSingletonNode, 0, argv[0]);
+  }
+  else {
+    if (!context.currentNode)
+      return noCurrentNodeError(interp, loc);
+    node = context.currentNode;
+  }
+  unsigned long n;
+  if (node && node->elementIndex(n) == accessOK)
+    return interp.makeInteger(long(n) + 1);
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(IsVector, argc, argv, context, interp, loc)
+{
+  if (argv[0]->asVector())
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(Vector, argc, argv, context, interp, loc)
+{
+  Vector<ELObj *> v(argc);
+  for (size_t i = 0; i < argc; i++)
+    v[i] = argv[i];
+  return new (interp) VectorObj(v);
+}
+
+DEFPRIMITIVE(MakeVector, argc, argv, context, interp, loc)
+{
+  long k;
+  if (!argv[0]->exactIntegerValue(k))
+    return argError(interp, loc,
+                   InterpreterMessages::notAnExactInteger, 0, argv[0]);
+  if (k < 0) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::outOfRange);
+    return interp.makeError();
+  }
+  ELObj *fill = argc > 1 ? argv[1] : interp.makeUnspecified();
+  Vector<ELObj *> v((size_t)k);
+  for (size_t i = 0; i < v.size(); i++)
+    v[i] = fill;
+  return new (interp) VectorObj(v);
+}
+
+DEFPRIMITIVE(VectorSet, argc, argv, context, interp, loc)
+{
+  VectorObj *v = argv[0]->asVector();
+  if (!v)
+    return argError(interp, loc,
+                   InterpreterMessages::notAVector, 0, argv[0]);
+  long k;
+  if (!argv[1]->exactIntegerValue(k))
+    return argError(interp, loc,
+                   InterpreterMessages::notAnExactInteger, 1, argv[1]);
+  if (k < 0 || (unsigned long)k >= v->size()) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::outOfRange);
+    return interp.makeError();
+  }
+  if (v->readOnly()) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::readOnly);
+    return interp.makeError();
+  }
+  (*v)[k] = argv[2];
+  return interp.makeUnspecified();
+}
+
+DEFPRIMITIVE(VectorRef, argc, argv, context, interp, loc)
+{
+  VectorObj *v = argv[0]->asVector();
+  if (!v)
+    return argError(interp, loc,
+                   InterpreterMessages::notAVector, 0, argv[0]);
+  long k;
+  if (!argv[1]->exactIntegerValue(k))
+    return argError(interp, loc,
+                   InterpreterMessages::notAnExactInteger, 1, argv[1]);
+  if (k < 0 || (unsigned long)k >= v->size()) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::outOfRange);
+    return interp.makeError();
+  }
+  return (*v)[k];
+}
+
+DEFPRIMITIVE(VectorToList, argc, argv, context, interp, loc)
+{
+  VectorObj *v = argv[0]->asVector();
+  if (!v)
+    return argError(interp, loc,
+                   InterpreterMessages::notAVector, 0, argv[0]);
+  Vector<ELObj *> &vec = *v;
+  ELObjDynamicRoot result(interp, interp.makeNil());
+  for (size_t i = vec.size(); i > 0; i--)
+    result = new (interp) PairObj(vec[i - 1], result);
+  return result;
+}
+
+DEFPRIMITIVE(ListToVector, argc, argv, context, interp, loc)
+{
+  Vector<ELObj *> v;
+  ELObj *obj = argv[0];
+  while (!obj->isNil()) {
+    PairObj *pair = obj->asPair();
+    if (!pair)
+      return argError(interp, loc, InterpreterMessages::notAList, 0, obj);
+    v.push_back(pair->car());
+    obj = pair->cdr();
+  }
+  return new (interp) VectorObj(v);
+}
+
+DEFPRIMITIVE(VectorFill, argc, argv, context, interp, loc)
+{
+  VectorObj *v = argv[0]->asVector();
+  if (!v)
+    return argError(interp, loc,
+                   InterpreterMessages::notAVector, 0, argv[0]);
+  if (v->readOnly()) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::readOnly);
+    return interp.makeError();
+  }
+  Vector<ELObj *> &vec = *v;
+  for (size_t i = 0; i < vec.size(); i++)
+    vec[i] = argv[1];
+  return interp.makeUnspecified();
+}
+
+DEFPRIMITIVE(Language, argc, argv, context, interp, loc)
+{
+  StringObj *lang = argv[0]->convertToString();
+  if (!lang)
+    return argError(interp, loc,
+                   InterpreterMessages::notAStringOrSymbol, 0, argv[0]);
+  StringObj *country = argv[1]->convertToString();
+  if (!country)
+    return argError(interp, loc,
+                   InterpreterMessages::notAStringOrSymbol, 1, argv[1]);
+#ifdef SP_HAVE_LOCALE
+#ifdef SP_HAVE_WCHAR
+  if (RefLangObj::supportedLanguage(*lang, *country))
+    return new (interp) RefLangObj (*lang, *country);
+  else
+#endif
+#endif
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(IsLanguage, argc, argv, context, interp, loc)
+{
+  if (argv[0]->asLanguage())
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(CurrentLanguage, argc, argv, context, interp, loc)
+{
+  if (context.currentLanguage)
+    return context.currentLanguage;
+  else
+    return interp.defaultLanguage();
+}
+
+DEFPRIMITIVE(WithLanguage, argc, argv, context, interp, loc)
+{
+  // Check that argv[0] is a language
+  LanguageObj *lang = argv[0]->asLanguage();
+  if (!lang)
+    return argError(interp, loc,
+                    InterpreterMessages::notALanguage, 0, argv[0]);
+  // Check that argv[1] is a thunk
+  FunctionObj *func = argv[1]->asFunction();
+  if (!func)
+    return argError(interp, loc,
+                    InterpreterMessages::notAProcedure, 1, argv[1]);
+  if (func->totalArgs() > 0) {
+    interp.message(InterpreterMessages::tooManyArgs);
+    return interp.makeError();
+  }
+  LanguageObj *savedLanguage = context.currentLanguage;
+  context.currentLanguage = lang;
+  VM vm(context, interp);
+  InsnPtr insn(func->makeCallInsn(0, interp, loc, InsnPtr()));
+  ELObj *ret = vm.eval(insn.pointer());
+  context.currentLanguage = savedLanguage;
+  return ret;
+}
+
+#define GETCURLANG(lang,context,interp) \
+  const LanguageObj *lang; \
+  if (context.currentLanguage != 0) \
+    lang = context.currentLanguage; \
+  else if (interp.defaultLanguage()->asLanguage() != 0) \
+    lang = interp.defaultLanguage()->asLanguage(); \
+  else { \
+    interp.message(InterpreterMessages::noCurrentLanguage); \
+    return interp.makeError(); \
+  }
+
+DEFPRIMITIVE(CharLess, argc, argv, context, interp, loc)
+{
+  GETCURLANG(lang, context, interp);
+  Char c[2];
+  for (unsigned i = 0; i < 2; i++)
+    if (!argv[i]->charValue(c[i]))
+      return argError(interp, loc,
+                      InterpreterMessages::notAChar, i, argv[i]);
+  if (lang->isLess(StringC(c, 1), StringC(c + 1, 1)))
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(CharLessOrEqual, argc, argv, context, interp, loc)
+{
+  GETCURLANG(lang, context, interp);
+  Char c[2];
+  for (unsigned i = 0; i < 2; i++)
+    if (!argv[i]->charValue(c[i]))
+      return argError(interp, loc,
+                      InterpreterMessages::notAChar, i, argv[i]);
+  if (lang->isLessOrEqual(StringC(c, 1), StringC(c + 1, 1)))
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(CharUpcase, argc, argv, context, interp, loc)
+{
+  GETCURLANG(lang, context, interp);
+  Char c;
+  if (!argv[0]->charValue(c))
+    return argError(interp, loc,
+                    InterpreterMessages::notAChar, 0, argv[0]);
+  return interp.makeChar(lang->toUpper(c));
+}
+
+DEFPRIMITIVE(CharDowncase, argc, argv, context, interp, loc)
+{
+  GETCURLANG(lang, context, interp);
+  Char c;
+  if (!argv[0]->charValue(c))
+    return argError(interp, loc,
+                    InterpreterMessages::notAChar, 0, argv[0]);
+  return interp.makeChar(lang->toLower(c));
+}
+
+DEFPRIMITIVE(StringEquiv, argc, argv, context, interp, loc)
+{
+  GETCURLANG(lang, context, interp);
+  const Char *s[2];
+  size_t n[2];
+  for (unsigned i = 0; i < 2; i++)
+    if (!argv[i]->stringData(s[i], n[i]))
+      return argError(interp, loc,
+                      InterpreterMessages::notAString, i, argv[i]);
+  long k = 0;
+  if (!argv[2]->exactIntegerValue(k) || (k <= 0))
+    return argError(interp, loc,
+                    InterpreterMessages::notAPositiveInteger, 2, argv[2]);
+  if (lang->areEquivalent(StringC(s[0], n[0]), StringC(s[1], n[1]), k))
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(StringLess, argc, argv, context, interp, loc)
+{
+  GETCURLANG(lang, context, interp);
+  const Char *s[2];
+  size_t n[2];
+  for (unsigned i = 0; i < 2; i++)
+    if (!argv[i]->stringData(s[i], n[i]))
+      return argError(interp, loc,
+                      InterpreterMessages::notAString, i, argv[i]);
+  if (lang->isLess(StringC(s[0], n[0]), StringC(s[1], n[1])))
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(StringLessOrEqual, argc, argv, context, interp, loc)
+{
+  GETCURLANG(lang, context, interp);
+  const Char *s[2];
+  size_t n[2];
+  for (unsigned i = 0; i < 2; i++)
+    if (!argv[i]->stringData(s[i], n[i]))
+      return argError(interp, loc,
+                      InterpreterMessages::notAString, i, argv[i]);
+  if (lang->isLessOrEqual(StringC(s[0], n[0]), StringC(s[1], n[1])))
+    return interp.makeTrue();
+  else
+    return interp.makeFalse();
+}
+
+DEFPRIMITIVE(Assoc, argc, argv, context, interp, loc)
+{
+  ELObj *list = argv[1];
+  for (;;) {
+    PairObj *pair = list->asPair();
+    if (pair) {
+      PairObj *car = pair->car()->asPair();
+      if (!car)
+        return argError(interp, loc,
+                        InterpreterMessages::notAnAlist, 1, argv[1]);
+      if (ELObj::equal(*car->car(), *argv[0]))
+        return car;
+      list = pair->cdr();
+    } else if (list->isNil())
+      break;
+    else
+      return argError(interp, loc,
+                      InterpreterMessages::notAList, 1, argv[1]);
+  }
+  return interp.makeFalse();
+}
+
+DEFPRIMITIVE(KeywordToString, argc, argv, context, interp, loc)
+{
+  KeywordObj *obj = argv[0]->asKeyword();
+  if (!obj)
+    return argError(interp, loc,
+                   InterpreterMessages::notAKeyword, 0, argv[0]);
+  return new (interp) StringObj(obj->identifier()->name());
+}
+
+DEFPRIMITIVE(StringToKeyword, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc,
+                   InterpreterMessages::notAString, 0, argv[0]);
+  return interp.makeKeyword(StringC(s, n));
+}
+
+DEFPRIMITIVE(IsExact, argc, argv, context, interp, loc)
+{
+  long n;
+  double d;
+  int dim;
+  switch (argv[0]->quantityValue(n, d, dim)) {
+  case ELObj::noQuantity:     
+    return argError(interp, loc,
+                   InterpreterMessages::notAQuantity, 0, argv[0]);
+  case ELObj::doubleQuantity:     
+    return interp.makeFalse();
+  case ELObj::longQuantity:    
+    return interp.makeTrue();
+  default:
+    CANNOT_HAPPEN();
+  }
+}
+
+DEFPRIMITIVE(IsInexact, argc, argv, context, interp, loc)
+{
+  long n;
+  double d;
+  int dim;
+  switch (argv[0]->quantityValue(n, d, dim)) {
+  case ELObj::noQuantity:     
+    return argError(interp, loc,
+                   InterpreterMessages::notAQuantity, 0, argv[0]);
+  case ELObj::doubleQuantity:     
+    return interp.makeTrue();
+  case ELObj::longQuantity:    
+    return interp.makeFalse();
+  default:
+    CANNOT_HAPPEN();
+  }
+}
+
+#define DEFNUMPRED(NAME, OP) \
+DEFPRIMITIVE(NAME, argc, argv, context, interp, loc) \
+{ \
+  long n; \
+  double d; \
+  int dim; \
+  switch (argv[0]->quantityValue(n, d, dim)) { \
+  case ELObj::noQuantity: \
+    return argError(interp, loc, \
+                   InterpreterMessages::notAQuantity, 0, argv[0]); \
+  case ELObj::doubleQuantity: \
+    if (d OP 0.0) \
+      return interp.makeTrue(); \
+    else \
+      return interp.makeFalse(); \
+  case ELObj::longQuantity: \
+    if (n OP 0) \
+      return interp.makeTrue(); \
+    else \
+      return interp.makeFalse(); \
+  default: \
+    CANNOT_HAPPEN(); \
+  } \
+}
+
+DEFNUMPRED(IsZero, == )
+DEFNUMPRED(IsPositive, > )
+DEFNUMPRED(IsNegative, < )
+
+DEFPRIMITIVE(IsOdd, argc, argv, context, interp, loc)
+{
+  long n;
+  double d;
+  int dim;
+  switch (argv[0]->quantityValue(n, d, dim)) {
+  case ELObj::noQuantity:     
+  case ELObj::doubleQuantity:     
+    return argError(interp, loc,
+                   InterpreterMessages::notAnInteger, 0, argv[0]);
+  case ELObj::longQuantity:    
+    if (n % 2)
+      return interp.makeTrue();
+    else 
+      return interp.makeFalse();
+  default:
+    CANNOT_HAPPEN();
+  }
+}
+
+DEFPRIMITIVE(IsEven, argc, argv, context, interp, loc)
+{
+  long n;
+  double d;
+  int dim;
+  switch (argv[0]->quantityValue(n, d, dim)) {
+  case ELObj::noQuantity:     
+  case ELObj::doubleQuantity:     
+    return argError(interp, loc,
+                   InterpreterMessages::notAnInteger, 0, argv[0]);
+  case ELObj::longQuantity:    
+    if (n % 2)
+      return interp.makeFalse();
+    else 
+      return interp.makeTrue();
+  default:
+    CANNOT_HAPPEN();
+  }
+}
+
+DEFPRIMITIVE(Exp, argc, argv, context, interp, loc)
+{
+  double d;
+  if (!argv[0]->realValue(d)) 
+    return argError(interp, loc,
+                   InterpreterMessages::notANumber, 0, argv[0]);
+  return new (interp) RealObj(exp(d));
+}
+
+DEFPRIMITIVE(Log, argc, argv, context, interp, loc)
+{
+  double d;
+  if (!argv[0]->realValue(d)) 
+    return argError(interp, loc,
+                   InterpreterMessages::notANumber, 0, argv[0]);
+  if (d <= 0) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::outOfRange);
+    return interp.makeError();
+  }
+  return new (interp) RealObj(log(d));
+}
+
+DEFPRIMITIVE(Sin, argc, argv, context, interp, loc)
+{
+  double d;
+  if (!argv[0]->realValue(d)) 
+  return argError(interp, loc,
+                   InterpreterMessages::notANumber, 0, argv[0]);
+  return new (interp) RealObj(sin(d));
+}
+
+DEFPRIMITIVE(Cos, argc, argv, context, interp, loc)
+{
+  double d;
+  if (!argv[0]->realValue(d)) 
+    return argError(interp, loc,
+                   InterpreterMessages::notANumber, 0, argv[0]);
+  return new (interp) RealObj(cos(d));
+}
+
+DEFPRIMITIVE(Tan, argc, argv, context, interp, loc)
+{
+  double d;
+  if (!argv[0]->realValue(d)) 
+    return argError(interp, loc,
+                   InterpreterMessages::notANumber, 0, argv[0]);
+  return new (interp) RealObj(tan(d));
+}
+
+DEFPRIMITIVE(Asin, argc, argv, context, interp, loc)
+{
+  double d;
+  if (!argv[0]->realValue(d)) 
+    return argError(interp, loc,
+                   InterpreterMessages::notANumber, 0, argv[0]);
+  if (d < -1 || d > 1) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::outOfRange);
+    return interp.makeError();
+  }
+  return new (interp) RealObj(asin(d));
+}
+
+DEFPRIMITIVE(Acos, argc, argv, context, interp, loc)
+{
+  double d;
+  if (!argv[0]->realValue(d)) 
+    return argError(interp, loc,
+                   InterpreterMessages::notANumber, 0, argv[0]);
+  if (d < -1 || d > 1) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::outOfRange);
+    return interp.makeError();
+   }
+  return new (interp) RealObj(acos(d));
+} 
+
+DEFPRIMITIVE(Atan, argc, argv, context, interp, loc)
+{
+  long lResult;
+  double dResult;
+  int dim;
+  ELObj::QuantityType type = 
+    argv[0]->quantityValue(lResult, dResult, dim);
+
+  if (argc == 1) {
+    if (type == ELObj::noQuantity || dim != 0)
+      return argError(interp, loc,
+                     InterpreterMessages::notANumber, 0, argv[0]);
+    if (type == ELObj::longQuantity) 
+      dResult = lResult;
+    return new (interp) RealObj(atan(dResult));
+  } 
+  
+  long lResult2;
+  double dResult2;
+  int dim2;
+  ELObj::QuantityType type2 = 
+    argv[1]->quantityValue(lResult2, dResult2, dim2);
+
+  switch (type) {
+  case ELObj::noQuantity:
+    return argError(interp, loc,
+                   InterpreterMessages::notAQuantity, 0, argv[0]);
+  case ELObj::doubleQuantity: 
+    break;
+  case ELObj::longQuantity:
+    dResult = lResult;
+    break;
+  default:
+    CANNOT_HAPPEN();
+  }
+
+  switch (type2) {
+  case ELObj::noQuantity:
+    return argError(interp, loc,
+                   InterpreterMessages::notAQuantity, 1, argv[1]);
+  case ELObj::doubleQuantity: 
+    break;
+  case ELObj::longQuantity:
+    dResult2 = lResult2;
+    break;
+  default:
+    CANNOT_HAPPEN();
+  }
+
+  if (dim != dim2) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::incompatibleDimensions);
+    return interp.makeError();
+  }
+  // FIXME: the standard is a bit vague about the range
+  // of atan with two arguments. The description sounds like
+  // it should be [0,2pi] or [-pi,pi], but then it says 
+  // the range is [-pi/2,pi/2]. I guess that the last sentence
+  // applies only to the one-argument version of atan, so that
+  // the semantics would parallel that of the C libraries
+  // atan/atan2.
+  return new (interp) RealObj(atan2(dResult, dResult2));
+}
+
+DEFPRIMITIVE(XExpt, argc, argv, context, interp, loc)
+{
+  long n1, n2;
+  double d1, d2;
+  int dim1, dim2;
+
+  ELObj::QuantityType q1 = argv[0]->quantityValue(n1, d1, dim1);
+  ELObj::QuantityType q2 = argv[0]->quantityValue(n2, d2, dim2);
+  if (q1 == ELObj::noQuantity) 
+    return argError(interp, loc,
+                   InterpreterMessages::notAQuantity, 0, argv[0]);
+  else if (dim1 != 0) {
+    if (!argv[1]->exactIntegerValue(n2))
+      return argError(interp, loc,
+                     InterpreterMessages::notAnExactInteger, 1, argv[1]);
+    return new (interp) QuantityObj(pow(d1,n2), dim1*n2);
+  }
+  else {
+    if ((q2 == ELObj::noQuantity) || (dim2 != 0))
+      return argError(interp, loc,
+                     InterpreterMessages::notANumber, 1, argv[1]);
+    double res = pow(d1, d2);
+    long tem;
+    if (argv[0]->exactIntegerValue(tem) &&
+        argv[1]->exactIntegerValue(tem) &&
+        fabs(res) < LONG_MAX)
+      return interp.makeInteger((long)res);
+    return new (interp) RealObj(res);
+  }
+}
+
+DEFPRIMITIVE(Expt, argc, argv, context, interp, loc)
+{
+  double d, d2;
+  if (!argv[0]->realValue(d)) 
+    return argError(interp, loc,
+                   InterpreterMessages::notANumber, 0, argv[0]);
+  if (!argv[1]->realValue(d2)) 
+    return argError(interp, loc,
+                   InterpreterMessages::notANumber, 1, argv[1]);
+  double res = pow(d, d2);
+  long tem;
+  if (argv[0]->exactIntegerValue(tem) &&
+      argv[1]->exactIntegerValue(tem) &&
+      fabs(res) < LONG_MAX)
+    return interp.makeInteger((long)res);
+  return new (interp) RealObj(res);
+}
+
+DEFPRIMITIVE(ExactToInexact, argc, argv, context, interp, loc)
+{
+  long n;
+  double d;
+  int dim;
+  switch (argv[0]->quantityValue(n, d, dim)) {
+  case ELObj::noQuantity:     
+    return argError(interp, loc,
+                   InterpreterMessages::notAQuantity, 0, argv[0]);
+  case ELObj::doubleQuantity:     
+    return argv[0]; 
+  case ELObj::longQuantity:    
+    argv[0]->realValue(d);
+    return new (interp) RealObj(d);
+  default:
+    CANNOT_HAPPEN();
+  }
+}
+
+DEFPRIMITIVE(InexactToExact, argc, argv, context, interp, loc)
+{
+  long n;
+  double d;
+  int dim;
+  switch (argv[0]->quantityValue(n, d, dim)) {
+  case ELObj::noQuantity:     
+    return argError(interp, loc,
+                   InterpreterMessages::notAQuantity, 0, argv[0]);
+  case ELObj::doubleQuantity:     
+   if (argv[0]->realValue(d) && modf(d, &d) == 0.0
+       && fabs(d) < LONG_MAX && dim == 0) 
+      return interp.makeInteger((long)d);
+   interp.setNextLocation(loc);
+   interp.message(InterpreterMessages::noExactRepresentation,
+                  ELObjMessageArg(argv[0], interp));
+  case ELObj::longQuantity:  // fall through
+    return argv[0]; 
+  default:
+    CANNOT_HAPPEN();
+  }
+}
+
+DEFPRIMITIVE(QuantityToNumber, argc, argv, context, interp, loc)
+{
+  // FIXME this is wrong, but what exactly is the
+  // `number of the quantity' ???
+  long n;
+  double d;
+  int dim;
+  switch (argv[0]->quantityValue(n, d, dim)) {
+  case ELObj::noQuantity:     
+    return argError(interp, loc,
+                   InterpreterMessages::notAQuantity, 0, argv[0]);
+  case ELObj::doubleQuantity:     
+    if (dim == 0) 
+      return new (interp) RealObj(d);
+    else
+      return new (interp) RealObj(d * pow(0.0254/interp.unitsPerInch(), dim));
+  case ELObj::longQuantity:  
+    if (dim == 0)
+      return interp.makeInteger(n); 
+    else
+      return new (interp) RealObj(n * pow(0.0254/interp.unitsPerInch(), dim));
+  default:
+    CANNOT_HAPPEN();
+  }
+}
+
+DEFPRIMITIVE(StringToList, argc, argv, context, interp, loc)
+{
+  const Char *s;
+  size_t n;
+  if (!argv[0]->stringData(s, n))
+    return argError(interp, loc,
+                    InterpreterMessages::notAString, 0, argv[0]);
+  ELObjDynamicRoot protect(interp, interp.makeNil());
+  for (int i = n; i > 0; i--) {
+    // We have to do it in this order, to ensure that no object is GC'ed
+    PairObj *p = interp.makePair(0, protect);
+    protect = p;
+    p->setCar(interp.makeChar(s[i - 1]));
+  }
+  return protect;
+}
+
+DEFPRIMITIVE(ListToString, argc, argv, context, interp, loc)
+{
+  StringObj *obj = new (interp) StringObj;
+  ELObj *list = argv[0];
+  for (;;) {
+    PairObj *pair = list->asPair();
+    if (pair) {
+      Char c;
+      if (!pair->car()->charValue(c))
+        return argError(interp, loc,
+                        InterpreterMessages::notACharList, 0, list);
+      *obj += c;
+      list = pair->cdr();
+    } else if (list->isNil())
+      break;
+    else
+      return argError(interp, loc,
+                      InterpreterMessages::notAList, 0, list);
+  }
+  return obj;
+}
+          
+static time_t timeConv(const Char *s, size_t n)
+{
+  char buf[100];
+  unsigned i;
+  
+  for ( i = 0; i < n && i < (sizeof(buf) - 1); i++) 
+    buf[i] = char(s[i]);
+  buf[i] = 0;
+  time_t    today_sec = time(NULL);
+  struct tm tim, *today;
+  int       nparsed;
+
+  today = localtime(&today_sec);
+  
+  /* First try to parse as time string without date */
+  /* Defaults are same as of today */
+  memcpy(&tim, today, sizeof(tim));
+  nparsed = sscanf(buf, "%d:%d:%d", 
+                  &tim.tm_hour,
+                  &tim.tm_min,
+                  &tim.tm_sec);
+
+  /* If we got only one number, it could be
+     a year so try to parse complete format */
+  if ( nparsed < 2 ) {
+    /* Defaults are set to zero */
+    memset( &tim, 0, sizeof(tim) );
+
+    /* This accepts any non digit character between 
+       the date and time spec 
+    */
+    nparsed = sscanf(buf, "%d-%d-%d%*[^0-9]%d:%d:%d", 
+                    &tim.tm_year,
+                    &tim.tm_mon,
+                    &tim.tm_mday,
+                    &tim.tm_hour,
+                    &tim.tm_min,
+                    &tim.tm_sec);
+    switch (nparsed) {
+    case 0:
+       /* Invalid parse */
+       return (time_t)-1;
+       /* Not reached */
+    case 1:
+       /* We only got a year set to January First 
+          Month is already set to 0
+       */
+       /* Fall through */
+    case 2:
+       tim.tm_mday = 1;
+       /* Fall through to month normalization */
+    default:
+       tim.tm_mon -= 1;
+       break;
+    }
+
+    if (tim.tm_year < 38 )
+      tim.tm_year += 100; /* Y2K workaround */
+    else if (tim.tm_year >= 1900)
+      tim.tm_year -= 1900;
+  }
+  
+  return mktime(&tim); 
+}
+
+#define DEFTIMECOMP(NAME, OP) \
+DEFPRIMITIVE(NAME, argc, argv, context, interp, loc) \
+{ \
+  const Char *s1, *s2; \
+  size_t n1, n2; \
+  time_t t1, t2; \
+  if (!argv[0]->stringData(s1, n1)) \
+    return argError(interp, loc, \
+                    InterpreterMessages::notAString, 0, argv[0]); \
+  if (!argv[1]->stringData(s2, n2)) \
+    return argError(interp, loc, \
+                    InterpreterMessages::notAString, 1, argv[1]); \
+  if ( (t1 = timeConv(s1, n1)) == (time_t)-1 ) \
+    return argError(interp, loc, \
+                    InterpreterMessages::notATimeString, 0, argv[0]); \
+  if ( (t2 = timeConv(s2, n2)) == (time_t)-1 ) \
+    return argError(interp, loc, \
+                    InterpreterMessages::notATimeString, 1, argv[1]); \
+  if (timeConv(s1, n1) OP timeConv(s2, n2)) \
+    return interp.makeTrue(); \
+  else \
+    return interp.makeFalse(); \
+}
+
+DEFTIMECOMP(TimeLess, < )
+DEFTIMECOMP(TimeGreater, > )
+DEFTIMECOMP(TimeLessOrEqual, <= )
+DEFTIMECOMP(TimeGreaterOrEqual, >= )
+
+DEFPRIMITIVE(MapConstructor, argc, argv, context, interp, loc)
+{
+  FunctionObj *func = argv[0]->asFunction();
+  if (!func)
+    return argError(interp, loc,
+                   InterpreterMessages::notAProcedure, 0, argv[0]);
+  if (func->totalArgs() > 0) {
+    interp.setNextLocation(loc);
+    interp.message(InterpreterMessages::tooManyArgs);
+    return interp.makeError();
+  }
+  NodeListObj *nl = argv[1]->asNodeList();
+  ELObjDynamicRoot protect1(interp, nl);
+  if (!nl)
+    return argError(interp, loc,
+                   InterpreterMessages::notANodeList, 1, argv[1]);
+  AppendSosofoObj *obj = new (interp) AppendSosofoObj;
+  ELObjDynamicRoot protect2(interp, obj);
+  NodePtr nd;
+  ELObj *ret;
+  InsnPtr insn(func->makeCallInsn(0, interp, loc, InsnPtr()));
+  VM vm(context, interp);
+  while (nd = nl->nodeListFirst(context, interp)) {
+    nl = nl->nodeListRest(context, interp);
+    protect1 = nl;
+    EvalContext::CurrentNodeSetter cns(nd, context.processingMode, vm);
+    ret = vm.eval(insn.pointer());
+    if (!ret->asSosofo()) { 
+      interp.setNextLocation(loc);
+      interp.message(InterpreterMessages::returnNotSosofo); 
+      return interp.makeError();
+    }
+    obj->append(ret->asSosofo());
+  }
+  return obj;
+}
+
+void Interpreter::installPrimitives()
+{
+#define PRIMITIVE(name, string, nRequired, nOptional, rest) \
+  installPrimitive(string, new (*this) name ## PrimitiveObj);
+#define XPRIMITIVE(name, string, nRequired, nOptional, rest) \
+  installXPrimitive("UNREGISTERED::James Clark//Procedure::", \
+                    string, new (*this) name ## PrimitiveObj);
+#define XXPRIMITIVE(name, string, nRequired, nOptional, rest) \
+  installXPrimitive("UNREGISTERED::OpenJade//Procedure::", \
+                    string, new (*this) name ## PrimitiveObj);
+
+#define PRIMITIVE2(name, string, nRequired, nOptional, rest) \
+  if (dsssl2()) installPrimitive(string, new (*this) name ## PrimitiveObj);
+#include "primitive.h"
+#undef PRIMITIVE
+#undef XPRIMITIVE
+#undef XXPRIMITIVE
+#undef PRIMITIVE2
+  FunctionObj *apply = new (*this) ApplyPrimitiveObj;
+  makePermanent(apply);
+  lookup(makeStringC("apply"))->setValue(apply);
+  if (dsssl2()) {
+    FunctionObj *callCC = new (*this) CallWithCurrentContinuationPrimitiveObj;
+    makePermanent(callCC);
+    lookup(makeStringC("call-with-current-continuation"))->setValue(callCC);
+  }
+  if (dsssl2())
+    lookup(makeStringC("string->quantity"))
+      ->setValue(lookup(makeStringC("string->number"))->computeValue(0, *this));
+}
+
+void Interpreter::installPrimitive(const char *s, PrimitiveObj *value)
+{
+  makePermanent(value);
+  Identifier *ident = lookup(makeStringC(s));
+  ident->setValue(value);
+  value->setIdentifier(ident);
+  StringC pubid(makeStringC("ISO/IEC 10179:1996//Procedure::"));
+  pubid += makeStringC(s);
+  externalProcTable_.insert(pubid, value);
+}
+
+void Interpreter::installXPrimitive(const char *prefix, const char *s, 
+                                    PrimitiveObj *value)
+{
+  makePermanent(value);
+  value->setIdentifier(lookup(makeStringC(s)));
+  StringC pubid(makeStringC(prefix));
+  pubid += makeStringC(s);
+  externalProcTable_.insert(pubid, value);
+}
+
+DescendantsNodeListObj::DescendantsNodeListObj(const NodePtr &start, unsigned depth)
+: start_(start), depth_(depth)
+{
+  advance(start_, depth_);
+}
+
+NodePtr DescendantsNodeListObj::nodeListFirst(EvalContext &, Interpreter &)
+{
+  return start_;
+}
+
+NodeListObj *DescendantsNodeListObj::nodeListRest(EvalContext &context, Interpreter &interp)
+{
+  DescendantsNodeListObj *obj = new (interp) DescendantsNodeListObj(*this);
+  advance(obj->start_, obj->depth_);
+  return obj;
+}
+
+NodeListObj *DescendantsNodeListObj::nodeListChunkRest(EvalContext &context, Interpreter &interp, bool &chunk)
+{
+  DescendantsNodeListObj *obj = new (interp) DescendantsNodeListObj(*this);
+  chunkAdvance(obj->start_, obj->depth_);
+  chunk = 1;
+  return obj;
+}
+
+void DescendantsNodeListObj::advance(NodePtr &nd, unsigned &depth)
+{
+  if (!nd)
+    return;
+  if (nd.assignFirstChild() == accessOK) {
+    depth++;
+    return;
+  }
+  if (depth == 0) {
+    nd.clear();
+    return;
+  }
+  while (nd.assignNextSibling() != accessOK) {
+    if (depth == 1 || nd.assignOrigin() != accessOK) {
+      nd.clear();
+      return;
+    }
+    depth--;
+  }
+}
+
+void DescendantsNodeListObj::chunkAdvance(NodePtr &nd, unsigned &depth)
+{
+  if (!nd)
+    return;
+  if (nd.assignFirstChild() == accessOK) {
+    depth++;
+    return;
+  }
+  if (depth == 0) {
+    nd.clear();
+    return;
+  }
+  while (nd.assignNextChunkSibling() != accessOK) {
+    if (depth == 1 || nd.assignOrigin() != accessOK) {
+      nd.clear();
+      return;
+    }
+    depth--;
+  }
+}
+
+SelectByClassNodeListObj::SelectByClassNodeListObj(NodeListObj *nl, ComponentName::Id cls)
+: nodeList_(nl), cls_(cls)
+{
+  hasSubObjects_ = 1;
+}
+
+NodePtr SelectByClassNodeListObj::nodeListFirst(EvalContext &context, Interpreter &interp)
+{
+  for (;;) {
+    NodePtr nd = nodeList_->nodeListFirst(context, interp);
+    if (!nd || nd->classDef().className == cls_)
+      return nd;
+    // All nodes in a chunk have the same class
+    bool chunk;
+    nodeList_ = nodeList_->nodeListChunkRest(context, interp, chunk);
+  }
+  // not reached
+  return NodePtr();
+}
+
+NodeListObj *SelectByClassNodeListObj::nodeListRest(EvalContext &context, Interpreter &interp)
+{
+  for (;;) {
+    NodePtr nd = nodeList_->nodeListFirst(context, interp);
+    if (!nd || nd->classDef().className == cls_)
+      break;
+    // All nodes in a chunk have the same class
+    bool chunk;
+    nodeList_ = nodeList_->nodeListChunkRest(context, interp, chunk);
+  }
+  NodeListObj *tem = nodeList_->nodeListRest(context, interp);
+  ELObjDynamicRoot protect(interp, tem);
+  return new (interp) SelectByClassNodeListObj(tem, cls_);
+}
+
+NodeListObj *SelectByClassNodeListObj::nodeListChunkRest(EvalContext &context, Interpreter &interp, bool &chunk)
+{
+  for (;;) {
+    NodePtr nd = nodeList_->nodeListFirst(context, interp);
+    if (!nd)
+      return interp.makeEmptyNodeList();
+    if (nd->classDef().className == cls_)
+      break;
+    bool tem;
+    nodeList_ = nodeList_->nodeListChunkRest(context, interp, tem);
+  }
+  NodeListObj *tem = nodeList_->nodeListChunkRest(context, interp, chunk);
+  ELObjDynamicRoot protect(interp, tem);
+  return new (interp) SelectByClassNodeListObj(tem, cls_);
+}
+
+void SelectByClassNodeListObj::traceSubObjects(Collector &c) const
+{
+  c.trace(nodeList_);
+}
+
+MapNodeListObj::MapNodeListObj(FunctionObj *func, NodeListObj *nl,
+                              const ConstPtr<Context> &context,
+                              NodeListObj *mapped)
+: func_(func), nl_(nl), context_(context), mapped_(mapped)
+{
+  hasSubObjects_ = 1;
+}
+
+NodePtr MapNodeListObj::nodeListFirst(EvalContext &context, Interpreter &interp)
+{
+  for (;;) {
+    if (!mapped_) {
+      mapNext(context, interp);
+      if (!mapped_)
+       break;
+    }
+    NodePtr nd = mapped_->nodeListFirst(context, interp);
+    if (nd)
+      return nd;
+    mapped_ = 0;
+  }
+  return NodePtr();
+}
+
+NodeListObj *MapNodeListObj::nodeListRest(EvalContext &context, Interpreter &interp)
+{
+  for (;;) {
+    if (!mapped_) {
+      mapNext(context, interp);
+      if (!mapped_)
+       break;
+    }
+    NodePtr nd = mapped_->nodeListFirst(context, interp);
+    if (nd) {
+      NodeListObj *tem = mapped_->nodeListRest(context, interp);
+      ELObjDynamicRoot protect(interp, tem);
+      return new (interp) MapNodeListObj(func_, nl_, context_, tem);
+    }
+    mapped_ = 0;
+  }
+  return interp.makeEmptyNodeList();
+}
+
+void MapNodeListObj::mapNext(EvalContext &context, Interpreter &interp)
+{
+  if (!func_)
+    return;
+  NodePtr nd = nl_->nodeListFirst(context, interp);
+  if (!nd)
+    return;
+  VM vm(context, interp);
+  context_->set(vm);
+  InsnPtr insn(func_->makeCallInsn(1, interp, context_->loc, InsnPtr()));
+  ELObj *ret = vm.eval(insn.pointer(), 0, new (interp) NodePtrNodeListObj(nd));
+  if (interp.isError(ret)) {
+    func_ = 0;
+    return;
+  }
+  mapped_ = ret->asNodeList();
+  if (!mapped_) {
+    interp.setNextLocation(context_->loc);
+    interp.message(InterpreterMessages::returnNotNodeList);
+    func_ = 0;
+    return;
+  }
+  nl_ = nl_->nodeListRest(context, interp);
+}
+
+void MapNodeListObj::traceSubObjects(Collector &c) const
+{
+  c.trace(nl_);
+  c.trace(func_);
+  c.trace(mapped_);
+  context_->traceSubObjects(c);
+}
+
+bool MapNodeListObj::suppressError()
+{
+  return func_ == 0;
+}
+
+MapNodeListObj::Context::Context(const EvalContext &context, const Location &l)
+: loc(l),
+  haveStyleStack_(context.styleStack != 0),
+  processingMode_(context.processingMode),
+  currentNode_(context.currentNode),
+  overridingStyle_(context.overridingStyle)
+{
+}
+
+void MapNodeListObj::Context::set(EvalContext &context) const
+{
+  context.processingMode = processingMode_;
+  context.currentNode = currentNode_;
+  context.overridingStyle = overridingStyle_;
+  if (!haveStyleStack_)
+    context.styleStack = 0;
+}
+
+void MapNodeListObj::Context::traceSubObjects(Collector &c) const
+{
+  c.trace(overridingStyle_);
+}
+
+SelectElementsNodeListObj::SelectElementsNodeListObj(NodeListObj *nodeList,
+                                                    const ConstPtr<PatternSet> &patterns)
+: nodeList_(nodeList), patterns_(patterns)
+{
+  ASSERT(!patterns_.isNull());
+  hasSubObjects_ = 1;
+}
+
+SelectElementsNodeListObj::SelectElementsNodeListObj(NodeListObj *nodeList,
+                                                    NCVector<Pattern> &patterns)
+: nodeList_(nodeList)
+{
+  hasSubObjects_ = 1;
+  Ptr<PatternSet> tem(new PatternSet);
+  tem->swap(patterns);
+  patterns_ = tem;
+}
+
+void SelectElementsNodeListObj::traceSubObjects(Collector &c) const
+{
+  c.trace(nodeList_);
+}
+
+NodePtr SelectElementsNodeListObj::nodeListFirst(EvalContext &context, Interpreter &interp)
+{
+  for (;;) {
+    NodePtr nd = nodeList_->nodeListFirst(context, interp);
+    if (!nd)
+      return nd;
+    for (size_t i = 0; i < patterns_->size(); i++)
+      if ((*patterns_)[i].matches(nd, interp))
+        return nd;
+    bool chunk;
+    nodeList_ = nodeList_->nodeListChunkRest(context, interp, chunk);
+  }
+  // not reached
+  return NodePtr();
+}
+
+NodeListObj *SelectElementsNodeListObj::nodeListRest(EvalContext &context, Interpreter &interp)
+{
+  for (;;) {
+    NodePtr nd = nodeList_->nodeListFirst(context, interp);
+    if (!nd)
+      break;
+    bool matched = 0;
+    for (size_t i = 0; i < patterns_->size(); i++) {
+      if ((*patterns_)[i].matches(nd, interp)) {
+        matched = 1;
+        break;
+      }
+    }
+    if (matched)
+      break;
+    bool chunk;
+    nodeList_ = nodeList_->nodeListChunkRest(context, interp, chunk);
+  }
+  bool chunk;
+  NodeListObj *tem = nodeList_->nodeListChunkRest(context, interp, chunk);
+  ELObjDynamicRoot protect(interp, tem);
+  return new (interp) SelectElementsNodeListObj(tem, patterns_);
+}
+
+SiblingNodeListObj::SiblingNodeListObj(const NodePtr &first, const NodePtr &end)
+: first_(first), end_(end)
+{
+}
+
+NodePtr SiblingNodeListObj::nodeListFirst(EvalContext &, Interpreter &)
+{
+  if (*first_ == *end_)
+    return NodePtr();
+  return first_;
+}
+
+NodeListObj *SiblingNodeListObj::nodeListRest(EvalContext &context, Interpreter &interp)
+{
+  if (*first_ == *end_)
+    return interp.makeEmptyNodeList();
+  NodePtr nd;
+  if (first_->nextSibling(nd) != accessOK)
+    CANNOT_HAPPEN();
+  return new (interp) SiblingNodeListObj(nd, end_);
+}
+
+NodeListObj *SiblingNodeListObj::nodeListChunkRest(EvalContext &context, Interpreter &interp, bool &chunk)
+{
+  if (first_->chunkContains(*end_)) {
+    chunk = 0;
+    return nodeListRest(context, interp);
+  }
+  NodePtr nd;
+  if (first_->nextChunkSibling(nd) != accessOK)
+    CANNOT_HAPPEN();
+  chunk = 1;
+  return new (interp) SiblingNodeListObj(nd, end_);
+}
+
+#ifdef DSSSL_NAMESPACE
+}
+#endif
+
+#include "primitive_inst.cxx"
diff --git a/style/primitive.h b/style/primitive.h
new file mode 100644 (file)
index 0000000..8de00af
--- /dev/null
@@ -0,0 +1,235 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+PRIMITIVE(Cons, "cons", 2, 0, 0)
+PRIMITIVE(List, "list", 0, 0, 1)
+PRIMITIVE(IsNull, "null?", 1, 0, 0)
+PRIMITIVE(IsList, "list?", 1, 0, 0)
+PRIMITIVE(IsPair, "pair?", 1, 0, 0)
+PRIMITIVE(IsEqual, "equal?", 2, 0, 0)
+PRIMITIVE(Car, "car", 1, 0, 0)
+PRIMITIVE(Cdr, "cdr", 1, 0, 0)
+PRIMITIVE(Length, "length", 1, 0, 0)
+PRIMITIVE(Append, "append", 0, 0, 1)
+PRIMITIVE(Reverse, "reverse", 1, 0, 0)
+PRIMITIVE(ListTail, "list-tail", 2, 0, 0)
+PRIMITIVE(ListRef, "list-ref", 2, 0, 0)
+PRIMITIVE(Member, "member", 2, 0, 0)
+PRIMITIVE(Not, "not", 1, 0, 0)
+PRIMITIVE(IsSymbol, "symbol?", 1, 0, 0)
+PRIMITIVE(IsKeyword, "keyword?", 1, 0, 0)
+PRIMITIVE(IsBoolean, "boolean?", 1, 0, 0)
+PRIMITIVE(IsProcedure, "procedure?", 1, 0, 0)
+PRIMITIVE(IsString, "string?", 1, 0, 0)
+PRIMITIVE(IsInteger, "integer?", 1, 0, 0)
+PRIMITIVE(IsReal, "real?", 1, 0, 0)
+PRIMITIVE(IsNumber, "number?", 1, 0, 0)
+PRIMITIVE(IsQuantity, "quantity?", 1, 0, 0)
+PRIMITIVE(IsChar, "char?", 1, 0, 0)
+PRIMITIVE(IsCharEqual, "char=?", 2, 0, 0)
+PRIMITIVE(String, "string", 0, 0, 1)
+PRIMITIVE(SymbolToString, "symbol->string", 1, 0, 0)
+PRIMITIVE(StringToSymbol, "string->symbol", 1, 0, 0)
+PRIMITIVE(StringLength, "string-length", 1, 0, 0)
+PRIMITIVE(IsStringEqual, "string=?", 2, 0, 0)
+PRIMITIVE(StringAppend, "string-append", 0, 0, 1)
+PRIMITIVE(StringRef, "string-ref", 2, 0, 0)
+PRIMITIVE(Substring, "substring", 3, 0, 0)
+PRIMITIVE(Equal, "=", 0, 0, 1)
+PRIMITIVE(Plus, "+", 0, 0, 1)
+PRIMITIVE(Minus, "-", 1, 0, 1)
+PRIMITIVE(Multiply, "*", 0, 0, 1)
+PRIMITIVE(Divide, "/", 1, 0, 1)
+PRIMITIVE(Quotient, "quotient", 2, 0, 0)
+PRIMITIVE(Remainder, "remainder", 2, 0, 0)
+PRIMITIVE(Modulo, "modulo", 2, 0, 0)
+PRIMITIVE(Less, "<", 0, 0, 1)
+PRIMITIVE(Greater, ">", 0, 0, 1)
+PRIMITIVE(LessEqual, "<=", 0, 0, 1)
+PRIMITIVE(GreaterEqual, ">=", 0, 0, 1)
+PRIMITIVE(Min, "min", 1, 0, 1)
+PRIMITIVE(Max, "max", 1, 0, 1)
+PRIMITIVE(Floor, "floor", 1, 0, 0)
+PRIMITIVE(Ceiling, "ceiling", 1, 0, 0)
+PRIMITIVE(Truncate, "truncate", 1, 0, 0)
+PRIMITIVE(Round, "round", 1, 0, 0)
+PRIMITIVE(Abs, "abs", 1, 0, 0)
+PRIMITIVE(Sqrt, "sqrt", 1, 0, 0)
+PRIMITIVE(Time, "time", 0, 0, 0)
+PRIMITIVE(TimeToString, "time->string", 1, 1, 0)
+PRIMITIVE(CharProperty, "char-property", 2, 1, 0)
+PRIMITIVE(Literal, "literal", 0, 0, 1)
+PRIMITIVE(ProcessChildren, "process-children", 0, 0, 0)
+PRIMITIVE(ProcessChildrenTrim, "process-children-trim", 0, 0, 0)
+PRIMITIVE(SosofoAppend, "sosofo-append", 0, 0, 1)
+PRIMITIVE(NextMatch, "next-match", 0, 1, 0)
+PRIMITIVE(EmptySosofo, "empty-sosofo", 0, 0, 0)
+PRIMITIVE(SosofoLabel, "sosofo-label", 2, 0, 0)
+PRIMITIVE(SosofoDiscardLabeled, "sosofo-discard-labeled", 2, 0, 0)
+PRIMITIVE(IsSosofo, "sosofo?", 1, 0, 0)
+PRIMITIVE(IsStyle, "style?", 1, 0, 0)
+PRIMITIVE(MergeStyle, "merge-style", 0, 0, 1)
+PRIMITIVE(ProcessElementWithId, "process-element-with-id", 1, 0, 0)
+PRIMITIVE(ProcessFirstDescendant, "process-first-descendant", 0, 0, 1)
+PRIMITIVE(ProcessMatchingChildren, "process-matching-children", 0, 0, 1)
+PRIMITIVE(ProcessNodeList, "process-node-list", 1, 0, 0)
+PRIMITIVE(CurrentNodePageNumberSosofo, "current-node-page-number-sosofo",
+         0, 0, 0)
+PRIMITIVE(PageNumberSosofo, "page-number-sosofo", 0, 0, 0)
+PRIMITIVE(FormatNumber, "format-number", 2, 0, 0)
+PRIMITIVE(FormatNumberList, "format-number-list", 3, 0, 0)
+PRIMITIVE(Error, "error", 1, 0, 0)
+PRIMITIVE(ExternalProcedure, "external-procedure", 1, 0, 0)
+PRIMITIVE(StringToNumber, "string->number", 1, 1, 0)
+PRIMITIVE(NumberToString, "number->string", 1, 1, 0)
+PRIMITIVE(DisplaySize, "display-size", 0, 0, 0)
+PRIMITIVE(TableUnit, "table-unit", 1, 0, 0)
+PRIMITIVE(IsDisplaySpace, "display-space?", 1, 0, 0)
+PRIMITIVE(DisplaySpace, "display-space", 1, 0, 1)
+PRIMITIVE(IsInlineSpace, "inline-space?", 1, 0, 0)
+PRIMITIVE(InlineSpace, "inline-space", 1, 0, 1)
+PRIMITIVE(IsColor, "color?", 1, 0, 0)
+PRIMITIVE(IsColorSpace, "color-space?", 1, 0, 0)
+PRIMITIVE(Color, "color", 1, 0, 1)
+PRIMITIVE(ColorSpace, "color-space", 1, 0, 1)
+PRIMITIVE(IsAddress, "address?", 1, 0, 0)
+PRIMITIVE(IsAddressLocal, "address-local?", 1, 0, 0)
+PRIMITIVE(IsAddressVisited, "address-visited?", 1, 0, 0)
+PRIMITIVE(CurrentNodeAddress, "current-node-address", 0, 0, 0)
+PRIMITIVE(IdrefAddress, "idref-address", 1, 0, 0)
+PRIMITIVE(EntityAddress, "entity-address", 1, 0, 0)
+PRIMITIVE(SgmlDocumentAddress, "sgml-document-address", 2, 0, 0)
+PRIMITIVE(NodeListAddress, "node-list-address", 1, 0, 0)
+PRIMITIVE(HytimeLinkend, "hytime-linkend", 0, 0, 0)
+PRIMITIVE(CharScriptCase, "char-script-case", 1, 0, 1)
+PRIMITIVE(IsGlyphId, "glyph-id?", 1, 0, 0)
+PRIMITIVE(GlyphId, "glyph-id", 1, 0, 0)
+PRIMITIVE(IsGlyphSubstTable, "glyph-subst-table?", 1, 0, 0)
+PRIMITIVE(GlyphSubstTable, "glyph-subst-table", 1, 0, 0)
+PRIMITIVE(GlyphSubst, "glyph-subst", 2, 0, 0)
+// Core query language
+PRIMITIVE(CurrentNode, "current-node", 0, 0, 0)
+PRIMITIVE(IsNodeListEmpty, "node-list-empty?", 1, 0, 0)
+PRIMITIVE(IsNodeList, "node-list?", 1, 0, 0)
+PRIMITIVE(NodeListError, "node-list-error", 2, 0, 0)
+PRIMITIVE(Gi, "gi", 0, 1, 0)
+PRIMITIVE(FirstChildGi, "first-child-gi", 0, 1, 0)
+PRIMITIVE(Id, "id", 0, 1, 0)
+PRIMITIVE(Parent, "parent", 0, 1, 0)
+PRIMITIVE(Ancestor, "ancestor", 1, 1, 0)
+PRIMITIVE(AttributeString, "attribute-string", 1, 1, 0)
+PRIMITIVE(InheritedAttributeString, "inherited-attribute-string", 1, 1, 0)
+PRIMITIVE(InheritedElementAttributeString, "inherited-element-attribute-string", 2, 1, 0)
+PRIMITIVE(IsFirstSibling, "first-sibling?", 0, 1, 0)
+PRIMITIVE(IsAbsoluteFirstSibling, "absolute-first-sibling?", 0, 1, 0)
+PRIMITIVE(IsLastSibling, "last-sibling?", 0, 1, 0)
+PRIMITIVE(IsAbsoluteLastSibling, "absolute-last-sibling?", 0, 1, 0)
+PRIMITIVE(IsHaveAncestor, "have-ancestor?", 1, 1, 0)
+PRIMITIVE(ChildNumber, "child-number", 0, 1, 0)
+PRIMITIVE(AncestorChildNumber, "ancestor-child-number", 1, 1, 0)
+PRIMITIVE(HierarchicalNumber, "hierarchical-number", 1, 1, 0)
+PRIMITIVE(HierarchicalNumberRecursive, "hierarchical-number-recursive", 1, 1, 0)
+PRIMITIVE(ElementNumber, "element-number", 0, 1, 0)
+PRIMITIVE(ElementNumberList, "element-number-list", 1, 1, 0)
+PRIMITIVE(EntitySystemId, "entity-system-id", 1, 1, 0)
+PRIMITIVE(EntityPublicId, "entity-public-id", 1, 1, 0)
+PRIMITIVE(EntityGeneratedSystemId, "entity-generated-system-id", 1, 1, 0)
+PRIMITIVE(EntityText, "entity-text", 1, 1, 0)
+PRIMITIVE(EntityNotation, "entity-notation", 1, 1, 0)
+PRIMITIVE(EntityType, "entity-type", 1, 1, 0)
+PRIMITIVE(EntityAttributeString, "entity-attribute-string", 2, 1, 0)
+PRIMITIVE(NotationSystemId, "notation-system-id", 1, 1, 0)
+PRIMITIVE(NotationPublicId, "notation-public-id", 1, 1, 0)
+PRIMITIVE(NotationGeneratedSystemId, "notation-generated-system-id", 1, 1, 0)
+PRIMITIVE(GeneralNameNormalize, "general-name-normalize", 1, 1, 0)
+PRIMITIVE(EntityNameNormalize, "entity-name-normalize", 1, 1, 0)
+// Some non-core query language
+PRIMITIVE(NodeListFirst, "node-list-first", 1, 0, 0)
+PRIMITIVE(NodeListRest, "node-list-rest", 1, 0, 0)
+PRIMITIVE(NodeList, "node-list", 0, 0, 1)
+PRIMITIVE(Children, "children", 1, 0, 0)
+PRIMITIVE(Follow, "follow", 1, 0, 0)
+PRIMITIVE(Preced, "preced", 1, 0, 0)
+PRIMITIVE(Descendants, "descendants", 1, 0, 0)
+PRIMITIVE(Attributes, "attributes", 1, 0, 0)
+PRIMITIVE(NodeListNoOrder, "node-list-no-order", 1, 0, 0)
+PRIMITIVE(IsNodeListEqual, "node-list=?", 2, 0, 0)
+PRIMITIVE(IsNamedNodeList, "named-node-list?", 1, 0, 0)
+PRIMITIVE(NamedNode, "named-node", 2, 0, 0)
+PRIMITIVE(NamedNodeListNames, "named-node-list-names", 1, 0, 0)
+PRIMITIVE(NamedNodeListNormalize, "named-node-list-normalize", 3, 0, 0)
+PRIMITIVE(SelectElements, "select-elements", 2, 0, 0)
+PRIMITIVE(Data, "data", 1, 0, 0)
+PRIMITIVE(ElementWithId, "element-with-id", 1, 1, 0)
+PRIMITIVE(EmptyNodeList, "empty-node-list", 0, 0, 0)
+PRIMITIVE(NodeProperty, "node-property", 2, 0, 1)
+PRIMITIVE(SelectByClass, "select-by-class", 2, 0, 0)
+PRIMITIVE(NodeListMap, "node-list-map", 2, 0, 0)
+PRIMITIVE(NodeListRef, "node-list-ref", 2, 0, 0)
+PRIMITIVE(NodeListReverse, "node-list-reverse", 1, 0, 0)
+PRIMITIVE(NodeListLength, "node-list-length", 1, 0, 0)
+PRIMITIVE(SgmlParse, "sgml-parse", 1, 0, 1)
+PRIMITIVE(IsMatchElement, "match-element?", 2, 0, 0)
+// External procedures
+XPRIMITIVE(ReadEntity, "read-entity", 1, 0, 0)
+XPRIMITIVE(Debug, "debug", 1, 0, 0)
+XPRIMITIVE(IfFirstPage, "if-first-page", 2, 0, 0)
+XPRIMITIVE(IfFrontPage, "if-front-page", 2, 0, 0)
+XPRIMITIVE(AllElementNumber, "all-element-number", 0, 1, 0)
+// DSSSL2 procedures
+PRIMITIVE2(IsVector, "vector?", 1, 0, 0)
+PRIMITIVE2(Vector, "vector", 0, 0, 1)
+PRIMITIVE2(VectorRef, "vector-ref", 2, 0, 0)
+PRIMITIVE2(VectorSet, "vector-set!", 3, 0, 0)
+PRIMITIVE2(MakeVector, "make-vector", 1, 1, 0)
+PRIMITIVE2(VectorToList, "vector->list", 1, 0, 0)
+PRIMITIVE2(ListToVector, "list->vector", 1, 0, 0)
+PRIMITIVE2(VectorFill, "vector-fill!", 2, 0, 0)
+PRIMITIVE2(IsEqv, "eqv?", 2, 0, 0)
+PRIMITIVE2(Memv, "memv", 2, 0, 0)
+PRIMITIVE2(QuantityToString, "quantity->string", 1, 1, 0)
+//more non-core expression language
+PRIMITIVE(Assoc, "assoc", 2, 0, 0)
+PRIMITIVE(KeywordToString, "keyword->string", 1, 0, 0)            
+PRIMITIVE(StringToKeyword, "string->keyword", 1, 0, 0)            
+PRIMITIVE(IsExact, "exact?", 1, 0, 0)
+PRIMITIVE(IsInexact, "inexact?", 1, 0, 0)
+PRIMITIVE(IsZero, "zero?", 1, 0, 0)
+PRIMITIVE(IsPositive, "positive?", 1, 0, 0)
+PRIMITIVE(IsNegative, "negative?", 1, 0, 0)
+PRIMITIVE(IsOdd, "odd?", 1, 0, 0)
+PRIMITIVE(IsEven, "even?", 1, 0, 0)
+PRIMITIVE(Exp, "exp", 1, 0, 0)
+PRIMITIVE(Log, "log", 1, 0, 0)
+PRIMITIVE(Sin, "sin", 1, 0, 0)
+PRIMITIVE(Cos, "cos", 1, 0, 0)
+PRIMITIVE(Tan, "tan", 1, 0, 0)
+PRIMITIVE(Asin, "asin", 1, 0, 0)
+PRIMITIVE(Acos, "acos", 1, 0, 0)
+PRIMITIVE(Atan, "atan", 1, 1, 0)
+PRIMITIVE(Expt, "expt", 2, 0, 0)
+PRIMITIVE(ExactToInexact, "exact->inexact", 1, 0, 0)
+PRIMITIVE(InexactToExact, "inexact->exact", 1, 0, 0)
+PRIMITIVE(QuantityToNumber, "quantity->number", 1, 0, 0)
+PRIMITIVE(StringToList, "string->list", 1, 0, 0)
+PRIMITIVE(ListToString, "list->string", 1, 0, 0)
+PRIMITIVE(TimeLess, "time<?", 2, 0, 0)
+PRIMITIVE(TimeGreater, "time>?", 2, 0, 0)
+PRIMITIVE(TimeLessOrEqual, "time<=?", 2, 0, 0)
+PRIMITIVE(TimeGreaterOrEqual, "time>=?", 2, 0, 0)
+PRIMITIVE(IsLanguage, "language?", 1, 0, 0)
+PRIMITIVE(CurrentLanguage, "current-language", 0, 0, 0)
+PRIMITIVE(WithLanguage, "with-language", 2, 0, 0)
+PRIMITIVE(CharLess, "char<?", 2, 0, 0)
+PRIMITIVE(CharLessOrEqual, "char<=?", 2, 0, 0)
+PRIMITIVE(CharUpcase, "char-upcase", 1, 0, 0)
+PRIMITIVE(CharDowncase, "char-downcase", 1, 0, 0)
+PRIMITIVE(StringEquiv, "string-equiv?", 3, 0, 0)
+PRIMITIVE(StringLess, "string<?", 2, 0, 0)
+PRIMITIVE(StringLessOrEqual, "string<=?", 2, 0, 0)
+// more style language
+PRIMITIVE(MapConstructor, "map-constructor", 2, 0, 0)
+// more external procedures
+XXPRIMITIVE(Language, "language", 2, 0, 0)
+XXPRIMITIVE(XSgmlParse, "sgml-parse", 1, 0, 1)
+XXPRIMITIVE(XExpt, "expt", 2, 0, 0)
diff --git a/style/primitive_inst.m4 b/style/primitive_inst.m4
new file mode 100644 (file)
index 0000000..59dc8e1
--- /dev/null
@@ -0,0 +1,43 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#include "stylelib.h"
+
+#ifdef SP_MANUAL_INST
+
+#define SP_DEFINE_TEMPLATES
+#include "Ptr.h"
+#undef SP_DEFINE_TEMPLATES
+
+#if _MSC_VER >= 1100
+
+#ifdef SP_NAMESPACE
+namespace SP_NAMESPACE {
+#endif
+
+#ifdef DSSSL_NAMESPACE
+using namespace DSSSL_NAMESPACE;
+#endif
+
+#ifdef GROVE_NAMESPACE
+using namespace GROVE_NAMESPACE;
+#endif
+
+#else
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+#endif
+
+__instantiate(ConstPtr<MapNodeListObj::Context>)
+__instantiate(Ptr<MapNodeListObj::Context>)
+__instantiate(Ptr<SelectElementsNodeListObj::PatternSet>)
+__instantiate(ConstPtr<SelectElementsNodeListObj::PatternSet>)
+
+#ifdef SP_NAMESPACE
+}
+#endif
+
+#endif /* SP_MANUAL_INST */
diff --git a/style/sdata.h b/style/sdata.h
new file mode 100644 (file)
index 0000000..7096455
--- /dev/null
@@ -0,0 +1,885 @@
+// Unicode code, SDATA entity name
+{ 0x0021, "excl" },
+{ 0x0022, "quot" },
+{ 0x0023, "num" },
+{ 0x0024, "dollar" },
+{ 0x0025, "percnt" },
+{ 0x0026, "amp" },
+{ 0x0027, "apos" },
+{ 0x0028, "lpar" },
+{ 0x0029, "rpar" },
+{ 0x002A, "ast" },
+{ 0x002B, "plus" },
+{ 0x002C, "comma" },
+{ 0x002D, "hyphen" },
+{ 0x002E, "period" },
+{ 0x002F, "sol" },
+{ 0x003A, "colon" },
+{ 0x003B, "semi" },
+{ 0x003C, "lt" },
+{ 0x003D, "equals" },
+{ 0x003E, "gt" },
+{ 0x003F, "quest" },
+{ 0x0040, "commat" },
+{ 0x005B, "lsqb" },
+{ 0x005C, "bsol" },
+{ 0x005D, "rsqb" },
+{ 0x005E, "circ" },
+{ 0x005F, "lowbar" },
+{ 0x0060, "grave" },
+{ 0x007B, "lcub" },
+{ 0x007C, "verbar" },
+{ 0x007D, "rcub" },
+{ 0x007E, "tilde" },
+{ 0x00A0, "nbsp" },
+{ 0x00A1, "iexcl" },
+{ 0x00A2, "cent" },
+{ 0x00A3, "pound" },
+{ 0x00A4, "curren" },
+{ 0x00A5, "yen" },
+{ 0x00A6, "brvbar" },
+{ 0x00A7, "sect" },
+{ 0x00A8, "die" },
+{ 0x00A8, "Dot" },
+{ 0x00A8, "uml" },
+{ 0x00A9, "copy" },
+{ 0x00AA, "ordf" },
+{ 0x00AB, "laquo" },
+{ 0x00AC, "not" },
+{ 0x00AD, "shy" },
+{ 0x00AE, "reg" },
+{ 0x00AF, "macr" },
+{ 0x00B0, "deg" },
+{ 0x00B1, "plusmn" },
+{ 0x00B2, "sup2" },
+{ 0x00B3, "sup3" },
+{ 0x00B4, "acute" },
+{ 0x00B5, "micro" },
+{ 0x00B6, "para" },
+{ 0x00B7, "middot" },
+{ 0x00B8, "cedil" },
+{ 0x00B9, "sup1" },
+{ 0x00BA, "ordm" },
+{ 0x00BB, "raquo" },
+{ 0x00BC, "frac14" },
+{ 0x00BD, "frac12" },
+{ 0x00BE, "frac34" },
+{ 0x00BF, "iquest" },
+{ 0x00C0, "Agrave" },
+{ 0x00C1, "Aacute" },
+{ 0x00C2, "Acirc" },
+{ 0x00C3, "Atilde" },
+{ 0x00C4, "Auml" },
+{ 0x00C5, "Aring" },
+{ 0x00C6, "AElig" },
+{ 0x00C7, "Ccedil" },
+{ 0x00C8, "Egrave" },
+{ 0x00C9, "Eacute" },
+{ 0x00CA, "Ecirc" },
+{ 0x00CB, "Euml" },
+{ 0x00CC, "Igrave" },
+{ 0x00CD, "Iacute" },
+{ 0x00CE, "Icirc" },
+{ 0x00CF, "Iuml" },
+{ 0x00D0, "ETH" },
+{ 0x00D1, "Ntilde" },
+{ 0x00D2, "Ograve" },
+{ 0x00D3, "Oacute" },
+{ 0x00D4, "Ocirc" },
+{ 0x00D5, "Otilde" },
+{ 0x00D6, "Ouml" },
+{ 0x00D7, "times" },
+{ 0x00D8, "Oslash" },
+{ 0x00D9, "Ugrave" },
+{ 0x00DA, "Uacute" },
+{ 0x00DB, "Ucirc" },
+{ 0x00DC, "Uuml" },
+{ 0x00DD, "Yacute" },
+{ 0x00DE, "THORN" },
+{ 0x00DF, "szlig" },
+{ 0x00E0, "agrave" },
+{ 0x00E1, "aacute" },
+{ 0x00E2, "acirc" },
+{ 0x00E3, "atilde" },
+{ 0x00E4, "auml" },
+{ 0x00E5, "aring" },
+{ 0x00E6, "aelig" },
+{ 0x00E7, "ccedil" },
+{ 0x00E8, "egrave" },
+{ 0x00E9, "eacute" },
+{ 0x00EA, "ecirc" },
+{ 0x00EB, "euml" },
+{ 0x00EC, "igrave" },
+{ 0x00ED, "iacute" },
+{ 0x00EE, "icirc" },
+{ 0x00EF, "iuml" },
+{ 0x00F0, "eth" },
+{ 0x00F1, "ntilde" },
+{ 0x00F2, "ograve" },
+{ 0x00F3, "oacute" },
+{ 0x00F4, "ocirc" },
+{ 0x00F5, "otilde" },
+{ 0x00F6, "ouml" },
+{ 0x00F7, "divide" },
+{ 0x00F8, "oslash" },
+{ 0x00F9, "ugrave" },
+{ 0x00FA, "uacute" },
+{ 0x00FB, "ucirc" },
+{ 0x00FC, "uuml" },
+{ 0x00FD, "yacute" },
+{ 0x00FE, "thorn" },
+{ 0x00FF, "yuml" },
+{ 0x0100, "Amacr" },
+{ 0x0101, "amacr" },
+{ 0x0102, "Abreve" },
+{ 0x0103, "abreve" },
+{ 0x0104, "Aogon" },
+{ 0x0105, "aogon" },
+{ 0x0106, "Cacute" },
+{ 0x0107, "cacute" },
+{ 0x0108, "Ccirc" },
+{ 0x0109, "ccirc" },
+{ 0x010A, "Cdot" },
+{ 0x010B, "cdot" },
+{ 0x010C, "Ccaron" },
+{ 0x010D, "ccaron" },
+{ 0x010E, "Dcaron" },
+{ 0x010F, "dcaron" },
+{ 0x0110, "Dstrok" },
+{ 0x0111, "dstrok" },
+{ 0x0112, "Emacr" },
+{ 0x0113, "emacr" },
+{ 0x0116, "Edot" },
+{ 0x0117, "edot" },
+{ 0x0118, "Eogon" },
+{ 0x0119, "eogon" },
+{ 0x011A, "Ecaron" },
+{ 0x011B, "ecaron" },
+{ 0x011C, "Gcirc" },
+{ 0x011D, "gcirc" },
+{ 0x011E, "Gbreve" },
+{ 0x011F, "gbreve" },
+{ 0x0120, "Gdot" },
+{ 0x0121, "gdot" },
+{ 0x0122, "Gcedil" },
+{ 0x0123, "gcedil" },
+{ 0x0124, "Hcirc" },
+{ 0x0125, "hcirc" },
+{ 0x0126, "Hstrok" },
+{ 0x0127, "hstrok" },
+{ 0x0128, "Itilde" },
+{ 0x0129, "itilde" },
+{ 0x012A, "Imacr" },
+{ 0x012B, "imacr" },
+{ 0x012E, "Iogon" },
+{ 0x012F, "iogon" },
+{ 0x0130, "Idot" },
+{ 0x0131, "inodot" },
+{ 0x0132, "IJlig" },
+{ 0x0133, "ijlig" },
+{ 0x0134, "Jcirc" },
+{ 0x0135, "jcirc" },
+{ 0x0136, "Kcedil" },
+{ 0x0137, "kcedil" },
+{ 0x0138, "kgreen" },
+{ 0x0139, "Lacute" },
+{ 0x013A, "lacute" },
+{ 0x013B, "Lcedil" },
+{ 0x013C, "lcedil" },
+{ 0x013D, "Lcaron" },
+{ 0x013E, "lcaron" },
+{ 0x013F, "Lmidot" },
+{ 0x0140, "lmidot" },
+{ 0x0141, "Lstrok" },
+{ 0x0142, "lstrok" },
+{ 0x0143, "Nacute" },
+{ 0x0144, "nacute" },
+{ 0x0145, "Ncedil" },
+{ 0x0146, "ncedil" },
+{ 0x0147, "Ncaron" },
+{ 0x0148, "ncaron" },
+{ 0x0149, "napos" },
+{ 0x014A, "ENG" },
+{ 0x014B, "eng" },
+{ 0x014C, "Omacr" },
+{ 0x014D, "omacr" },
+{ 0x0150, "Odblac" },
+{ 0x0151, "odblac" },
+{ 0x0152, "OElig" },
+{ 0x0153, "oelig" },
+{ 0x0154, "Racute" },
+{ 0x0155, "racute" },
+{ 0x0156, "Rcedil" },
+{ 0x0157, "rcedil" },
+{ 0x0158, "Rcaron" },
+{ 0x0159, "rcaron" },
+{ 0x015A, "Sacute" },
+{ 0x015B, "sacute" },
+{ 0x015C, "Scirc" },
+{ 0x015D, "scirc" },
+{ 0x015E, "Scedil" },
+{ 0x015F, "scedil" },
+{ 0x0160, "Scaron" },
+{ 0x0161, "scaron" },
+{ 0x0162, "Tcedil" },
+{ 0x0163, "tcedil" },
+{ 0x0164, "Tcaron" },
+{ 0x0165, "tcaron" },
+{ 0x0166, "Tstrok" },
+{ 0x0167, "tstrok" },
+{ 0x0168, "Utilde" },
+{ 0x0169, "utilde" },
+{ 0x016A, "Umacr" },
+{ 0x016B, "umacr" },
+{ 0x016C, "Ubreve" },
+{ 0x016D, "ubreve" },
+{ 0x016E, "Uring" },
+{ 0x016F, "uring" },
+{ 0x0170, "Udblac" },
+{ 0x0171, "udblac" },
+{ 0x0172, "Uogon" },
+{ 0x0173, "uogon" },
+{ 0x0174, "Wcirc" },
+{ 0x0175, "wcirc" },
+{ 0x0176, "Ycirc" },
+{ 0x0177, "ycirc" },
+{ 0x0178, "Yuml" },
+{ 0x0179, "Zacute" },
+{ 0x017A, "zacute" },
+{ 0x017B, "Zdot" },
+{ 0x017C, "zdot" },
+{ 0x017D, "Zcaron" },
+{ 0x017E, "zcaron" },
+{ 0x0192, "fnof" },
+{ 0x02C7, "caron" },
+{ 0x02D8, "breve" },
+{ 0x02D9, "dot" },
+{ 0x02DA, "ring" },
+{ 0x02DB, "ogon" },
+{ 0x02DC, "tilde" },
+{ 0x02DD, "dblac" },
+{ 0x0386, "Aacgr" },
+{ 0x0388, "Eacgr" },
+{ 0x0389, "EEacgr" },
+{ 0x038A, "Iacgr" },
+{ 0x038C, "Oacgr" },
+{ 0x038E, "Uacgr" },
+{ 0x038F, "OHacgr" },
+{ 0x0390, "idiagr" },
+{ 0x0391, "Agr" },
+{ 0x0392, "Bgr" },
+{ 0x0393, "Ggr" },
+{ 0x0393, "Gamma" },
+{ 0x0394, "Dgr" },
+{ 0x0394, "Delta" },
+{ 0x0395, "Egr" },
+{ 0x0396, "Zgr" },
+{ 0x0397, "EEgr" },
+{ 0x0398, "THgr" },
+{ 0x0398, "Theta" },
+{ 0x0399, "Igr" },
+{ 0x039A, "Kgr" },
+{ 0x039B, "Lgr" },
+{ 0x039B, "Lambda" },
+{ 0x039C, "Mgr" },
+{ 0x039D, "Ngr" },
+{ 0x039E, "Xgr" },
+{ 0x039E, "Xi" },
+{ 0x039F, "Ogr" },
+{ 0x03A0, "Pgr" },
+{ 0x03A0, "Pi" },
+{ 0x03A1, "Rgr" },
+{ 0x03A3, "Sgr" },
+{ 0x03A3, "Sigma" },
+{ 0x03A4, "Tgr" },
+{ 0x03A5, "Ugr" },
+{ 0x03A5, "Upsi" },
+{ 0x03A6, "PHgr" },
+{ 0x03A6, "Phi" },
+{ 0x03A7, "KHgr" },
+{ 0x03A8, "PSgr" },
+{ 0x03A8, "Psi" },
+{ 0x03A9, "OHgr" },
+{ 0x03A9, "Omega" },
+{ 0x03AA, "Idigr" },
+{ 0x03AB, "Udigr" },
+{ 0x03AC, "aacgr" },
+{ 0x03AD, "eacgr" },
+{ 0x03AE, "eeacgr" },
+{ 0x03AF, "iacgr" },
+{ 0x03B0, "udiagr" },
+{ 0x03B1, "agr" },
+{ 0x03B1, "alpha" },
+{ 0x03B2, "bgr" },
+{ 0x03B2, "beta" },
+{ 0x03B3, "ggr" },
+{ 0x03B3, "gamma" },
+{ 0x03B4, "dgr" },
+{ 0x03B4, "delta" },
+{ 0x03B5, "egr" },
+{ 0x03B5, "epsi" },
+{ 0x03B6, "zgr" },
+{ 0x03B6, "zeta" },
+{ 0x03B7, "eegr" },
+{ 0x03B7, "eta" },
+{ 0x03B8, "thetas" },
+{ 0x03B8, "thgr" },
+{ 0x03B9, "igr" },
+{ 0x03B9, "iota" },
+{ 0x03BA, "kgr" },
+{ 0x03BA, "kappa" },
+{ 0x03BB, "lgr" },
+{ 0x03BB, "lambda" },
+{ 0x03BC, "mgr" },
+{ 0x03BC, "mu" },
+{ 0x03BD, "ngr" },
+{ 0x03BD, "nu" },
+{ 0x03BE, "xgr" },
+{ 0x03BE, "xi" },
+{ 0x03BF, "ogr" },
+{ 0x03C0, "pgr" },
+{ 0x03C0, "pi" },
+{ 0x03C1, "rgr" },
+{ 0x03C1, "rho" },
+{ 0x03C2, "sfgr" },
+{ 0x03C2, "sigmav" },
+{ 0x03C3, "sgr" },
+{ 0x03C3, "sigma" },
+{ 0x03C4, "tgr" },
+{ 0x03C4, "tau" },
+{ 0x03C5, "ugr" },
+{ 0x03C5, "upsi" },
+{ 0x03C6, "phgr" },
+{ 0x03C6, "phis" },
+{ 0x03C7, "khgr" },
+{ 0x03C7, "chi" },
+{ 0x03C8, "psgr" },
+{ 0x03C8, "psi" },
+{ 0x03C9, "ohgr" },
+{ 0x03C9, "omega" },
+{ 0x03CA, "idigr" },
+{ 0x03CB, "udigr" },
+{ 0x03CC, "oacgr" },
+{ 0x03CD, "uacgr" },
+{ 0x03CE, "ohacgr" },
+{ 0x03D1, "thetav" },
+{ 0x03D5, "phiv" },
+{ 0x03D6, "piv" },
+{ 0x03DD, "gammad" },
+{ 0x03F0, "kappav" },
+{ 0x03F1, "rhov" },
+{ 0x0401, "IOcy" },
+{ 0x0402, "DJcy" },
+{ 0x0403, "GJcy" },
+{ 0x0404, "Jukcy" },
+{ 0x0405, "DScy" },
+{ 0x0406, "Iukcy" },
+{ 0x0407, "YIcy" },
+{ 0x0408, "Jsercy" },
+{ 0x0409, "LJcy" },
+{ 0x040A, "NJcy" },
+{ 0x040B, "TSHcy" },
+{ 0x040C, "KJcy" },
+{ 0x040E, "Ubrcy" },
+{ 0x040F, "DZcy" },
+{ 0x0410, "Acy" },
+{ 0x0411, "Bcy" },
+{ 0x0412, "Vcy" },
+{ 0x0413, "Gcy" },
+{ 0x0414, "Dcy" },
+{ 0x0415, "IEcy" },
+{ 0x0416, "ZHcy" },
+{ 0x0417, "Zcy" },
+{ 0x0418, "Icy" },
+{ 0x0419, "Jcy" },
+{ 0x041A, "Kcy" },
+{ 0x041B, "Lcy" },
+{ 0x041C, "Mcy" },
+{ 0x041D, "Ncy" },
+{ 0x041E, "Ocy" },
+{ 0x041F, "Pcy" },
+{ 0x0420, "Rcy" },
+{ 0x0421, "Scy" },
+{ 0x0422, "Tcy" },
+{ 0x0423, "Ucy" },
+{ 0x0424, "Fcy" },
+{ 0x0425, "KHcy" },
+{ 0x0426, "TScy" },
+{ 0x0427, "CHcy" },
+{ 0x0428, "SHcy" },
+{ 0x0429, "SHCHcy" },
+{ 0x042A, "HARDcy" },
+{ 0x042B, "Ycy" },
+{ 0x042C, "SOFTcy" },
+{ 0x042D, "Ecy" },
+{ 0x042E, "YUcy" },
+{ 0x042F, "YAcy" },
+{ 0x0430, "acy" },
+{ 0x0431, "bcy" },
+{ 0x0432, "vcy" },
+{ 0x0433, "gcy" },
+{ 0x0434, "dcy" },
+{ 0x0435, "iecy" },
+{ 0x0436, "zhcy" },
+{ 0x0437, "zcy" },
+{ 0x0438, "icy" },
+{ 0x0439, "jcy" },
+{ 0x043A, "kcy" },
+{ 0x043B, "lcy" },
+{ 0x043C, "mcy" },
+{ 0x043D, "ncy" },
+{ 0x043E, "ocy" },
+{ 0x043F, "pcy" },
+{ 0x0440, "rcy" },
+{ 0x0441, "scy" },
+{ 0x0442, "tcy" },
+{ 0x0443, "ucy" },
+{ 0x0444, "fcy" },
+{ 0x0445, "khcy" },
+{ 0x0446, "tscy" },
+{ 0x0447, "chcy" },
+{ 0x0448, "shcy" },
+{ 0x0449, "shchcy" },
+{ 0x044A, "hardcy" },
+{ 0x044B, "ycy" },
+{ 0x044C, "softcy" },
+{ 0x044D, "ecy" },
+{ 0x044E, "yucy" },
+{ 0x044F, "yacy" },
+{ 0x0451, "iocy" },
+{ 0x0452, "djcy" },
+{ 0x0453, "gjcy" },
+{ 0x0454, "jukcy" },
+{ 0x0455, "dscy" },
+{ 0x0456, "iukcy" },
+{ 0x0457, "yicy" },
+{ 0x0458, "jsercy" },
+{ 0x0459, "ljcy" },
+{ 0x045A, "njcy" },
+{ 0x045B, "tshcy" },
+{ 0x045C, "kjcy" },
+{ 0x045E, "ubrcy" },
+{ 0x045F, "dzcy" },
+{ 0x2002, "ensp" },
+{ 0x2003, "emsp" },
+{ 0x2004, "emsp13" },
+{ 0x2005, "emsp14" },
+{ 0x2007, "numsp" },
+{ 0x2008, "puncsp" },
+{ 0x2009, "thinsp" },
+{ 0x200A, "hairsp" },
+{ 0x2010, "dash" },
+{ 0x2013, "ndash" },
+{ 0x2014, "mdash" },
+{ 0x2015, "horbar" },
+{ 0x2016, "Verbar" },
+{ 0x2018, "lsquo" },
+{ 0x2018, "rsquor" },
+{ 0x2019, "rsquo" },
+{ 0x201A, "lsquor" },
+{ 0x201C, "ldquo" },
+{ 0x201C, "rdquor" },
+{ 0x201D, "rdquo" },
+{ 0x201E, "ldquor" },
+{ 0x2020, "dagger" },
+{ 0x2021, "Dagger" },
+{ 0x2022, "bull" },
+{ 0x2025, "nldr" },
+{ 0x2026, "hellip" },
+{ 0x2026, "mldr" },
+{ 0x2030, "permil" },
+{ 0x2032, "prime" },
+{ 0x2032, "vprime" },
+{ 0x2033, "Prime" },
+{ 0x2034, "tprime" },
+{ 0x2035, "bprime" },
+{ 0x2041, "caret" },
+{ 0x2043, "hybull" },
+{ 0x20DB, "tdot" },
+{ 0x20DC, "DotDot" },
+{ 0x2105, "incare" },
+{ 0x210B, "hamilt" },
+{ 0x210F, "planck" },
+{ 0x2111, "image" },
+{ 0x2112, "lagran" },
+{ 0x2113, "ell" },
+{ 0x2116, "numero" },
+{ 0x2117, "copysr" },
+{ 0x2118, "weierp" },
+{ 0x211C, "real" },
+{ 0x211E, "rx" },
+{ 0x2122, "trade" },
+{ 0x2126, "ohm" },
+{ 0x212B, "angst" },
+{ 0x212C, "bernou" },
+{ 0x2133, "phmmat" },
+{ 0x2134, "order" },
+{ 0x2135, "aleph" },
+{ 0x2136, "beth" },
+{ 0x2137, "gimel" },
+{ 0x2138, "daleth" },
+{ 0x2153, "frac13" },
+{ 0x2154, "frac23" },
+{ 0x2155, "frac15" },
+{ 0x2156, "frac25" },
+{ 0x2157, "frac35" },
+{ 0x2158, "frac45" },
+{ 0x2159, "frac16" },
+{ 0x215A, "frac56" },
+{ 0x215B, "frac18" },
+{ 0x215C, "frac38" },
+{ 0x215D, "frac58" },
+{ 0x215E, "frac78" },
+{ 0x2190, "larr" },
+{ 0x2191, "uarr" },
+{ 0x2192, "rarr" },
+{ 0x2193, "darr" },
+{ 0x2194, "harr" },
+{ 0x2195, "varr" },
+{ 0x2196, "nwarr" },
+{ 0x2197, "nearr" },
+{ 0x2198, "drarr" },
+{ 0x2199, "dlarr" },
+{ 0x219A, "nlarr" },
+{ 0x219B, "nrarr" },
+{ 0x219D, "rarrw" },
+{ 0x219E, "Larr" },
+{ 0x21A0, "Rarr" },
+{ 0x21A2, "larrtl" },
+{ 0x21A3, "rarrtl" },
+{ 0x21A6, "map" },
+{ 0x21A9, "larrhk" },
+{ 0x21AA, "rarrhk" },
+{ 0x21AB, "larrlp" },
+{ 0x21AC, "rarrlp" },
+{ 0x21AD, "harrw" },
+{ 0x21AE, "nharr" },
+{ 0x21B0, "lsh" },
+{ 0x21B1, "rsh" },
+{ 0x21B6, "cularr" },
+{ 0x21B7, "curarr" },
+{ 0x21BA, "olarr" },
+{ 0x21BB, "orarr" },
+{ 0x21BC, "lharu" },
+{ 0x21BD, "lhard" },
+{ 0x21BE, "uharr" },
+{ 0x21BF, "uharl" },
+{ 0x21C0, "rharu" },
+{ 0x21C1, "rhard" },
+{ 0x21C2, "dharr" },
+{ 0x21C3, "dharl" },
+{ 0x21C4, "rlarr2" },
+{ 0x21C6, "lrarr2" },
+{ 0x21C7, "larr2" },
+{ 0x21C8, "uarr2" },
+{ 0x21C9, "rarr2" },
+{ 0x21CA, "darr2" },
+{ 0x21CB, "lrhar2" },
+{ 0x21CC, "rlhar2" },
+{ 0x21CD, "nlArr" },
+{ 0x21CE, "nhArr" },
+{ 0x21CF, "nrArr" },
+{ 0x21D0, "lArr" },
+{ 0x21D1, "uArr" },
+{ 0x21D2, "rArr" },
+{ 0x21D3, "dArr" },
+{ 0x21D4, "hArr" },
+{ 0x21D4, "iff" },
+{ 0x21D5, "vArr" },
+{ 0x21DA, "lAarr" },
+{ 0x21DB, "rAarr" },
+{ 0x21DD, "rarrw" },
+{ 0x2200, "forall" },
+{ 0x2201, "comp" },
+{ 0x2202, "part" },
+{ 0x2203, "exist" },
+{ 0x2204, "nexist" },
+{ 0x2205, "empty" },
+{ 0x2207, "nabla" },
+{ 0x2208, "isin" },
+{ 0x2209, "notin" },
+{ 0x220A, "epsis" },
+{ 0x220B, "ni" },
+{ 0x220D, "bepsi" },
+{ 0x220F, "prod" },
+{ 0x2210, "coprod" },
+{ 0x2210, "amalg" },
+{ 0x2210, "samalg" },
+{ 0x2211, "sum" },
+{ 0x2212, "minus" },
+{ 0x2213, "mnplus" },
+{ 0x2214, "plusdo" },
+{ 0x2216, "setmn" },
+{ 0x2218, "compfn" },
+{ 0x221A, "radic" },
+{ 0x221D, "vprop" },
+{ 0x221D, "prop" },
+{ 0x221E, "infin" },
+{ 0x221F, "ang90" },
+{ 0x2220, "ang" },
+{ 0x2221, "angmsd" },
+{ 0x2222, "angsph" },
+{ 0x2223, "mid" },
+{ 0x2224, "nmid" },
+{ 0x2225, "par" },
+{ 0x2226, "npar" },
+{ 0x2227, "and" },
+{ 0x2228, "or" },
+{ 0x2229, "cap" },
+{ 0x222A, "cup" },
+{ 0x222B, "int" },
+{ 0x222E, "conint" },
+{ 0x2234, "there4" },
+{ 0x2235, "becaus" },
+{ 0x223C, "thksim" },
+{ 0x223C, "sim" },
+{ 0x223D, "bsim" },
+{ 0x2240, "wreath" },
+{ 0x2241, "nsim" },
+{ 0x2243, "sime" },
+{ 0x2244, "nsime" },
+{ 0x2245, "cong" },
+{ 0x2247, "ncong" },
+{ 0x2248, "thkap" },
+{ 0x2248, "ap" },
+{ 0x2249, "nap" },
+{ 0x224A, "ape" },
+{ 0x224C, "bcong" },
+{ 0x224D, "asymp" },
+{ 0x224E, "bump" },
+{ 0x224F, "bumpe" },
+{ 0x2250, "esdot" },
+{ 0x2251, "eDot" },
+{ 0x2252, "efDot" },
+{ 0x2253, "erDot" },
+{ 0x2254, "colone" },
+{ 0x2255, "ecolon" },
+{ 0x2256, "ecir" },
+{ 0x2257, "cire" },
+{ 0x2259, "wedgeq" },
+{ 0x225C, "trie" },
+{ 0x2260, "ne" },
+{ 0x2261, "equiv" },
+{ 0x2262, "nequiv" },
+{ 0x2264, "le" },
+{ 0x2264, "les" },
+{ 0x2265, "ge" },
+{ 0x2265, "ges" },
+{ 0x2266, "lE" },
+{ 0x2267, "gE" },
+{ 0x2268, "lnE" },
+{ 0x2268, "lvnE" },
+{ 0x2269, "gnE" },
+{ 0x2269, "gvnE" },
+{ 0x226A, "Lt" },
+{ 0x226B, "Gt" },
+{ 0x226C, "twixt" },
+{ 0x226E, "nlt" },
+{ 0x226F, "ngt" },
+{ 0x2270, "nles" },
+{ 0x2270, "nle" },
+{ 0x2271, "nges" },
+{ 0x2271, "nge" },
+{ 0x2272, "lsim" },
+{ 0x2273, "gsim" },
+{ 0x2276, "lg" },
+{ 0x2277, "gl" },
+{ 0x227A, "pr" },
+{ 0x227B, "sc" },
+{ 0x227C, "cupre" },
+{ 0x227D, "sccue" },
+{ 0x227E, "prsim" },
+{ 0x227F, "scsim" },
+{ 0x2280, "npr" },
+{ 0x2281, "nsc" },
+{ 0x2282, "sub" },
+{ 0x2283, "sup" },
+{ 0x2284, "nsub" },
+{ 0x2285, "nsup" },
+{ 0x2286, "sube" },
+{ 0x2287, "supe" },
+{ 0x2288, "nsube" },
+{ 0x2289, "nsupe" },
+{ 0x228A, "subnE" },
+{ 0x228B, "supnE" },
+{ 0x228E, "uplus" },
+{ 0x228F, "sqsub" },
+{ 0x2290, "sqsup" },
+{ 0x2291, "sqsube" },
+{ 0x2292, "sqsupe" },
+{ 0x2293, "sqcap" },
+{ 0x2294, "sqcup" },
+{ 0x2295, "oplus" },
+{ 0x2296, "ominus" },
+{ 0x2297, "otimes" },
+{ 0x2298, "osol" },
+{ 0x2299, "odot" },
+{ 0x229A, "ocir" },
+{ 0x229B, "oast" },
+{ 0x229D, "odash" },
+{ 0x229E, "plusb" },
+{ 0x229F, "minusb" },
+{ 0x22A0, "timesb" },
+{ 0x22A1, "sdotb" },
+{ 0x22A2, "vdash" },
+{ 0x22A3, "dashv" },
+{ 0x22A4, "top" },
+{ 0x22A5, "bottom" },
+{ 0x22A5, "perp" },
+{ 0x22A7, "models" },
+{ 0x22A8, "vDash" },
+{ 0x22A9, "Vdash" },
+{ 0x22AA, "Vvdash" },
+{ 0x22AC, "nvdash" },
+{ 0x22AD, "nvDash" },
+{ 0x22AE, "nVdash" },
+{ 0x22AF, "nVDash" },
+{ 0x22B2, "vltri" },
+{ 0x22B3, "vrtri" },
+{ 0x22B4, "ltrie" },
+{ 0x22B5, "rtrie" },
+{ 0x22B8, "mumap" },
+{ 0x22BA, "intcal" },
+{ 0x22BB, "veebar" },
+{ 0x22BC, "barwed" },
+{ 0x22C4, "diam" },
+{ 0x22C5, "sdot" },
+{ 0x22C6, "sstarf" },
+{ 0x22C7, "divonx" },
+{ 0x22C8, "bowtie" },
+{ 0x22C9, "ltimes" },
+{ 0x22CA, "rtimes" },
+{ 0x22CB, "lthree" },
+{ 0x22CC, "rthree" },
+{ 0x22CD, "bsime" },
+{ 0x22CE, "cuvee" },
+{ 0x22CF, "cuwed" },
+{ 0x22D0, "Sub" },
+{ 0x22D1, "Sup" },
+{ 0x22D2, "Cap" },
+{ 0x22D3, "Cup" },
+{ 0x22D4, "fork" },
+{ 0x22D6, "ldot" },
+{ 0x22D7, "gsdot" },
+{ 0x22D8, "Ll" },
+{ 0x22D9, "Gg" },
+{ 0x22DA, "leg" },
+{ 0x22DB, "gel" },
+{ 0x22DC, "els" },
+{ 0x22DD, "egs" },
+{ 0x22DE, "cuepr" },
+{ 0x22DF, "cuesc" },
+{ 0x22E0, "npre" },
+{ 0x22E1, "nsce" },
+{ 0x22E6, "lnsim" },
+{ 0x22E7, "gnsim" },
+{ 0x22E8, "prnsim" },
+{ 0x22E9, "scnsim" },
+{ 0x22EA, "nltri" },
+{ 0x22EB, "nrtri" },
+{ 0x22EC, "nltrie" },
+{ 0x22ED, "nrtrie" },
+{ 0x22EE, "vellip" },
+{ 0x2306, "Barwed" },
+{ 0x2308, "lceil" },
+{ 0x2309, "rceil" },
+{ 0x230A, "lfloor" },
+{ 0x230B, "rfloor" },
+{ 0x230C, "drcrop" },
+{ 0x230D, "dlcrop" },
+{ 0x230E, "urcrop" },
+{ 0x230F, "ulcrop" },
+{ 0x2315, "telrec" },
+{ 0x2316, "target" },
+{ 0x231C, "ulcorn" },
+{ 0x231D, "urcorn" },
+{ 0x231E, "dlcorn" },
+{ 0x231F, "drcorn" },
+{ 0x2322, "frown" },
+{ 0x2323, "smile" },
+{ 0x2329, "lang" },
+{ 0x232A, "rang" },
+{ 0x2423, "blank" },
+{ 0x24C8, "oS" },
+{ 0x2500, "boxh" },
+{ 0x2502, "boxv" },
+{ 0x250C, "boxdr" },
+{ 0x2510, "boxdl" },
+{ 0x2514, "boxur" },
+{ 0x2518, "boxul" },
+{ 0x251C, "boxvr" },
+{ 0x2524, "boxvl" },
+{ 0x252C, "boxhd" },
+{ 0x2534, "boxhu" },
+{ 0x253C, "boxvh" },
+{ 0x2550, "boxH" },
+{ 0x2551, "boxV" },
+{ 0x2552, "boxdR" },
+{ 0x2553, "boxDr" },
+{ 0x2554, "boxDR" },
+{ 0x2555, "boxdL" },
+{ 0x2556, "boxDl" },
+{ 0x2557, "boxDL" },
+{ 0x2558, "boxuR" },
+{ 0x2559, "boxUr" },
+{ 0x255A, "boxUR" },
+{ 0x255B, "boxuL" },
+{ 0x255C, "boxUl" },
+{ 0x255D, "boxUL" },
+{ 0x255E, "boxvR" },
+{ 0x255F, "boxVr" },
+{ 0x2560, "boxVR" },
+{ 0x2561, "boxvL" },
+{ 0x2562, "boxVl" },
+{ 0x2563, "boxVL" },
+{ 0x2564, "boxHd" },
+{ 0x2565, "boxhD" },
+{ 0x2566, "boxHD" },
+{ 0x2567, "boxHu" },
+{ 0x2568, "boxhU" },
+{ 0x2569, "boxHU" },
+{ 0x256A, "boxvH" },
+{ 0x256B, "boxVh" },
+{ 0x256C, "boxVH" },
+{ 0x2580, "uhblk" },
+{ 0x2584, "lhblk" },
+{ 0x2588, "block" },
+{ 0x2591, "blk14" },
+{ 0x2592, "blk12" },
+{ 0x2593, "blk34" },
+{ 0x25A1, "squ" },
+{ 0x25A1, "square" },
+{ 0x25AA, "squf" },
+{ 0x25AD, "rect" },
+{ 0x25AE, "marker" },
+{ 0x25B3, "xutri" },
+{ 0x25B4, "utrif" },
+{ 0x25B5, "utri" },
+{ 0x25B8, "rtrif" },
+{ 0x25B9, "rtri" },
+{ 0x25BD, "xdtri" },
+{ 0x25BE, "dtrif" },
+{ 0x25BF, "dtri" },
+{ 0x25C2, "ltrif" },
+{ 0x25C3, "ltri" },
+{ 0x25CB, "cir" },
+{ 0x25CB, "xcirc" },
+{ 0x2605, "starf" },
+{ 0x2606, "star" },
+{ 0x260E, "phone" },
+{ 0x2640, "female" },
+{ 0x2642, "male" },
+{ 0x2660, "spades" },
+{ 0x2661, "hearts" },
+{ 0x2662, "diams" },
+{ 0x2663, "clubs" },
+{ 0x266A, "sung" },
+{ 0x266D, "flat" },
+{ 0x266E, "natur" },
+{ 0x266F, "sharp" },
+{ 0x2713, "check" },
+{ 0x2717, "cross" },
+{ 0x2720, "malt" },
+{ 0x2726, "lozf" },
+{ 0x2727, "loz" },
+{ 0x2736, "sextile" },
diff --git a/style/style.dsp b/style/style.dsp
new file mode 100644 (file)
index 0000000..5568e2e
--- /dev/null
@@ -0,0 +1,572 @@
+# Microsoft Developer Studio Project File - Name="style" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=style - Win32 Release
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "style.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "style.mak" CFG="style - Win32 Release"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "style - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "style - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir ".\Release"
+# PROP BASE Intermediate_Dir ".\Release"
+# PROP BASE Target_Dir "."
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir ".\Release"
+# PROP Intermediate_Dir ".\Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir "."
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\spgrove" /I "..\grove" /I "..\include" /D "_WINDOWS" /D "NDEBUG" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D "SP_MULTI_BYTE" /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x20000000" /subsystem:windows /dll /machine:I386 /out:"..\bin\ostyle13.dll"
+# SUBTRACT LINK32 /profile /map
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir ".\Debug"
+# PROP BASE Intermediate_Dir ".\Debug"
+# PROP BASE Target_Dir "."
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir ".\Debug"
+# PROP Intermediate_Dir ".\Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir "."
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /MDd /W3 /GX /ZI /Od /I "..\spgrove" /I "..\grove" /I "..\include" /D "_WINDOWS" /D "_DEBUG" /D DSSSL_NAMESPACE=James_Clark_DSSSL /D "WIN32" /D SP_NAMESPACE=James_Clark_SP /D GROVE_NAMESPACE=James_Clark_GROVE /D "SP_MULTI_BYTE" /D SP_HAVE_LOCALE=1 /D SP_HAVE_WCHAR=1 /FR /YX /FD /c
+# ADD BASE MTL /nologo /D "_DEBUG" /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x20000000" /subsystem:windows /dll /debug /machine:I386 /out:"..\dbgbin\ostyle13d.dll"
+# SUBTRACT LINK32 /incremental:no /map
+
+!ENDIF 
+
+# Begin Target
+
+# Name "style - Win32 Release"
+# Name "style - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat;for;f90"
+# Begin Source File
+
+SOURCE=.\Collector.cxx
+# SUBTRACT CPP /YX
+# End Source File
+# Begin Source File
+
+SOURCE=.\common_inst.cxx
+# ADD CPP /Yu"stylelib.h"
+# End Source File
+# Begin Source File
+
+SOURCE=.\common_inst.m4
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\common_inst.m4
+InputName=common_inst
+
+"$(InputDir)\$(InputName).cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       del /f $(InputDir)\$(InputName).cxx 
+       perl ..\lib\instmac.pl $(InputPath) >$(InputDir)\$(InputName).cxx 
+       attrib +r $(InputDir)\$(InputName).cxx 
+       
+# End Custom Build
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\common_inst.m4
+InputName=common_inst
+
+"$(InputDir)\$(InputName).cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       del /f $(InputDir)\$(InputName).cxx 
+       perl ..\lib\instmac.pl $(InputPath) >$(InputDir)\$(InputName).cxx 
+       attrib +r $(InputDir)\$(InputName).cxx 
+       
+# End Custom Build
+
+!ENDIF 
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\DssslApp.cxx
+# ADD CPP /Yu"stylelib.h"
+# End Source File
+# Begin Source File
+
+SOURCE=.\DssslAppMessages.msg
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\DssslAppMessages.msg
+InputName=DssslAppMessages
+
+"$(InputDir)\$(InputName).h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       perl -w ..\msggen.pl $(InputPath)
+
+# End Custom Build
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\DssslAppMessages.msg
+InputName=DssslAppMessages
+
+"$(InputDir)\$(InputName).h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       perl -w ..\msggen.pl $(InputPath)
+
+# End Custom Build
+
+!ENDIF 
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\DssslSpecEventHandler.cxx
+# ADD CPP /Yu"stylelib.h"
+# End Source File
+# Begin Source File
+
+SOURCE=.\ELObj.cxx
+# ADD CPP /Yu"stylelib.h"
+# End Source File
+# Begin Source File
+
+SOURCE=.\ELObjMessageArg.cxx
+# ADD CPP /Yu"stylelib.h"
+# End Source File
+# Begin Source File
+
+SOURCE=.\Expression.cxx
+# ADD CPP /Yu"stylelib.h"
+# End Source File
+# Begin Source File
+
+SOURCE=.\FlowObj.cxx
+# ADD CPP /Yu"stylelib.h"
+# End Source File
+# Begin Source File
+
+SOURCE=.\FlowObj_inst.m4
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\FlowObj_inst.m4
+InputName=FlowObj_inst
+
+"$(InputDir)\$(InputName).cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       del /f $(InputDir)\$(InputName).cxx 
+       perl ..\lib\instmac.pl $(InputPath) >$(InputDir)\$(InputName).cxx 
+       attrib +r $(InputDir)\$(InputName).cxx 
+       
+# End Custom Build
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\FlowObj_inst.m4
+InputName=FlowObj_inst
+
+"$(InputDir)\$(InputName).cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       del /f $(InputDir)\$(InputName).cxx 
+       perl ..\lib\instmac.pl $(InputPath) >$(InputDir)\$(InputName).cxx 
+       attrib +r $(InputDir)\$(InputName).cxx 
+       
+# End Custom Build
+
+!ENDIF 
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\FOTBuilder.cxx
+# ADD CPP /Yu"stylelib.h"
+# End Source File
+# Begin Source File
+
+SOURCE=.\GroveManager.cxx
+# ADD CPP /Yu"stylelib.h"
+# End Source File
+# Begin Source File
+
+SOURCE=.\InheritedC.cxx
+# ADD CPP /Yu"stylelib.h"
+# End Source File
+# Begin Source File
+
+SOURCE=.\Insn.cxx
+# ADD CPP /Yu"stylelib.h"
+# End Source File
+# Begin Source File
+
+SOURCE=.\Interpreter.cxx
+# ADD CPP /Yu"stylelib.h"
+# End Source File
+# Begin Source File
+
+SOURCE=.\InterpreterMessages.cxx
+# SUBTRACT CPP /YX
+# End Source File
+# Begin Source File
+
+SOURCE=.\InterpreterMessages.msg
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\InterpreterMessages.msg
+InputName=InterpreterMessages
+
+"$(InputDir)\$(InputName).h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       perl -w ..\msggen.pl $(InputPath)
+
+# End Custom Build
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\InterpreterMessages.msg
+InputName=InterpreterMessages
+
+"$(InputDir)\$(InputName).h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       perl -w ..\msggen.pl $(InputPath)
+
+# End Custom Build
+
+!ENDIF 
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\LangObj.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\MacroFlowObj.cxx
+# ADD CPP /Yu"stylelib.h"
+# End Source File
+# Begin Source File
+
+SOURCE=.\NumberCache.cxx
+# ADD CPP /Yu"stylelib.h"
+# End Source File
+# Begin Source File
+
+SOURCE=.\Pattern.cxx
+# ADD CPP /Yu"stylelib.h"
+# End Source File
+# Begin Source File
+
+SOURCE=.\primitive.cxx
+# ADD CPP /Yu"stylelib.h"
+# End Source File
+# Begin Source File
+
+SOURCE=.\primitive_inst.m4
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\primitive_inst.m4
+InputName=primitive_inst
+
+"$(InputDir)\$(InputName).cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       del /f $(InputDir)\$(InputName).cxx 
+       perl ..\lib\instmac.pl $(InputPath) >$(InputDir)\$(InputName).cxx 
+       attrib +r $(InputDir)\$(InputName).cxx 
+       
+# End Custom Build
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\primitive_inst.m4
+InputName=primitive_inst
+
+"$(InputDir)\$(InputName).cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       del /f $(InputDir)\$(InputName).cxx 
+       perl ..\lib\instmac.pl $(InputPath) >$(InputDir)\$(InputName).cxx 
+       attrib +r $(InputDir)\$(InputName).cxx 
+       
+# End Custom Build
+
+!ENDIF 
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\ProcessContext.cxx
+# ADD CPP /Yu"stylelib.h"
+# End Source File
+# Begin Source File
+
+SOURCE=.\ProcessingMode.cxx
+# ADD CPP /Yu"stylelib.h"
+# End Source File
+# Begin Source File
+
+SOURCE=.\SchemeParser.cxx
+# ADD CPP /Yu"stylelib.h"
+# End Source File
+# Begin Source File
+
+SOURCE=.\Style.cxx
+# ADD CPP /Yu"stylelib.h"
+# End Source File
+# Begin Source File
+
+SOURCE=.\style_inst.cxx
+# ADD CPP /Yu"stylelib.h"
+# End Source File
+# Begin Source File
+
+SOURCE=.\style_inst.m4
+
+!IF  "$(CFG)" == "style - Win32 Release"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\style_inst.m4
+InputName=style_inst
+
+"$(InputDir)\$(InputName).cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       del /f $(InputDir)\$(InputName).cxx 
+       perl ..\lib\instmac.pl $(InputPath) >$(InputDir)\$(InputName).cxx 
+       attrib +r $(InputDir)\$(InputName).cxx 
+       
+# End Custom Build
+
+!ELSEIF  "$(CFG)" == "style - Win32 Debug"
+
+# Begin Custom Build - Processing $(InputPath)
+InputDir=.
+InputPath=.\style_inst.m4
+InputName=style_inst
+
+"$(InputDir)\$(InputName).cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       del /f $(InputDir)\$(InputName).cxx 
+       perl ..\lib\instmac.pl $(InputPath) >$(InputDir)\$(InputName).cxx 
+       attrib +r $(InputDir)\$(InputName).cxx 
+       
+# End Custom Build
+
+!ENDIF 
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\StyleEngine.cxx
+# ADD CPP /Yu"stylelib.h"
+# End Source File
+# Begin Source File
+
+SOURCE=.\stylelib.cxx
+# ADD CPP /Yc"stylelib.h"
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd"
+# Begin Source File
+
+SOURCE=.\charNames.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\Collector.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\dsssl_ns.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\DssslApp.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\DssslAppMessages.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\DssslSpecEventHandler.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\ELObj.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\ELObjMessageArg.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\EvalContext.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\Expression.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\FOTBuilder.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\GroveManager.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\Insn.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\Insn2.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\Interpreter.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\InterpreterMessages.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\jade_version.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\MacroFlowObj.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\NumberCache.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\Pattern.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\primitive.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\ProcessContext.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\ProcessingMode.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\SchemeParser.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\sdata.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\SosofoObj.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\Style.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\style_pch.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\StyleEngine.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\stylelib.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\VM.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"
+# End Group
+# Begin Source File
+
+SOURCE=.\FlowObj_inst.cxx
+# PROP BASE Exclude_From_Build 1
+# PROP Ignore_Default_Tool 1
+# End Source File
+# Begin Source File
+
+SOURCE=.\primitive_inst.cxx
+# PROP BASE Exclude_From_Build 1
+# PROP Ignore_Default_Tool 1
+# End Source File
+# End Target
+# End Project
diff --git a/style/style_inst.m4 b/style/style_inst.m4
new file mode 100644 (file)
index 0000000..c4c2401
--- /dev/null
@@ -0,0 +1,190 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#include "stylelib.h"
+
+#ifdef SP_MANUAL_INST
+
+#define SP_DEFINE_TEMPLATES
+#include "Vector.h"
+#include "NCVector.h"
+#include "Ptr.h"
+#include "Owner.h"
+#include "PointerTable.h"
+#include "OwnerTable.h"
+#include "NamedTable.h"
+#include "IList.h"
+#include "IListIter.h"
+#include "IQueue.h"
+#include "HashTable.h"
+#include "CharMap.h"
+#ifdef SP_SIZEOF_BOOL_1
+#include "XcharMap.h"
+#endif
+#undef SP_DEFINE_TEMPLATES
+
+#include "Insn.h"
+#include "Expression.h"
+#include "Interpreter.h"
+#include "ELObj.h"
+#include "Style.h"
+#include "FOTBuilder.h"
+#include "ProcessingMode.h"
+#include "ProcessContext.h"
+#include "SosofoObj.h"
+#include "DssslSpecEventHandler.h"
+#include "Boolean.h"
+#include "Node.h"
+#include "DssslApp.h"
+#include "Pattern.h"
+#include "MacroFlowObj.h"
+
+#ifdef DSSSL_NAMESPACE
+class DSSSL_NAMESPACE::ProcessingMode;
+class DSSSL_NAMESPACE::SosofoObj;
+#else
+class ProcessingMode;
+class SosofoObj;
+#endif
+
+#if _MSC_VER >= 1100
+
+#ifdef SP_NAMESPACE
+namespace SP_NAMESPACE {
+#endif
+
+#ifdef DSSSL_NAMESPACE
+using namespace DSSSL_NAMESPACE;
+#endif
+
+#ifdef GROVE_NAMESPACE
+using namespace GROVE_NAMESPACE;
+#endif
+
+#else
+
+#ifdef DSSSL_NAMESPACE
+namespace DSSSL_NAMESPACE {
+#endif
+
+#endif
+
+__instantiate(Ptr<Insn>)
+__instantiate(Owner<Expression>)
+__instantiate(Vector<const Identifier *>)
+__instantiate(NCVector<Owner<Expression> >)
+__instantiate(Vector<BoundVar>)
+__instantiate(Owner<FOTBuilder>)
+__instantiate(Owner<SaveFOTBuilder>)
+__instantiate(Owner<InputSource>)
+__instantiate(Vector<SymbolObj *>)
+__instantiate(Owner<OutputCharStream>)
+__instantiate(Ptr<Environment::FrameVarList>)
+__instantiate(ConstPtr<Environment::FrameVarList>)
+__instantiate(`PointerTable<SymbolObj *, StringC, Hash, SymbolObj>')
+__instantiate(NamedTableIter<Identifier>)
+__instantiate(Ptr<StyleSpec>)
+__instantiate(Ptr<InheritedC>)
+__instantiate(ConstPtr<InheritedC>)
+__instantiate(Vector<ConstPtr<InheritedC> >)
+__instantiate(Vector<const Vector<ConstPtr<InheritedC> > *>)
+__instantiate(Vector<const VarStyleObj *>)
+__instantiate(Ptr<InheritedCInfo>)
+__instantiate(NamedTable<ProcessingMode::ElementRules>)
+__instantiate(NamedTableIter<ProcessingMode::ElementRules>)
+__instantiate(NamedTableIter<ProcessingMode>)
+__instantiate(NCVector<ProcessingMode::GroveRules>)
+__instantiate(Vector<ProcessingMode::Rule>)
+__instantiate(Ptr<ProcessingMode::Action>)
+__instantiate(IList<ProcessingMode::ElementRule>)
+__instantiate(IListIter<ProcessingMode::ElementRule>)
+__instantiate(Vector<const ProcessingMode::ElementRule *>)
+__instantiate(IList<SaveFOTBuilder>)
+__instantiate(Vector<const ProcessingMode *>)
+__instantiate(Owner<FOTBuilder::DisplayGroupNIC>)
+__instantiate(Vector<SosofoObj *>)
+__instantiate(Vector<FOTBuilder *>)
+__instantiate(IQueue<SaveFOTBuilder>)
+__instantiate(NCVector<IQueue<SaveFOTBuilder> >)
+__instantiate(IList<ProcessContext::Connection>)
+__instantiate(IListIter<ProcessContext::Connection>)
+__instantiate(IList<ProcessContext::Connectable>)
+__instantiate(IListIter<ProcessContext::Connectable>)
+__instantiate(Ptr<PopList>)
+__instantiate(Vector<Ptr<InheritedCInfo> >)
+__instantiate(NCVector<ProcessContext::Port>)
+__instantiate(NCVector<CaseExpression::Case>)
+__instantiate(NamedTable<NumberCache::Entry>)
+__instantiate(NCVector<NamedTable<NumberCache::Entry> >)
+__instantiate(NamedTable<NumberCache::ElementEntry>)
+__instantiate(NCVector<NamedTable<NumberCache::ElementEntry> >)
+__instantiate(Vector<ELObj *>)
+__instantiate(Vector<ConstPtr<Insn> >)
+__instantiate(Vector<StyleObj *>)
+__instantiate(Vector<Vector<StyleObj *> >)
+__instantiate(IList<ProcessContext::Table>)
+__instantiate(IListIter<ProcessContext::Table>)
+__instantiate(Vector<String<char> >)
+__instantiate(Owner<LengthSpec>)
+__instantiate(Vector<FOTBuilder::MultiMode>)
+__instantiate(Vector<Vector<FOTBuilder::MultiMode> >)
+__instantiate(`HashTable<StringC,FunctionObj *>')
+__instantiate(`HashTableItem<StringC,FunctionObj *>')
+__instantiate(Vector<DssslSpecEventHandler::Part *>)
+__instantiate(Vector<DssslSpecEventHandler::PartHeader *>)
+__instantiate(IListIter<DssslSpecEventHandler::BodyElement>)
+__instantiate(IList<DssslSpecEventHandler::BodyElement>)
+__instantiate(IListIter<DssslSpecEventHandler::PartHeader>)
+__instantiate(IList<DssslSpecEventHandler::PartHeader>)
+__instantiate(IListIter<DssslSpecEventHandler::Doc>)
+__instantiate(IList<DssslSpecEventHandler::Doc>)
+__instantiate(Owner<DssslSpecEventHandler::SpecPart>)
+__instantiate(Owner<Location>)
+__instantiate(Owner<FOTBuilder::DisplaySpace>)
+__instantiate(Owner<FOTBuilder::InlineSpace>)
+__instantiate(Owner<FOTBuilder::Address>)
+__instantiate(Vector<String<char> *>)
+__instantiate(`PointerTable<String<char> *, String<char>, Interpreter::StringSet, Interpreter::StringSet>')
+__instantiate(`OwnerTable<String<char>, String<char>, Interpreter::StringSet, Interpreter::StringSet>')
+__instantiate(Vector<FOTBuilder::GlyphId>)
+__instantiate(Ptr<FOTBuilder::GlyphSubstTable>)
+__instantiate(ConstPtr<FOTBuilder::GlyphSubstTable>)
+__instantiate(Vector<ConstPtr<FOTBuilder::GlyphSubstTable> >)
+__instantiate(Owner<FOTBuilder::ExtensionFlowObj>)
+__instantiate(Owner<FOTBuilder::CompoundExtensionFlowObj>)
+__instantiate(`HashTable<StringC,NodePtr>')
+__instantiate(`HashTableItem<StringC,NodePtr>')
+__instantiate(Vector<ProcessContext::NodeStackEntry>)
+__instantiate(Vector<const Pattern::Element *>)
+__instantiate(NCVector<Pattern>)
+__instantiate(IList<Pattern::Element>)
+__instantiate(IListIter<Pattern::Element>)
+__instantiate(IList<Pattern::Qualifier>)
+__instantiate(IListIter<Pattern::Qualifier>)
+__instantiate(Ptr<MacroFlowObj::Definition>)
+__instantiate(`HashTable<StringC,CharPart>')
+__instantiate(`HashTableItem<StringC,CharPart>')
+__instantiate(`HashTable<StringC,StringC>')
+__instantiate(`HashTableItem<StringC,StringC>')
+#ifdef SP_SIZEOF_BOOL_1
+__instantiate(XcharMap<char>)
+__instantiate(SharedXcharMap<char>)
+__instantiate(Ptr<SharedXcharMap<char> >)
+__instantiate(ConstPtr<SharedXcharMap<char> >)
+#endif
+__instantiate(CharMap<ELObjPart>)
+__instantiate(CharMapPage<ELObjPart>)
+__instantiate(CharMapColumn<ELObjPart>)
+__instantiate(CharMapResource<ELObjPart>)
+__instantiate(Ptr<CharMapResource<ELObjPart> >)
+__instantiate(ConstPtr<CharMapResource<ELObjPart> >)
+__instantiate(`HashTable<StringC,CharProp>')
+__instantiate(`HashTableItem<StringC,CharProp>')
+__instantiate(`HashTableIter<StringC,CharProp>')
+
+#ifdef SP_NAMESPACE
+}
+#endif
+
+#endif /* SP_MANUAL_INST */
diff --git a/style/style_pch.h b/style/style_pch.h
new file mode 100644 (file)
index 0000000..805a548
--- /dev/null
@@ -0,0 +1,27 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#include "Interpreter.h"
+#include "Collector.h"
+#include "DssslApp.h"
+#include "DssslSpecEventHandler.h"
+#include "ELObj.h"
+#include "ELObjMessageArg.h"
+#include "EvalContext.h"
+#include "Expression.h"
+#include "FOTBuilder.h"
+#include "GroveManager.h"
+#include "Insn.h"
+#include "Insn2.h"
+#include "Interpreter.h"
+#include "InterpreterMessages.h"
+#include "MacroFlowObj.h"
+#include "NumberCache.h"
+#include "Pattern.h"
+#include "ProcessContext.h"
+#include "ProcessingMode.h"
+#include "SchemeParser.h"
+#include "SosofoObj.h"
+#include "Style.h"
+#include "StyleEngine.h"
+#include "VM.h"
diff --git a/style/stylelib.cxx b/style/stylelib.cxx
new file mode 100644 (file)
index 0000000..dc10b3f
--- /dev/null
@@ -0,0 +1,4 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+#include "stylelib.h"
diff --git a/style/stylelib.h b/style/stylelib.h
new file mode 100644 (file)
index 0000000..0557d3f
--- /dev/null
@@ -0,0 +1,22 @@
+// Copyright (c) 1996 James Clark
+// See the file copying.txt for copying permission.
+
+
+#define BUILD_LIBSP
+#include "config.h"
+#undef BUILD_LIBSP
+#define BUILD_LIBSTYLE
+
+#ifdef SP_USE_DLL
+#undef SP_API
+#define SP_API SP_DLLIMPORT
+#endif
+
+#ifdef _MSC_VER
+#pragma warning (disable: 4355)
+#endif
+
+#include "dsssl_ns.h"
+#ifdef SP_PCH
+#include "style_pch.h"
+#endif
diff --git a/sunfix.sh b/sunfix.sh
new file mode 100644 (file)
index 0000000..f3a9fff
--- /dev/null
+++ b/sunfix.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+# Sun C++ 4.0.1 gets confused by the macros in include/NCVector.h.
+
+cd include
+mv NCVector.h NCVector.h.dist
+sed -f NCVector.sed Vector.h >NCVector.h
+chmod -w NCVector.h
+sed -f NCVector.sed Vector.cxx >NCVector.cxx
+chmod -w NCVector.cxx
diff --git a/testsuite/Makefile b/testsuite/Makefile
new file mode 100644 (file)
index 0000000..db307bc
--- /dev/null
@@ -0,0 +1,17 @@
+# OpenJade testsuite makefile
+# Copyright (C) 1999 Avi Kivity
+
+JADE=../jade/openjade
+JADEX=$(JADE) -c ../dsssl/catalog
+
+all: expr-lang.expected
+       @echo All tests passed.
+
+%.expected: %.actual
+       diff $< $@
+
+expr-lang.actual: $(JADE) expr-lang.dsl
+       $(JADEX) -t sgml -d expr-lang.dsl null.sgml > $@
+    
+clean:
+       rm *.actual
diff --git a/testsuite/expr-lang.dsl b/testsuite/expr-lang.dsl
new file mode 100644 (file)
index 0000000..4c58149
--- /dev/null
@@ -0,0 +1,128 @@
+<!doctype style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN">
+<!-- Copyright (C) 1999 Avi Kivity -->
+                 
+<style-sheet>
+<style-specification>
+<style-specification-body>
+
+<![cdata[                
+                 
+(root
+    (test-expression-language)
+)
+
+(define (test-expression-language)
+    (sosofo-append
+        (make-test "Character Primitives" test-char)
+        (make-test "String Primitives" test-string)
+    )
+)
+
+(define (test-char)
+    (sosofo-append
+        (testcase 'char=?      #\a #\b)
+        (testcase 'char=?      #\a #\a)
+        (testcase 'char=?      #\a #\A)
+        (testcase 'char<?      #\a #\b)
+        (testcase 'char<?      #\a #\a)
+        (testcase 'char<?      #\a #\A)
+        (testcase 'char<=?     #\a #\b)
+        (testcase 'char<=?     #\a #\a)
+        (testcase 'char<=?     #\a #\A)
+        (testcase 'char>?      #\a #\b)
+        (testcase 'char>?      #\a #\a)
+        (testcase 'char>?      #\a #\A)
+        (testcase 'char>=?     #\a #\b)
+        (testcase 'char>=?     #\a #\a)
+        (testcase 'char>=?     #\a #\A)
+        (testcase 'char-ci=?   #\a #\b)
+        (testcase 'char-ci=?   #\a #\a)
+        (testcase 'char-ci=?   #\a #\A)
+        (testcase 'char-ci<?   #\a #\b)
+        (testcase 'char-ci<?   #\a #\a)
+        (testcase 'char-ci<?   #\a #\A)
+        (testcase 'char-ci<=?  #\a #\b)
+        (testcase 'char-ci<=?  #\a #\a)
+        (testcase 'char-ci<=?  #\a #\A)
+        (testcase 'char-ci>?   #\a #\b)
+        (testcase 'char-ci>?   #\a #\a)
+        (testcase 'char-ci>?   #\a #\A)
+        (testcase 'char-ci>=?  #\a #\b)
+        (testcase 'char-ci>=?  #\a #\a)
+        (testcase 'char-ci>=?  #\a #\A)
+    )
+)
+
+(define (test-string)
+    (testcase 'string=? "\latin-small-letter-a\latin-small-letter-b;c" "abc")
+)
+
+(define symbol-proc-map
+    `(
+        (char=? . ,char=?) (char<? . ,char<?) (char<=? . ,char<=?) 
+        (char>? . ,char>?) (char>=? . ,char>=?) (char-ci=? . ,char-ci=?)
+        (char-ci<? . ,char-ci<?) (char-ci<=? . ,char-ci<=?)
+        (char-ci>? . ,char-ci>?) (char-ci>=? . ,char-ci>=?)
+        (string=? . ,string=?)
+    )     
+)
+     
+(define (symbol->proc sym) (cdr (assoc sym symbol-proc-map)))     
+                  
+(define (testcase proc-sym #!rest args)
+    (write-line
+        (string-append
+            "(" 
+            (symbol->string proc-sym)
+            (reduce 
+                args
+                (lambda (args arg) (string-append args " " (obj->string arg)))
+                ""
+            )
+            " --> "
+            (obj->string (apply (symbol->proc proc-sym) args))
+        )
+    )
+)       
+
+(define (obj->string obj)
+    (cond
+        ((char? obj) (list->string (list #\# #\\ obj)))
+        ((string? obj) (string-append "\"" obj "\""))
+        ((boolean? obj) (if obj "#t" "#f"))
+        ((symbol? obj) (symbol->string obj))
+        (else "unimplemented")
+    )
+)           
+                  
+(define (make-test title proc)
+    (sosofo-append
+        (write-line title)
+        (proc)
+        (write-empty-line)
+    )
+)    
+
+(define (write-empty-line) (write-line ""))
+
+(define newline "\carriage-return;\line-feed;")
+
+(define (write-line string)
+    (make formatting-instruction
+        data: (string-append string newline)
+    )
+)
+
+(declare-flow-object-class formatting-instruction
+  "UNREGISTERED::James Clark//Flow Object Class::formatting-instruction")
+
+(declare-default-language (language "EN" "US"))
+
+(define language
+  (external-procedure "UNREGISTERED::OpenJade//Procedure::language"))
+
+]]>
+
+</style-specification-body>
+</style-specification>
+</style-sheet>
diff --git a/testsuite/expr-lang.expected b/testsuite/expr-lang.expected
new file mode 100644 (file)
index 0000000..54799b1
--- /dev/null
@@ -0,0 +1,35 @@
+Character Primitives
+(char=? #\a #\b --> #f
+(char=? #\a #\a --> #t
+(char=? #\a #\A --> #f
+(char<? #\a #\b --> #t
+(char<? #\a #\a --> #f
+(char<? #\a #\A --> #f
+(char<=? #\a #\b --> #t
+(char<=? #\a #\a --> #t
+(char<=? #\a #\A --> #f
+(char>? #\a #\b --> #f
+(char>? #\a #\a --> #f
+(char>? #\a #\A --> #t
+(char>=? #\a #\b --> #f
+(char>=? #\a #\a --> #t
+(char>=? #\a #\A --> #t
+(char-ci=? #\a #\b --> #f
+(char-ci=? #\a #\a --> #t
+(char-ci=? #\a #\A --> #t
+(char-ci<? #\a #\b --> #t
+(char-ci<? #\a #\a --> #f
+(char-ci<? #\a #\A --> #f
+(char-ci<=? #\a #\b --> #t
+(char-ci<=? #\a #\a --> #t
+(char-ci<=? #\a #\A --> #t
+(char-ci>? #\a #\b --> #f
+(char-ci>? #\a #\a --> #f
+(char-ci>? #\a #\A --> #f
+(char-ci>=? #\a #\b --> #f
+(char-ci>=? #\a #\a --> #t
+(char-ci>=? #\a #\A --> #t
+
+String Primitives
+(string=? "abc" "abc" --> #t
+
diff --git a/testsuite/null.sgml b/testsuite/null.sgml
new file mode 100644 (file)
index 0000000..a4e91dd
--- /dev/null
@@ -0,0 +1,7 @@
+<!doctype nothing [
+<!-- Copyright (C) 1999 Avi Kivity -->
+<!element nothing o o (#pcdata)>
+
+]>
+
+<nothing></nothing>
diff --git a/unicode/catalog b/unicode/catalog
new file mode 100644 (file)
index 0000000..6539bef
--- /dev/null
@@ -0,0 +1,5 @@
+PUBLIC
+"-//SGML Open:TR95xx//SYNTAX Extended (ISO/IEC 10646-1:1993 repertoire)//EN"
+unicode.syn
+
+SGMLDECL unicode.sd
diff --git a/unicode/demo.sgm b/unicode/demo.sgm
new file mode 100644 (file)
index 0000000..8007707
--- /dev/null
@@ -0,0 +1,5 @@
+<!doctype doc [
+<!element doc - o empty>
+<!attlist doc a nmtokens #implied>
+]>
+<doc a="&#224;&#428;&#40869;x&#12526;y">
diff --git a/unicode/gensyntax.pl b/unicode/gensyntax.pl
new file mode 100644 (file)
index 0000000..055e0c0
--- /dev/null
@@ -0,0 +1,224 @@
+#! /usr/bin/perl
+
+# Feed this ftp://unicode.org/MappingTables/UnicodeData-1.1.4.txt.
+
+$compat_start = 0xfb00;
+
+# Small Kana
+$uc[12353] = 12354;
+$is_uc[12354] = 1;
+$uc[12355] = 12356;
+$is_uc[12356] = 1;
+$uc[12357] = 12358;
+$is_uc[12358] = 1;
+$uc[12359] = 12360;
+$is_uc[12360] = 1;
+$uc[12361] = 12362;
+$is_uc[12362] = 1;
+$uc[12387] = 12388;
+$is_uc[12388] = 1;
+$uc[12419] = 12420;
+$is_uc[12420] = 1;
+$uc[12421] = 12422;
+$is_uc[12422] = 1;
+$uc[12423] = 12424;
+$is_uc[12424] = 1;
+$uc[12430] = 12430;
+$is_uc[12430] = 1;
+$uc[12449] = 12450;
+$is_uc[12450] = 1;
+$uc[12451] = 12452;
+$is_uc[12452] = 1;
+$uc[12453] = 12454;
+$is_uc[12454] = 1;
+$uc[12455] = 12456;
+$is_uc[12456] = 1;
+$uc[12457] = 12458;
+$is_uc[12458] = 1;
+$uc[12483] = 12484;
+$is_uc[12484] = 1;
+$uc[12515] = 12516;
+$is_uc[12516] = 1;
+$uc[12517] = 12518;
+$is_uc[12518] = 1;
+$uc[12519] = 12520;
+$is_uc[12520] = 1;
+$uc[12526] = 12527;
+$is_uc[12527] = 1;
+
+while (<>) {
+    next if /^#/;
+    @F = split(';');
+    $code = hex($F[0]);
+    next if $code < 0x200c && $F[2] eq "Cc";
+    $type[$code] = $F[2];
+    # 0x17f maps to 0x53, but SGML doesn't allow that.
+    if ($F[12] && hex($F[12]) > 128) {
+       $uc[$code] = hex($F[12]);
+       $is_uc[hex($F[12])] = 1;
+    }
+    if ($F[2] eq "Zs") {
+       $name[$code] = $F[1];
+    }
+       
+    if ($code == 0x4e00) {
+       foreach $code (0x4e00 .. 0x9fa5) {
+           $type[$code] = $F[2];
+       }
+       foreach $code (0xf900 .. 0xfa2e) {
+           $type[$code] = $F[2];
+       }
+    }
+}
+
+print <<EOF;
+SHUNCHAR CONTROLS
+BASESET "ISO Registration Number 176//CHARSET
+ISO/IEC 10646-1:1993 UCS-2 with implementation level 3//ESC 2/5 2/15 4/5"
+
+DESCSET         0               65536   0        -- 16 bit --
+
+FUNCTION        RE                      13
+                RS                      10
+                SPACE                   32       
+                TAB             SEPCHAR 9
+EOF
+
+foreach $code (128 .. $#type) {
+    if ($type[$code] eq "Zs") {
+       $s = $name[$code];
+       $s =~ s/ /-/g;
+       print("\"$s\" SEPCHAR $code\n");
+    }
+}
+
+print "NAMING\n";
+
+$is_nmstrt{"Lu"} = 1;
+$is_nmstrt{"Ll"} = 1;
+$is_nmchar{"Lm"} = 1;
+$is_nmstrt{"Lo"} = 1;
+$is_nmchar{"Mn"} = 1;
+$is_nmchar{"Mc"} = 1;
+$is_nmchar{"Nd"} = 1;
+$is_nmstrt{"No"} = 1;
+$is_nmstrt{"Cc"} = 1; # >= 0x200c
+$is_sr{"Cc"} = 1; # >= 0x200c
+$is_sr{"Pd"} = 1;
+$is_sr{"Ps"} = 1;
+$is_sr{"Pe"} = 1;
+$is_sr{"Po"} = 1;
+$is_sr{"Sm"} = 1;
+$is_sr{"Sc"} = 1;
+$is_sr{"So"} = 1;
+$is_sr{"Zs"} = 1;
+$is_sr{"Zl"} = 1;
+$is_sr{"Zp"} = 1;
+
+print "LCNMSTRT\n";
+foreach $code (128 .. $#type) {
+
+    if ($uc[$code] && $code < $compat_start) {
+       &output($code);
+    }
+    
+}
+&flush();
+
+print "UCNMSTRT\n";
+
+foreach $code (128 .. $#type) {
+    if ($uc[$code] && $code < $compat_start) {
+       &output($uc[$code]);
+    }
+    
+}
+&flush();
+
+print "NAMESTRT\n";
+foreach $code (128 .. $#type) {
+    if (!$uc[$code] && !$is_uc[$code]
+       && $is_nmstrt{$type[$code]} && $code < $compat_start) {
+       &output($code);
+    }
+    
+}
+&flush();
+
+print "LCNMCHAR\n";
+&output(ord("-"));
+&output(ord("."));
+&flush();
+
+print "UCNMCHAR\n";
+&output(ord("-"));
+&output(ord("."));
+&flush();
+
+print "NAMECHAR\n";
+foreach $code (128 .. $#type) {
+    if ($is_nmchar{$type[$code]} && $code < $compat_start) {
+       &output($code);
+    }
+    
+}
+&flush();
+
+print <<EOF;
+NAMECASE   GENERAL    YES
+           ENTITY     NO
+DELIM      GENERAL    SGMLREF
+          SHORTREF   SGMLREF
+EOF
+
+foreach $code (128 .. $#type) {
+    if ($is_sr{$type[$code]}) {
+       &output($code);
+    }
+    
+}
+
+&flush;
+
+print <<EOF;
+NAMES           SGMLREF 
+
+QUANTITY        SGMLREF         -- To be determined --
+        ATTSPLEN        1920    -- ?? --
+        LITLEN          240     -- ?? --
+        NAMELEN         240     -- ?? --
+        PILEN           1920    -- ?? --
+        TAGLEN          1920    -- ?? --
+EOF
+
+
+sub output {
+    $ch = $_[0];
+    if ($pending > 0 && $base + $pending == $ch) {
+       $pending++;
+    }
+    else {
+       &flush;
+       $base = $ch;
+       $pending = 1;
+    }
+}
+
+sub flush {
+    if ($pending > 0) {
+       printf("%d", $base);
+       if ($pending > 1) {
+           if ($pending > 2) {
+               print "-";
+           }
+           else {
+               print "\n";
+           }
+           printf("%d", $base + ($pending - 1));
+       }
+       print "\n";
+       $count += $pending;
+       $pending = 0;
+    }
+}
+
diff --git a/unicode/unicode.sd b/unicode/unicode.sd
new file mode 100644 (file)
index 0000000..0b65ec8
--- /dev/null
@@ -0,0 +1,24 @@
+<!SGML "ISO 8879:1986"
+CHARSET
+BASESET 
+"ISO Registration Number 176//CHARSET
+ISO/IEC 10646-1:1993 UCS-2 with implementation level 3//ESC 2/5 2/15 4/5"
+DESCSET     0    9   UNUSED
+           9    2   9
+          11    2   UNUSED
+          13    1   13
+          14   18   UNUSED
+          32   95   32
+         127    1   UNUSED
+          128   32   UNUSED
+          160  65376 160
+CAPACITY     PUBLIC "ISO 8879:1986//CAPACITY Reference//EN"
+
+SCOPE        DOCUMENT
+SYNTAX PUBLIC 
+"-//SGML Open:TR95xx//SYNTAX Extended (ISO/IEC 10646-1:1993 repertoire)//EN"
+FEATURES
+MINIMIZE   DATATAG   NO   OMITTAG    YES          RANK       NO    SHORTTAG YES
+LINK       SIMPLE    NO   IMPLICIT   NO           EXPLICIT   NO
+OTHER      CONCUR    NO   SUBDOC     YES 99999999 FORMAL     YES
+APPINFO    NONE>
diff --git a/unicode/unicode.syn b/unicode/unicode.syn
new file mode 100644 (file)
index 0000000..4ad0325
--- /dev/null
@@ -0,0 +1,1272 @@
+SHUNCHAR CONTROLS
+BASESET "ISO Registration Number 176//CHARSET
+ISO/IEC 10646-1:1993 UCS-2 with implementation level 3//ESC 2/5 2/15 4/5"
+
+DESCSET         0               65536   0        -- 16 bit --
+
+FUNCTION        RE                      13
+                RS                      10
+                SPACE                   32       
+                TAB             SEPCHAR 9
+"NO-BREAK-SPACE" SEPCHAR 160
+"EN-QUAD" SEPCHAR 8192
+"EM-QUAD" SEPCHAR 8193
+"EN-SPACE" SEPCHAR 8194
+"EM-SPACE" SEPCHAR 8195
+"THREE-PER-EM-SPACE" SEPCHAR 8196
+"FOUR-PER-EM-SPACE" SEPCHAR 8197
+"SIX-PER-EM-SPACE" SEPCHAR 8198
+"FIGURE-SPACE" SEPCHAR 8199
+"PUNCTUATION-SPACE" SEPCHAR 8200
+"THIN-SPACE" SEPCHAR 8201
+"HAIR-SPACE" SEPCHAR 8202
+"ZERO-WIDTH-SPACE" SEPCHAR 8203
+"IDEOGRAPHIC-SPACE" SEPCHAR 12288
+"ZERO-WIDTH-NO-BREAK-SPACE" SEPCHAR 65279
+NAMING
+LCNMSTRT
+224-246
+248-255
+257
+259
+261
+263
+265
+267
+269
+271
+273
+275
+277
+279
+281
+283
+285
+287
+289
+291
+293
+295
+297
+299
+301
+303
+307
+309
+311
+314
+316
+318
+320
+322
+324
+326
+328
+331
+333
+335
+337
+339
+341
+343
+345
+347
+349
+351
+353
+355
+357
+359
+361
+363
+365
+367
+369
+371
+373
+375
+378
+380
+382
+387
+389
+392
+396
+402
+409
+417
+419
+421
+424
+429
+432
+436
+438
+441
+445
+453
+454
+456
+457
+459
+460
+462
+464
+466
+468
+470
+472
+474
+476
+479
+481
+483
+485
+487
+489
+491
+493
+495
+498
+499
+501
+507
+509
+511
+513
+515
+517
+519
+521
+523
+525
+527
+529
+531
+533
+535
+595
+596
+599-601
+603
+608
+611
+616
+617
+623
+626
+643
+648
+650
+651
+658
+940-943
+945-961
+963-974
+976
+977
+981
+982
+995
+997
+999
+1001
+1003
+1005
+1007-1009
+1072-1103
+1105-1116
+1118
+1119
+1121
+1123
+1125
+1127
+1129
+1131
+1133
+1135
+1137
+1139
+1141
+1143
+1145
+1147
+1149
+1151
+1153
+1169
+1171
+1173
+1175
+1177
+1179
+1181
+1183
+1185
+1187
+1189
+1191
+1193
+1195
+1197
+1199
+1201
+1203
+1205
+1207
+1209
+1211
+1213
+1215
+1218
+1220
+1224
+1228
+1233
+1235
+1237
+1239
+1241
+1243
+1245
+1247
+1249
+1251
+1253
+1255
+1257
+1259
+1263
+1265
+1267
+1269
+1273
+1377-1414
+7681
+7683
+7685
+7687
+7689
+7691
+7693
+7695
+7697
+7699
+7701
+7703
+7705
+7707
+7709
+7711
+7713
+7715
+7717
+7719
+7721
+7723
+7725
+7727
+7729
+7731
+7733
+7735
+7737
+7739
+7741
+7743
+7745
+7747
+7749
+7751
+7753
+7755
+7757
+7759
+7761
+7763
+7765
+7767
+7769
+7771
+7773
+7775
+7777
+7779
+7781
+7783
+7785
+7787
+7789
+7791
+7793
+7795
+7797
+7799
+7801
+7803
+7805
+7807
+7809
+7811
+7813
+7815
+7817
+7819
+7821
+7823
+7825
+7827
+7829
+7841
+7843
+7845
+7847
+7849
+7851
+7853
+7855
+7857
+7859
+7861
+7863
+7865
+7867
+7869
+7871
+7873
+7875
+7877
+7879
+7881
+7883
+7885
+7887
+7889
+7891
+7893
+7895
+7897
+7899
+7901
+7903
+7905
+7907
+7909
+7911
+7913
+7915
+7917
+7919
+7921
+7923
+7925
+7927
+7929
+7936-7943
+7952-7957
+7968-7975
+7984-7991
+8000-8005
+8017
+8019
+8021
+8023
+8032-8039
+8048-8061
+8064-8071
+8080-8087
+8096-8103
+8112
+8113
+8115
+8131
+8144
+8145
+8160
+8161
+8165
+8179
+8560-8575
+9424-9449
+12353
+12355
+12357
+12359
+12361
+12387
+12419
+12421
+12423
+12430
+12449
+12451
+12453
+12455
+12457
+12483
+12515
+12517
+12519
+12526
+UCNMSTRT
+192-214
+216-222
+376
+256
+258
+260
+262
+264
+266
+268
+270
+272
+274
+276
+278
+280
+282
+284
+286
+288
+290
+292
+294
+296
+298
+300
+302
+306
+308
+310
+313
+315
+317
+319
+321
+323
+325
+327
+330
+332
+334
+336
+338
+340
+342
+344
+346
+348
+350
+352
+354
+356
+358
+360
+362
+364
+366
+368
+370
+372
+374
+377
+379
+381
+386
+388
+391
+395
+401
+408
+416
+418
+420
+423
+428
+431
+435
+437
+440
+444
+452
+452
+455
+455
+458
+458
+461
+463
+465
+467
+469
+471
+473
+475
+478
+480
+482
+484
+486
+488
+490
+492
+494
+497
+497
+500
+506
+508
+510
+512
+514
+516
+518
+520
+522
+524
+526
+528
+530
+532
+534
+385
+390
+394
+398-400
+403
+404
+407
+406
+412
+413
+425
+430
+433
+434
+439
+902
+904-906
+913-929
+931-939
+908
+910
+911
+914
+920
+934
+928
+994
+996
+998
+1000
+1002
+1004
+1006
+922
+929
+1040-1071
+1025-1036
+1038
+1039
+1120
+1122
+1124
+1126
+1128
+1130
+1132
+1134
+1136
+1138
+1140
+1142
+1144
+1146
+1148
+1150
+1152
+1168
+1170
+1172
+1174
+1176
+1178
+1180
+1182
+1184
+1186
+1188
+1190
+1192
+1194
+1196
+1198
+1200
+1202
+1204
+1206
+1208
+1210
+1212
+1214
+1217
+1219
+1223
+1227
+1232
+1234
+1236
+1238
+1240
+1242
+1244
+1246
+1248
+1250
+1252
+1254
+1256
+1258
+1262
+1264
+1266
+1268
+1272
+1329-1366
+7680
+7682
+7684
+7686
+7688
+7690
+7692
+7694
+7696
+7698
+7700
+7702
+7704
+7706
+7708
+7710
+7712
+7714
+7716
+7718
+7720
+7722
+7724
+7726
+7728
+7730
+7732
+7734
+7736
+7738
+7740
+7742
+7744
+7746
+7748
+7750
+7752
+7754
+7756
+7758
+7760
+7762
+7764
+7766
+7768
+7770
+7772
+7774
+7776
+7778
+7780
+7782
+7784
+7786
+7788
+7790
+7792
+7794
+7796
+7798
+7800
+7802
+7804
+7806
+7808
+7810
+7812
+7814
+7816
+7818
+7820
+7822
+7824
+7826
+7828
+7840
+7842
+7844
+7846
+7848
+7850
+7852
+7854
+7856
+7858
+7860
+7862
+7864
+7866
+7868
+7870
+7872
+7874
+7876
+7878
+7880
+7882
+7884
+7886
+7888
+7890
+7892
+7894
+7896
+7898
+7900
+7902
+7904
+7906
+7908
+7910
+7912
+7914
+7916
+7918
+7920
+7922
+7924
+7926
+7928
+7944-7951
+7960-7965
+7976-7983
+7992-7999
+8008-8013
+8025
+8027
+8029
+8031
+8040-8047
+8122
+8123
+8136-8139
+8154
+8155
+8184
+8185
+8170
+8171
+8186
+8187
+8072-8079
+8088-8095
+8104-8111
+8120
+8121
+8124
+8140
+8152
+8153
+8168
+8169
+8172
+8188
+8544-8559
+9398-9423
+12354
+12356
+12358
+12360
+12362
+12388
+12420
+12422
+12424
+12430
+12450
+12452
+12454
+12456
+12458
+12484
+12516
+12518
+12520
+12527
+NAMESTRT
+223
+304
+305
+312
+329
+383
+384
+393
+397
+405
+410
+411
+414
+415
+422
+426
+427
+442
+443
+446-451
+477
+496
+592-594
+597
+598
+602
+604-607
+609
+610
+612-615
+618-622
+624
+625
+627-642
+644-647
+649
+652-657
+659-680
+912
+944
+962
+978-980
+986
+988
+990
+992
+1010
+1011
+1216
+1415
+1488-1514
+1520-1522
+1569-1594
+1600-1610
+1649-1719
+1722-1726
+1728-1742
+1744-1747
+1749
+2309-2361
+2392-2401
+2437-2444
+2447
+2448
+2451-2472
+2474-2480
+2482
+2486-2489
+2524
+2525
+2527-2529
+2544
+2545
+2565-2570
+2575
+2576
+2579-2600
+2602-2608
+2610
+2611
+2613
+2614
+2616
+2617
+2649-2652
+2654
+2693-2699
+2701
+2703-2705
+2707-2728
+2730-2736
+2738
+2739
+2741-2745
+2784
+2821-2828
+2831
+2832
+2835-2856
+2858-2864
+2866
+2867
+2870-2873
+2908
+2909
+2911-2913
+2949-2954
+2958-2960
+2962-2965
+2969
+2970
+2972
+2974
+2975
+2979
+2980
+2984-2986
+2990-2997
+2999-3001
+3056-3058
+3077-3084
+3086-3088
+3090-3112
+3114-3123
+3125-3129
+3168
+3169
+3205-3212
+3214-3216
+3218-3240
+3242-3251
+3253-3257
+3294
+3296
+3297
+3333-3340
+3342-3344
+3346-3368
+3370-3385
+3424
+3425
+3585-3632
+3634
+3635
+3648-3654
+3663
+3674
+3675
+3713
+3714
+3716
+3719
+3720
+3722
+3725
+3732-3735
+3737-3743
+3745-3747
+3749
+3751
+3754
+3755
+3757
+3758
+3760
+3762
+3763
+3773
+3776-3780
+4256-4293
+4304-4342
+4352-4441
+4447-4514
+4520-4601
+7830-7834
+8016
+8018
+8020
+8022
+8114
+8116
+8118
+8119
+8130
+8132
+8134
+8135
+8146
+8147
+8150
+8151
+8162-8164
+8166
+8167
+8178
+8180
+8182
+8183
+8204-8207
+8234-8238
+8298-8303
+12295
+12321-12329
+12363-12386
+12389-12418
+12425-12429
+12431-12436
+12459-12482
+12485-12514
+12521-12525
+12528-12538
+12549-12588
+12593-12686
+13312-40869
+63744-64046
+LCNMCHAR
+45
+46
+UCNMCHAR
+45
+46
+NAMECHAR
+168
+175
+180
+184
+688-734
+736-745
+768-837
+864
+865
+890
+900
+901
+1155-1158
+1369
+1456-1465
+1467-1469
+1471
+1473
+1474
+1611-1618
+1632-1641
+1648
+1750-1768
+1770-1773
+1776-1785
+2305-2307
+2364
+2366-2381
+2385-2388
+2402
+2403
+2406-2415
+2433-2435
+2492
+2494-2500
+2503
+2504
+2507-2509
+2519
+2530
+2531
+2534-2543
+2562
+2620
+2622-2626
+2631
+2632
+2635-2637
+2662-2673
+2689-2691
+2748
+2750-2757
+2759-2761
+2763-2765
+2790-2799
+2817-2819
+2876
+2878-2883
+2887
+2888
+2891-2893
+2902
+2903
+2918-2927
+2946
+2947
+3006-3010
+3014-3016
+3018-3021
+3031
+3047-3055
+3073-3075
+3134-3140
+3142-3144
+3146-3149
+3157
+3158
+3174-3183
+3202
+3203
+3262-3268
+3270-3272
+3274-3277
+3285
+3286
+3302-3311
+3330
+3331
+3390-3395
+3398-3400
+3402-3405
+3415
+3430-3439
+3633
+3636-3642
+3655-3662
+3664-3673
+3761
+3764-3769
+3771
+3772
+3784-3789
+3792-3801
+8125-8129
+8141-8143
+8157-8159
+8173-8175
+8189
+8190
+8400-8417
+9332-9340
+9352-9360
+9450
+12330-12335
+12441-12446
+12540-12542
+NAMECASE   GENERAL    YES
+           ENTITY     NO
+DELIM      GENERAL    SGMLREF
+          SHORTREF   SGMLREF
+160-167
+169-174
+176-179
+181-183
+185-191
+215
+247
+884
+885
+894
+903
+1154
+1370-1375
+1417
+1470
+1472
+1475
+1523
+1524
+1548
+1563
+1567
+1642-1645
+1748
+1769
+2365
+2384
+2404
+2405
+2416
+2546-2554
+2674-2676
+2749
+2768
+2877
+2928
+3647
+3759
+3782
+3804
+3805
+4347
+8192-8238
+8240-8262
+8298-8304
+8308-8334
+8352-8362
+8448-8504
+8531-8578
+8592-8682
+8704-8945
+8960
+8962-9082
+9216-9252
+9280-9290
+9312-9331
+9341-9351
+9361-9449
+9472-9621
+9632-9711
+9728-9747
+9754-9839
+9985-9988
+9990-9993
+9996-10023
+10025-10059
+10061
+10063-10066
+10070
+10072-10078
+10081-10087
+10102-10132
+10136-10159
+10161-10174
+12288-12294
+12296-12320
+12336-12343
+12351
+12539
+12688-12703
+12800-12828
+12832-12867
+12896-12923
+12927-12976
+12992-13003
+13008-13054
+13056-13174
+13179-13277
+13280-13310
+64297
+64830
+64831
+65072-65092
+65097-65106
+65108-65126
+65128-65131
+65279
+65281-65295
+65306-65312
+65339-65344
+65371-65374
+65377-65381
+65392
+65438
+65439
+65504-65510
+65512-65518
+65533
+NAMES           SGMLREF 
+
+QUANTITY        SGMLREF         -- To be determined --
+        ATTSPLEN        1920    -- ?? --
+        LITLEN          240     -- ?? --
+        NAMELEN         240     -- ?? --
+        PILEN           1920    -- ?? --
+        TAGLEN          1920    -- ?? --